Steven: Wechselnder Header auf jeder Seite

Hallo Freunde!

Ich arbeite gerade an einer Homepage und möchte, dass auf jeder Seite ein neues Header-Bild (immer die selben Maße) zu sehen ist.

Im Netz bin ich auf dieses PHP Snippet gestoßen, das ja sehr vielversprechend aussieht:

<?php  
if(is_page()) {  
$page_name = $post->post_name;  
$image_name = 'header-'.$page_name;  
}  
if(!file_exists(TEMPLATEPATH.'/images/'.$image_name.'.jpg')) {  
$image_name ='header-image';  
}  
echo '<img src="'.get_bloginfo('template_url').'/images/'.$image_name.'.jpg" alt="'.$image_name.'" />';  
?>

Ich habe meine Dateien in die entsprechenden Ordner verschoben.
Mein Problem ist hier $page_name. Dieses Snippet scheint für Wordpress geeignet zu sein, aber ich habe keine Ahnung, wie ich meinen Seiten einen Namen oder etwas zuordnen kann, der dann dadurch abgerufen wird.

Ich binde meine Seiten dynamisch mit php-include ein.

Kann mir vielleicht jemand helfen?

  1. hi,

    Mein Problem ist hier $page_name. Dieses Snippet scheint für Wordpress geeignet zu sein, aber ich habe keine Ahnung, wie ich meinen Seiten einen Namen oder etwas zuordnen kann, der dann dadurch abgerufen wird.

    Da wissen aber Deine Besucher mehr:
    Sie rufen einen URL auf und der ist eindeutig :)

    MfG

    1. hi,

      Da wissen aber Deine Besucher mehr:
      Sie rufen einen URL auf und der ist eindeutig :)

      MfG

      Nun, natürlich, aber das sehe ich ja auch. Wie setzte ich diesen namen aber in meinem Snippet um?

      Wenn ich Beispielsweise die Seite
      http://test.de/?page=welcome
      habe, wie bringe ich dem Snippet bei, dass "welcome" der Seitenname ist, worauf sich $page_name also beziehen soll?

      1. hi,

        Wenn ich Beispielsweise die Seite
        http://example.com/?page=welcome
        habe, wie bringe ich dem Snippet bei, dass "welcome" der Seitenname ist, worauf sich $page_name also beziehen soll?

        Das findest Du in $_GET['page'] => 'welcome'

        MfG

        1. hi,

          Wenn ich Beispielsweise die Seite
          http://example.com/?page=welcome
          habe, wie bringe ich dem Snippet bei, dass "welcome" der Seitenname ist, worauf sich $page_name also beziehen soll?

          Das findest Du in $_GET['page'] => 'welcome'

          MfG

          Hallo.

          Danke erst einmal. Ich habe damit jetzt mal ein wenig rumgespielt, bekomme aber nur eine Fehlermeldung. Ich bin in php noch nicht so sehr bewandert. Laut meinem verständnis müsste das Snippet dann in etwa so aussehen, oder?

          <?php  
          if(is_page()) {  
          $page_name = $page;  
          $_GET['page'] => 'welcome';  
          $image_name = 'header-'.$page_name;  
          }  
          if(!file_exists(TEMPLATEPATH.'/images/'.$image_name.'.jpg')) {  
          $image_name ='header-image';  
          }  
          echo '<img src="'.get_bloginfo('template_url').'/images/'.$image_name.'.jpg" alt="'.$image_name.'" />';  
          ?>
          

          Dann bekomme ich allerdings einen Fehler:

          Parse error: syntax error, unexpected '=>' (T_DOUBLE_ARROW) in ...

          Zudem will ich den $page_name ja dynamisch haben, also dass er sich je nach Seite mit-ändert ('welcome', 'about', eben je nachdem wie die Seite benannt wurde).

          1. Dir fehlen Grundlagen.

            Step 0: Es ist ganz unmodern, zu senden bevor das "not tut"

            <?php ob_start(); ganz! oben! ?>  
            
            

            Step 1:
            Der Name der Seite steht also in $_GET['page']. Nehmen wir mal an, das sei 'FOO'. (http://hostname/?page=FOO) + (GROSS-klein ist wichtig)

            Step 2:
            Eine gute Idee ist esin dem Fall, die passende Grafik als 'FOO.jpg' bereit zu halten.
            Du brauchst auch den Ordner mit den Grafiken (den musst Du selbst anlegen):

            define('PicsDir', '/var/www/htdocs/pics/');  
            
            

            Step 3:
            Eine gute Idee ist es, falls was nicht klappt, eine 'DEFAULT.jpg'  bereit zu halten.

            define('DefaultHeaderPic', '/var/www/htdocs/pics/DEFAULT.jpg');  
            
            

            und eine nette Funktion:

            function getHeaderPic() {  
              if (  
                 (! isset($_GET['page'])      # ?page=FOO fehlt.  
                 or $_GET['page'] == '';      # ?page= in URL  
              ) {  
                 return(DefaultHeaderPic);  
              }  
              
              # Jetzt musst Du noch "putzen", sonst gibt jemand was wie '?page=cat+/etc/passwd+FOO' an:  
              $arVerboten=array('`', '|', '../', '\\', '/', '<', '>',);  
              $s=str_replace($arVerboten, $_GET['page']);  # Wir ersetzen das Verbotene durch Nichts  
              if ($s != $_GET['page']) {                   # Und schauen ob das eine gute Idee war:  
                  # Da hat jemand was versucht und soll belohnt werden:  
                  header('HTTP/1.0 404 Not Found'); # "schmeisst" ohne das ob_start() ganz oben eine Notiz oder einen Fehler  
                  die ('Netter Versuch!');  
              }  
              
              $filename = PicsDir . $s . '.jpg';  
              if ( (! is_file($filename)) || (! is_readable($filename)) ) {  
                # Wenn es die Grafik nicht gibt oder die nicht lesbar ist:  
                 return(DefaultHeaderPic); # Ha! Das Default-Bild!  
              } else {  
                 # Jawoll! Die Datei /var/www/htdocs/pics/FOO.pic wurde verlangt, ist vorhanden und lesbar:  
                 return ($filename);  
              }  
              
            }  
            
            

            Zur Verwendung: Einfach unter dem irgendwo:

            <div id="header">  
              <img src="<?php getHeaderPic(); ?>">  
            </div> 
            

            eintippen.

            Falls Du ein CMS verwendest kann es sein, dass Du noch ein paar Dinge beachten musst. Wenn Du aber so tief reingreifst, dann solltest Du das nur dann tun, wenn Du es kannst.

            Ich empfehle PHP von Grund auf zu lernen, aber da bist Du gerade dabei - oder?

            Jörg Reinholz

            1. TAUSEND Dank schonmal!!!

              Dir fehlen Grundlagen.

              Ich weis... ;)

              Falls Du ein CMS verwendest kann es sein, dass Du noch ein paar Dinge beachten musst. Wenn Du aber so tief reingreifst, dann solltest Du das nur dann tun, wenn Du es kannst.

              Die Seite funktioniert auf Wordpress-Basis.

              Ich habe den Code eingebunden und an meine Datei-Namen, Unterordner angepasst, allerdings gibt er mir jetzt immer einen Fehler raus:

              Parse error: syntax error, unexpected ';' in [...] on line 14

              Line 14 ist die hier:

              or $_GET['page'] == '';  
              
              

              Hilfe... ^^;

              Ich empfehle PHP von Grund auf zu lernen, aber da bist Du gerade dabei - oder?

              Jörg Reinholz

              Und ja, ich bin gerade dabei, mein php-Wissen auszubauen bzw. es mir von der Pieke auf anzueignen. Leider geht das neben der Arbeit nicht so leicht.

              1. Parse error: syntax error, unexpected ';' in [...] on line 14

                Line 14 ist die hier:

                or $_GET['page'] == '';

                
                >   
                > Hilfe... ^^;  
                  
                  
                if (  
                     (! isset($\_GET['page'])     # ?page=FOO fehlt.  
                     or $\_GET['page'] == ''      # ?page= in URL  
                  ) {  
                     return(DefaultHeaderPic);  
                  }  
                  
                War ein Typo. Klammern treten (außerhalb von Strings) stets paarweise auf...
                
                1. Parse error: syntax error, unexpected ';' in [...] on line 14

                  Line 14 ist die hier:

                  or $_GET['page'] == '';

                  
                  > >   
                  > > Hilfe... ^^;  
                  >   
                  >   
                  > if (  
                  >      (! isset($\_GET['page'])     # ?page=FOO fehlt.  
                  >      or $\_GET['page'] == ''      # ?page= in URL  
                  >   ) {  
                  >      return(DefaultHeaderPic);  
                  >   }  
                  >   
                  > War ein Typo. Klammern treten (außerhalb von Strings) stets paarweise auf...  
                    
                  Hab das Semikolon auch schon mal weg gehabt, aber dann kommt ein fehler wegen des { im obigen Code.
                  
                  1. Hallo,

                    Hab das Semikolon auch schon mal weg gehabt, aber dann kommt ein fehler wegen des { im obigen Code.

                    schau mal, ob es so passt

                      
                    if (  
                         (! isset($_GET['page'])     # ?page=FOO fehlt.  
                         or $_GET['page'] == '')      # ?page= in URL  
                      ) {  
                         return(DefaultHeaderPic);  
                      }  
                    
                    

                    Du musst auf deine () achten.

          2. Hallo,

            $_GET['page'] => 'welcome';

            Das ist kein gültiger PHP-Code. Gemeint war, dass du mittels $_GET['page'] auslesen kannst, welcher page-Parameter gerade in der URL steht.

            http://php.net/manual/de/reserved.variables.get.php

            Beliebige Eingabedaten solltest du allerdings nie direkt ausgeben oder ungefiltert für Dateinamen verwenden, das würde eine Sicherheitslücke öffnen.

            Am einfachsten und sichersten ist es, einen assoziativen Array mit allen möglichen Bildern anzulegen. In diesem Array suchst du mithilfe von $_GET['page'] oder auch der kompletten Adresse (z.B. $_SERVER['REQUEST_URI']) das zugehörige Bild heraus.

            $bilder = array(  
              'foo' => 'foo.jpg'  
            );  
              
            $bild = $bilder[ $_GET['page'] ];  
            if ([link:http://de3.php.net/manual/de/function.isset.php@title=isset]($bild)) {  
              // Benutze das Bild  
            }
            

            Du könntest auch einen nicht-assoziativen Array mit den möglichen Seiten/Bildern vorhalten, eine sogenannte Whitelist. Die Bilder könnten genauso heißen wie die Seiten (z.B. »about.jpg«, »welcome.jpg«). Du prüfst dann nur, ob im Array ein Eintrag existiert; die Bild-URL ergibt sich.

            Mathias

            1. Am einfachsten und sichersten ist es, einen assoziativen Array mit allen möglichen Bildern anzulegen. In diesem Array suchst du mithilfe von $_GET['page'] oder auch der kompletten Adresse (z.B. $_SERVER['REQUEST_URI']) das zugehörige Bild heraus.

              $bilder = array(

              'foo' => 'foo.jpg'
              );

              $bild = $bilder[ $_GET['page'] ];
              if (link:http://de3.php.net/manual/de/function.isset.php@title=isset) {
                // Benutze das Bild
              }

              
              >   
              > Du könntest auch einen nicht-assoziativen Array mit den möglichen Seiten/Bildern vorhalten, eine sogenannte Whitelist. Die Bilder könnten genauso heißen wie die Seiten (z.B. »about.jpg«, »welcome.jpg«). Du prüfst dann nur, ob im Array ein Eintrag existiert; die Bild-URL ergibt sich.  
              >   
              > Mathias  
                
              Ich bin wirklich sehr grün, sorry. :(  
                
              Wie würde denn das arrey in mein Snippet eingebaut, bzw. was würde wegfallen/ersetzt werden?
              
              1. Hallo,

                Wie würde denn das arrey in mein Snippet eingebaut, bzw. was würde wegfallen/ersetzt werden?

                Das Snippet ist für Wordpress gedacht, wie du schon bemerkt hast. Am besten schmeißt du es weg, da du anscheinend kein Wordpress verwendest.

                Ich möchte nicht unhöflich oder demotivierend sein, aber ich denke, dass es so nichts wird.

                Wenn du schnell Erfolge sehen möchtest, so frage einen Fachkundigen, der das Script für dich schreibt und einbaut. Jemanden, dem du genau erzählen kannst, was du vorhast, der Zugriff auf die fraglichen Dateien, PHP-Scripte und den Server hat. Das ist hier im Forum sehr schwer möglich und würde tagelang dauern, während denen wir stille Post spielen, dir irgendwelchen Code senden, du baust ihn ein, es kommt zu Fehlern usw. usf.

                Wenn du verstehen willst, was da vor sich geht, dann musst du dir gewisse Programmier- und PHP-Grundlagen aneignen. Zum Beispiel mit einem aktuellen Buch und der PHP-Dokumentation.

                Grüße,
                Mathias

                1. Hallo

                  Das Snippet ist für Wordpress gedacht, wie du schon bemerkt hast. Am besten schmeißt du es weg, da du anscheinend kein Wordpress verwendest.

                  Oh, ich verwende Wordpress unter anderem. Die Extra-Seiten sind nur nicht mit Wordpress erstellt.

                  Ich möchte nicht unhöflich oder demotivierend sein, aber ich denke, dass es so nichts wird.

                  Wenn du schnell Erfolge sehen möchtest, so frage einen Fachkundigen, der das Script für dich schreibt und einbaut. Jemanden, dem du genau erzählen kannst, was du vorhast, der Zugriff auf die fraglichen Dateien, PHP-Scripte und den Server hat. Das ist hier im Forum sehr schwer möglich und würde tagelang dauern, während denen wir stille Post spielen, dir irgendwelchen Code senden, du baust ihn ein, es kommt zu Fehlern usw. usf.

                  Wenn du verstehen willst, was da vor sich geht, dann musst du dir gewisse Programmier- und PHP-Grundlagen aneignen. Zum Beispiel mit einem aktuellen Buch und der PHP-Dokumentation.

                  Ich bin dran. Ist nur während der Arbeit nochmal ein hartes Stück, dass auch noch zu machen, leider. :(

                  Dürfte ich noch auf eine letzte Hilfestellung hoffen? Ich habe meinen Code jetzt mal etwas durcheniander geworfen, dass er tatsächlich funktioniert. Allerdings wollte ich eine else-Kondition einbauen, damit auf nicht definierten Seiten ein default-Bild angezeigt wird, und sobald ich das tue, kommen nur noch Fehlermeldungen:

                  <?php  
                  define('DefaultHeaderPic', '/wp-content/themes/SWE01/images/header/welcome.jpg');  
                    
                  if(is_page()) {  
                  $image_name = $_GET['page'];  
                  }  
                    
                  if(!file_exists(TEMPLATEPATH.'/images/header/'.$_GET['page'].'.jpg')) {  
                  }  
                  echo '<img src="'.get_bloginfo('template_url').'/images/header/'.$_GET['page'].'.jpg" width="100%" />';  
                    
                  ?>
                  
                  1. Hello,

                      
                    
                    > echo '<img src="'.get_bloginfo('template_url').'/images/header/'.$_GET['page'].'.jpg" width="100%" />';  
                    >   
                    > ?>
                    
                    

                    Das sieht gefährlich aus!

                    Einen GET-Parameter direkt in einen Pfad eizubauen, ergibt meistens eine Sicherheitslücke.
                    Mit etwas Geschick kann man so den gesamten für PHP zugänglichen Datenträger auslesen.

                    Liebe Grüße aus dem schönen Oberharz

                    Tom vom Berg

                    --
                     ☻_
                    /▌
                    / \ Nur selber lernen macht schlau
                    Die ultimative Seite für Selbermacher
          3. hi,

            Das findest Du in $_GET['page'] => 'welcome'

            Tutorial-Code ;)

            Tatsächlich musst Du wegen der Seite keinen Parameter mitschleifen, die Seite selbst ist im URI eindeutig bezeichnet, das ist ein Parameter völlig überflüssig.

            Der nächste Punkt: Betrachten wir das, was in Deine Seite reinsoll, als Attribut. Brauchen wir dafür einen Parameter? Klares nein, das regeln wir intern!

            Im Grunde genommen gehts um die Konfiguration, dafür lohnt es sich auch aus anderen Gründen, eine Tabelle anzulegen:

            [/foo.html]
            header=Foo

            [/boo.html]
            header=Boo

            Für solche, in INI-Dateien abgelegte Tabellen gibt es eine prima Funktion, da hast Du dann alles auf einem Array.

            Jetzt brauchst Du nur noch ein Stückchen Code was in das Array reinguckt und sieht was da zu tun ist.

            Das war die Pflicht, jetzt kommt die Kür :)

            [/foo.html]
            header=Foo
            footer=FooBar
            class=Universal
            template=foo.tmpl
            title=Viele bunte Bilder

            Wow, es könnte auch weitere Attribute geben und: Deine Seite kann wachsen, spätere Erweiterungen sind im Handumdrehen eingebaut. Und so ganz nebenbei hast Du mit einer solchen Konfigurationsdatei auch selbst den Überblick...

            Schönen Sonntag!

            --
            Photo Publisher Visual as modern art of content management.