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.
Pingback: Einkaufen-in-Tuttlingen
Pingback: if-Frage... - XHTMLforum
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.
Hi,
sorry wenn ich erst jetzt antworte, aber ich bin grad im Skiurlaub.
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
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
Pingback: Hilfe: navigation included - wie kann man den aktiven men
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
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
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.
Pingback: Hover soll nach draufkilcken auf der verlinkten Seite active bleiben! - XHTMLforum
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
Hallo Heiner,
Bitte gerne.
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
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?
Nope, kein CMS im Spiel! Vertrete in der Hinsicht den selben Standpunkt wie du.
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.
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
Mit meinem Leib- und Magen-Editor ersetze ich beliebig viele Zeilen in beliebig vielen Dateien.
Schönes Blog!
danke.
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?
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.
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
Pingback: tageszwerge.de -> Bolithos erste Seite V2.0 - XHTMLforum
Pingback: Peinliche Frage zum Hover-Effekt - XHTMLforum