Webmastering

Quelltextgenerierung einer Navigation mit php

Problemstellung

Jeder Webmaster kommt irgendwann an den Punkt, wo er es leid ist, bei einer Änderung seines Webauftrittes auf allen Seiten die Navigation anpassen zu müssen. In den einschlägigen Foren bekommt er dann den Rat "benutze doch php-include".

Dieser gute Rat ist prinzipiell richtig, verrät aber nicht die Lösung von einigen Fragen, die bei einer Auslagerung einer Navigation unweigerlich kommen müssen. Und viele Anwender sind nicht auf anhieb in der Lage die aufkommenden Probleme selbst zu lösen.

Folgende Fragen sind zu klären:

  1. Wenn die Navigation ausgelagert ist, habe ich nur eine Datei. Wie kann ich dann die unterschiedlichen, jeweils aktiven Seiten hervorheben?
  2. Meine Navigation soll in der gesamten Ordnerstruktur funktionieren, auch wenn sie in der dritten oder vierten Ebenen liegt. Geht das?
  3. Bei anderen Scripten habe ich bemerkt, das der generierte Quelltext unleserlich ist, da er in eine Zeile geschrieben wird. Muss das sein?


Problemlösungen

zu Punkt 1:

Um den Menüpunkt der jeweils aktiven Seite getrennt formatieren zu können, muss nur der Link mit der aktiven Seite verglichen werden. Bei einer Übereinstimmung wird dann kein Link generiert, sondern der Menüpunkt in einen span-Tag gesetzt, der dann beliebig formatiert werden kann.

Mit diesem Code ermittel ich die aktuell angezeigte Seite:

$thisPage = substr($_SERVER['PHP_SELF'],1);

In der Variable $thisPage steht damit der Pfad zur aktuellen Seite ohne den führenden Slash. Jetzt muss nur noch jeder Link auf Übereinstimmung mit dieser Variable geprüft und entsprechend ausgezeichnet werden. Das passiert so:

<?php
if($thisPage == $val0) {
   
$nav .= '<span>'.$key0.'</span>';
}
else {
   
$nav .= '<a href="'.$path.$val0.'">'.$key0.'</a>';
}
?>

  • Die Variable $val0 beinhaltet den Linkt aus der Navigation.
  • In der Variable $key0 steht der Linktext.
  • Die Variable $path wird nachfolgend erklärt.
  • Der gesamte generierte Quelltext steht in der Variable $nav.

zu Punkt 2:

Selbstverständlich kann man eine Navigation so generieren, das die Links immer, egal wo sie in der Ordnerstruktur stehen, funktionieren. Dazu braucht man lediglich die "Ordnerebene" zu ermitteln und die Linkadressen in der Navigation je nach Strukturtiefe zu ergänzen. Weiterhin muss man die Linkadressen immer vom Root des Webspaces aus eintragen und zwar (bei meinem Code) ohne den führenden Slash.

Die Ordnerebene ermittel ich so:

$ebene_Anzahl = (count(explode("/", $_SERVER["PHP_SELF"])) - 2);

Jetzt brauche ich nur noch für jede Ordnerebene ein "../" vor die Linkadresse zu setzten, in dieser Schleife schreibe ich die erforderliche Anzahl der "../" in die Variable $path:

$path = '';
for ($i=$ebene_Anzahl; $i>0;$i--) {
$path .= "../";
}

Die Linkzusammensetzung erfolgt dann mit:

$nav .= '<a href="'.$path.$val0.'">'.$key0.'</a>'


zu Punkt 3:

Jeder seriöse Webmaster wird Wert auf einen gut lesbaren und nachvollziehbaren Quelltext legen (schon in eigenem Interesse). Dazu gibt es mehrere Möglichkeiten. Da ich den kompletten Quelltext in eine Variable schreibe und erst am Ende des Scriptes ausgebe muss ich entsprechende Formatierungen in den Quelltext mit einbauen. Dazu definiere ich eine Konstante, die für den Zeilenumbruch und den Start der neuen Zeile am linken Rand zuständig ist:

define ('cr', chr(13).chr(10));

Um die passenden Einrückungen zu bekommen füge ich je "Einrück-Level" eine bestimmte Anzahl von Leerstellen in den Quellcode ein. Das passiert mit diesen Elementen:

$level = 0;
...
++$level;
...
--$level;
...
str_repeat(' ', ($level+1)*4)

Damit habe ich alle wichtigen Fragen geklärt und kann nun alles in einem Script vereinigen.


Das Script

Hier zeige ich jetzt das fertige Script, das alle oben genannten Sachen beinhaltet:

<?php
//Navigations-Array anlegen
$sites = array(
    "Linktext1" => "seite1.php",
    "Linktext2" => "unterordner/seite2.php",
    "Linktext3" => "seite3.php",
    "Linktext4" => "unterordner/unterordner/seite4.php",
);
//Ende des Navigations-Array

//Die Unterebene ausgehend von der index-Datei ermitteln
$ebene_Anzahl = (count(explode("/", $_SERVER["PHP_SELF"])) - 2);
//Die Pfadvariable entsprechend der Unterebene generieren
$path = '';
for ($i=$ebene_Anzahl; $i>0;$i--) { $path .= "../";
}
//Namen der aktuellen Seite (incl. Pfad) ermitteln
$thisPage=substr($_SERVER['PHP_SELF'],1);

//Einrückzähler auf Null setzten
$level = 0;
//cr mit [cr][LF] definieren
define ('cr', chr(13).chr(10));

//Hier Beginnt die eigentliche Quelltext-Generierung
$nav = cr.'<div id="navigation">'.cr.str_repeat(' ', ($level+1)*4).'<ul>'.cr;
++$level;
foreach ($sites as $key0 => $val0) {
$nav .= str_repeat(' ', ($level+1)*4).'<li>';
if($thisPage == $val0) {$nav .= '<span>'.$key0.'</span></li>'.cr;}
else {$nav .= '<a href="'.$path.$val0.'">'.$key0.'</a></li>'.cr;}
}
--$level;
$nav .= str_repeat(' ', ($level+1)*4).'</ul>'.cr.'</div>'.cr;
//Ende der Quelltext-Generierung

echo $nav; //Ausgabe des Quelltextes
?>

Jetzt brauchen nur noch die Linktexte und die Linkadressen in das Navigationarray eingetragen werden. Ein solcher Eintrag muss in der Form: "Linktext" => "Linkadresse", erfolgen (abschließendes "," nicht vergessen). Es gibt keine Begrenzung der Navigationspunkte und sollte mal ein Punkt wegfallen, braucht nur die entsprechende Zeile gelöscht werden.

Ich empfehle dieses Script unter dem Namen "navigation.inc.php" abzuspeichern und auf jeder einzelnen Seite mit dem Befehl: include('navigation.inc.php'); einzubinden.

Ich hoffe, das ich alles verständlich geschrieben habe. Ihr könnt diese Navigation in eurer css-Datei beliebig Formatieren (horizontal, vertikal, Hintergrundfarben, Rahmen, Bilder, ...), probiert es einfach mal aus.