Navi includen – ohne Deppenlink

Wer kennt das nicht: Die Navigation einer bestehenden Site ändert sich und nun muss die Änderung bei wirklich jeder Seite eingetragen werden. Nervig und zeitaufwändig!

Eine Menge Zeit spart man sich wenn man die navi per include einbindet. Diese Methode ist relativ simpel und effektiv. Man führt die Änderung an einer Datei durch und fertig.

Man hat zwar noch den Deppenlink (Link der auf sich selber zeigt), aber was soll’s.

In diesem, auch für PHP-Vollpfosten geeigneten Tutorial beschreibe ich euch, wie ihr die navi includet und trotzdem den Deppenlink vermeidet.

So sieht euer Menü normalerweise aus:

  • <div id="navi">
  • <ul>
  • <li><strong>Startseite</strong></li>
  • <li><a href="leistungen.htm">Leistungen</a></li>
  • <li><a href="team.htm">Team</a></li>
  • </ul>
  • </div>

Wie es sich gehört ist das Menü eine ungeordnete Liste. Bei der aktuellen Seite wurde a gegen strong ausgetauscht, um den Deppenlink zu vermeiden.

Um die navi zu includen, benenne ich die beteiligten Dateien von .htm in .php um. Aus der index.htm wird also index.php, usw.

Wo die ungeordnete Liste mit dem Menü stand trage ich folgendes ein:

  • <div id="navi">
  • <?php include ("navi.php") ?>
  • </div>

Den Inhalt der navi.php, die anstelle von dem, was da vorher stand eingebunden wird werfe ich euch mal direkt vor die Füße:

  • <?php
  • $uri = $_SERVER['REQUEST_URI'];
  • $navi = array(
  • '/' => 'Startseite',
  • '/leistungen' => 'Leistungen',
  • '/team' => 'Team',
  • );
  • echo '<ul>'."\n";
  • foreach ($navi as $href => $text)
  • {
  • echo '<li>';
  • if ($uri == $href)
  • {
  • echo '<strong>'.$text.'</strong>';
  • }
  • else
  • {
  • echo '<a href="'.$href.'">'.$text.'</a>';
  • }
  • echo '</li>'."\n";
  • }
  • echo '</ul>'."\n\n";
  • ?>

Um zu verstehen was wo eingetragen wird, lohnt es sich einmal etwas genauer hinzuschauen.

Zuerst wird in einem array die Adresse root-relativ eingetragen, d.h. es wird vom Wurzelverzeichnis des Webservers ausgegangen, was ja i.d.R. immer / ist.

Rechts daneben steht in Hochkommata der Text des Menüpunktes.

Wenn die angewählte URL gleich der URL des Menüpunktes ist wird a gegen strong ausgetauscht, ansonsten über die else der Link hingeechot.

Das array kann beliebig erweitert werden, je nachdem wieviel Menüpunkte die Navigation hat.

Wenn ihr mehrere Menüs auf eurer Seite habt, braucht ihr z.B. eine topnavi.php, eine seitennavi.php und/oder eine fuss-navi.php. Der Inhalt ist bis auf die Punkte des arrays gleich, ihr müßt nur die richtige PHP-Datei an der richtigen Stelle includen.

Das ist die einfachste Art eines Menüs, welches includet wird. Da ich euch noch mehrere Varianten zur Verfügung stellen will, habe ich alles zum Download in den Ordner include.zip gepackt.

Die enthaltene navi-normal.php ist die hier vorgestellte Variante.

Bei der navi-title.php gibt es zusätzlich den title-Tag für a

Bei der navi-klasse.php hat a noch eine zusätzliche Klasse und die navi-id.php hält für jeden Listenpunkt eine id bereit.

Funktioniert problemlos mit statischen Seiten. Ob das mit einem CMS so ohne weiteres geht glaube ich eher nicht.

Wenn ihr das Gleiche für eine WordPressinstallation wollt, kann ich euch den schönen Artikel von Thomas dazu ans Herz legen.

Von Markus stammt die Ursprungsversion des Scriptes. Heiko hat es verfeinert und David hat mir beim Verstehen des Scriptes geholfen.

Vielen Dank dafür euch dreien!

Ihr habt mir abgesehen von diesem Script schön öfter geholfen. Auch dafür nochmal an dieser Stelle meinen besonderen Dank! Ich habe viel von euch gelernt.

Kategorie: Navigationen, PHP, XHTML/CSS
Schlagworte: , , , , .

Nach oben

24 Antworten auf Navi includen – ohne Deppenlink

  1. Pingback: Einkaufen-in-Tuttlingen

  2. Pingback: if-Frage... - XHTMLforum

  3. Naja, mit einem Content Management System wäre eine solche Aktion gar nicht notwendig. Ansonsten lässt sich das auf (einfachsten) Servern ohne CGI-Unterstützung noch mit Server Side Includes lösen:

    http://httpd.apache.org/docs/2.0/howto/ssi.html

    bzw.

  4. Hubspe sagt am

    Hi,

    sorry wenn ich erst jetzt antworte, aber ich bin grad im Skiurlaub.

    Naja, mit einem Content Management System wäre eine solche Aktion gar nicht notwendig.

    Ich habe mich bei dem Artikel ja vor allem auf statische Seiten bezogen. ;)

    Für den normaler mittelständischer Unternehmer oder Freiberufler, der keine eigene EDV-Abteilung und auch keinen Shop am Laufen hat rechnet sich ein CMS einfach nicht.
    Da ist er mit einer Statischen Site, die ich pflege und auch Änderungen einarbeite wesentlich preisgünstiger dran.

    Gruß
    Klaus

  5. Naja, du kannst dem Kunden ja ein kostenloses opensource-CMS aufspielen. Oder irgendetwas ganz einfaches. Dann muss du nicht immer ran, und der Kunde kann einpflegen, soviel er will.

  6. Hubspe sagt am

    Naja, du kannst dem Kunden ja ein kostenloses opensource-CMS aufspielen. Oder irgendetwas ganz einfaches. Dann muss du nicht immer ran, und der Kunde kann einpflegen, soviel er will.

    meine Kunden sind Freiberufler und kleinere Mittelständler.

    Denen käme es deutlich teurer, wenn ich ein individuelles Layout auf ein CMS wie WordPress z.B. aufsetzen würde.
    Zusätzlich müßte der Kunde ja auch die Schulung bezahlen.

    Von diversen Katastrophen, weil er sich das Layout zerschießt oder er bei größeren Versionssprüngen versucht automatisch upzudaten will ich gar nicht erst anfangen.

    Für diesen Kundenkreis bin ich mit statischen Seiten und Pflege derselben durch mich deutlich schneller und kostengünstiger.

    Gruß
    Klaus

  7. Pingback: Hilfe: navigation included - wie kann man den aktiven men

  8. also mir hat dieser Tipp sehr geholfen, da ich bisher immer nur mit Tricks gearbeitet hab. Ich habe z.B. einen Ordner nav erstellt und dann jedemal einfach eine andere Datei z.B. nav-start.php includet. Bei Änderungen mußte ich dann nur an dieser Stelle rein – das geht dann auch schneller, aber so ist es besser. Danke

  9. Nicolas Odrich sagt am

    soweit ich (bin freizeit php coder) weis, besteht die Uri nicht nur aus der Url, sondern auch aus eventuellen parametern

    www(dot)meinedomain(dot)com/meineseite.php?parameter=wert

    bei Verwendung von $_SERVER['REQUEST_URI'] würde der Teil ab dem ? mitverwertet werden …
    somit bei der abfrage ‘meineseite.php’ == ‘meineseite.php?parameter=wert’ ?

    Ich würde entweder mit $_SERVER['REQUEST_URL'] arbeiten oder $PHP_SELF zurückgreifen dann würde die startseite nicht mit ‘/’ sondern ‘/meineseite.php’ im array stehen

  10. Klaus sagt am

    Moin Nicolas,

    deshalb würde ich sowas auch nur bei ansonsten statischen Seiten verwenden.
    In Verbindung mit einem CMS würde ich die Finger davon lassen.
    Das hätte ich vielleicht in meinem Artikel noch deutlicher rausstellen sollen. :)

  11. Pingback: Hover soll nach draufkilcken auf der verlinkten Seite active bleiben! - XHTMLforum

  12. Heiner sagt am

    Erstmal ein grosses Dankeschön für diese wunderbare Navigation. Genau das was ich gesucht habe und funktioniert soweit auch Bestens. Allerdings greift bei mir irgendwie der “strong” statt “a” Befehl nicht. Habe es auch mit deinen Beispieldateien probiert, will aber einfach nicht laufen. Hier nochmal der Code (nur Text und Links verändert).

    <code><?php
    $uri = $_SERVER['REQUEST_URI'];
    // alle Menüpunkte
    $navi = array(
    ‘test1.php’ => ‘Seite 1′,
    ‘test2.php’ => ‘Seite 2′,
    ‘test3.php’ => ‘Seite 3′,
    );
    echo ‘<ul>’.”\n”;
    foreach ($navi as $href => $text)
    {
    echo ‘<li>’;
    // wenn aufgerufene Seite identisch mit Navi-Link: strong statt Link
    if ($uri == $href)
    {
    echo ‘<strong>’.$text.’</strong>’;
    }
    else
    {
    echo ‘<a href=”‘.$href.’”>’.$text.’</a>’;
    }
    echo ‘</li>’.”\n”;
    }
    echo ‘</ul>’.”\n\n”;
    ?> </code>

    Irgendeine Idee?

    Gruss Heiner

  13. Klaus sagt am

    Hallo Heiner,

    von Heiner:Erstmal ein grosses Dankeschön für diese wunderbare Navigation. Genau das was ich gesucht habe und funktioniert soweit auch Bestens.

    Bitte gerne. :)

    von Heiner:Allerdings greift bei mir irgendwie der “strong” statt “a” Befehl nicht. Habe es auch mit deinen Beispieldateien probiert, will aber einfach nicht laufen.

    mmmh, vielleicht stört er sich daran, das du die Schrägstriche nicht drin hast:
    $navi = array(
    /test1.php’ => ‘Seite 1′,
    /test2.php’ => ‘Seite 2′,
    /test3.php’ => ‘Seite 3′,
    );

  14. Heiner sagt am

    mmmh, vielleicht stört er sich daran, das du die Schrägstriche nicht drin hast:
    $navi = array(
    ‘/test1.php’ => ‘Seite 1′,
    ‘/test2.php’ => ‘Seite 2′,
    ‘/test3.php’ => ‘Seite 3′,
    );

    Klappt leider auch nicht. Er springt dann natürlich ins falsche Verzeichnis. Hab´s dann mit “./” und auch mit einem absoluten Pfad probiert. Leider kein Erfolg :(

  15. Klaus sagt am

    von Heiner:
    Klappt leider auch nicht. Er springt dann natürlich ins falsche Verzeichnis. Hab´s dann mit “./” und auch mit einem absoluten Pfad probiert. Leider kein Erfolg

    gib doch mal einen Link zur Seite, das kann eigentlich nicht viel sein.
    Bei mir läufts auf mehreren Sites problemlos.

    Ein CMS ist nicht im Spiel, oder? :)

  16. Heiner sagt am

    Nope, kein CMS im Spiel! Vertrete in der Hinsicht den selben Standpunkt wie du.

    Da ist er mit einer Statischen Site, die ich pflege und auch Änderungen einarbeite wesentlich preisgünstiger dran.

    Hier ist mal der Link zu deinem Beispiel, hier das ganze als .zip und hier die Site wo das Ganze letztendlich laufen soll (die beiden oberen Navigationen sind bereits includet).

    p.s. Bin ab morgen bis Sonntag erstmal unterwegs, also bitte nicht wundern wenn ich mich vorher nicht melde.

  17. Klaus sagt am

    ehrlichgesagt verstehe ich im Moment nicht so recht warum es nicht funktioniert. Irgendwie hab ich da grad ein Brett vor dem Kopf.

    Stell dein Problem doch mal im XHTML-Forum bei den serverseitigen Scripten vor.
    Am Besten mit Link zur Seite und dem PHP-Script im Post.

    Gruß
    Klaus

  18. Mit meinem Leib- und Magen-Editor ersetze ich beliebig viele Zeilen in beliebig vielen Dateien. :-)
    Schönes Blog!

  19. Klaus sagt am

    von Marc: Schönes Blog!

    danke. :)

  20. Nevada sagt am

    Ich bedanke mich für ein derart einfach benutzbares Skript. Es ist genau das, wonach ich gesucht habe.

    Meine Navigationsliste wird inline ausgegeben und ich möchte Trenner zwischen die einzelnen Punkte einfügen. Dazu erweitere ich das echo zu ‘</li> |’. Was natürlich hinter dem letzten Listenpunkt auch einen Trenner erzeugt. Gibt es eine Möglichkeit, das auszuschließen?

    • Klaus sagt am

      im herunterladbaren Ordner include.zip befindet sich eine navi-id.php. Da dort jeder Menüpunkt eine id bekommt, kannst du das nutzen, um den letzten Menüpunkt nach Wunsch zu gestalten.
      Z.B. indem alle Menüpunkte einen rechten border bekommen, nur der letzte Menüpunkt bekommt border-right:0;, oder du machst es mit einer HG-Grafik nur der letzte Menüpunkt bekommt keine. ;)

      Du solltest dabei allerdings auch bedenken, dass du bei horizontalen navis die mit display:inline; auf die Reihe gebracht werden nicht so viel Kontrolle über die Darstellung hast.
      Schau dir mal den Link (ab Punkt 10 !) an, dort werden alle möglichen navis erklärt.

      • Nevada sagt am

        Merci, ich bin voll zufrieden.

        Die Darstellung meiner Navigation passt für mich (und getesteterweise im IE auch), aber die Lösung mit float werde ich mir merken – und ggf. mal umbauen.

        Ihr Blog ist gebookmarked :D

  21. Pingback: tageszwerge.de -> Bolithos erste Seite V2.0 - XHTMLforum

  22. Pingback: Peinliche Frage zum Hover-Effekt - XHTMLforum

Sprich und fürchte dich nicht!

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Bitte maskiert < mit &lt; und > mit &gt; sonst verschwinden sie im Nirgendwo!