Auf Verzeichnisnamen basierende, automatische Navigation mit PHP

Jemand der eine Seite hat, auf der er des öfteren die gesamte Dateistruktur umstellt, der wird es hassen, jedesmal alle Verweise auf den Seiten anzupassen. So müsste man die ganze Hauptnavigation umschreiben wenn man zum Beispiel ein Forum in einen Unterordner namens "Interaktion" verschieben möchte.

Lösung: Man schreibt ein PHP-Skript das selbstständig erkennt welche Seiten sich wo befinden und auch gleich selbst eine Liste von Links erstellt, die darauf zeigen. Das geht eigentlich ganz simpel: Man lässt das Skript mit readdir ein Verzeichnis auslesen und listet die Dateien die darin liegen dann einfach auf.

Dieses Prinzip kann man leicht weiterentwickeln, zum Beispiel indem man Dateien die mit einem Unterstrich oder Punkt beginnen nicht anzeigt, jene mit einem Minus am Anfang nur angemeldeten Personen (zB: -abmelden.php) und solche mit einem Plus nur den nicht angemeldeten Benutzern (z.B.: +anmelden.php).

Außerdem könnte man Unterverzeichnisse als ausgeklappte Untermenüs anzeigen oder sogar eine Baumstruktur die den Weg nachvollziehbar macht den der Besucher zurückgelegt hat, um zur aktuellen Seite zu gelangen.

Genug der Worte hier der einfache Code:

<?php
    $pf = './'; //auszulesendes Verzeichnis. Schrägstrich am Ende!
    $vz = opendir($pf);

    $a = '';
    while ($vi = readdir($vz)) {
        if ($vi != '.' && $vi != '..') {
            $a .= '<a href="'.$pf.$vi.'">'.$vi.'</a><br>';
        }
    }
    echo $a;
?>

Als $pf kann man hier jedes beliebige Verzeichnis angeben, ./ steht für das Verzeichnis, indem sich das Skript befindet.

Wer natürlich nicht will, das die Dateiendungen dabei stehen, der kann sie mit str_replace(".php","",$vi); rausmachen lassen, und in der Navigation will man villeicht auch große Anfangsbuchstaben, dafür gibts auch eine PHP-Funktion: ucfirst($vi);

Wer verschiedene Dateiendungen hat, wird daran nicht vorbeikommen entweder jede explizit rauslöschen zu lassen, oder er schreibt eine explode('.', $vi); die den Dateinamen in Fragmente zerlegt und baut diese dann mit implode wieder zusammen, nur löscht er halt das letzte - die Dateiendung - vorher aus dem Array der von der explode zurückgegeben wird.

Kommentare

unkie
unkie am Samstag, 25. Juni 2005 um 09:26

ganz nett ;) Aber nicht immer brauchbar ;) ! Warum denn auch feste links nehmen? Man kommt meist auch recht gut um statische links drum her rum ;) Deins ist aber ganz gut wenn man ein Verzeichnis auf seine Webseite einlesen will ;)

unkie
unkie am Samstag, 25. Juni 2005 um 09:27

Naja vllt würde ich das ganze am ende nochmal als html-datei speichern und dann den code daoben für andere unzugänglich machen ;) Sonst weiß jeder genau wie deine dateien heißen, weil du uns ja nicht sagst wie wie es machen können, dass datei mit bestimmten Anfängen nicht angezeigt werden

Sry für 2 comments aber max ist 500 Zeichen

blackfeet
blackfeet am Samstag, 25. Juni 2005 um 20:30

Nette idee die aber nur begrenzt einsetzbar ist.

Schlecht wird es beispielsweise bei Menüpunkten die ein Leerzeichen enthalten. Man hat villeicht nicht immer nur so kurze Menüpunkte. Wie siehts außerdem mit sortierung der Menüpunkte aus?
Meistens generiere ich das Menü aus einer datenbank, die relative links enthält. Dann habe ich noch eine Globale Variable die den Pfad zu den dateien enthält.

Markus René Einicher
Markus René Einicher am Sonntag, 26. Juni 2005 um 18:38

Ich mach einfach Unterstriche aus den Dateinamen zu Leerzeichen, weil ich nciht glaube das jemand Unterstriche anzeigen will. Ein Hochkomma wird bei mir aus ~~j gemacht, ö is ~~o, ü is ~~u, ä is ~~a usw -- so sind die dateinamen immer sauber.

Markus René Einicher
Markus René Einicher am Sonntag, 26. Juni 2005 um 18:38

Die Sortierung is ganz einfach zu machen: Dateinamen in ein array schmeißen und sort();

Die zweite Antwort von CoP kapier ich nicht.

Bis jetzt war das Skript immer flexibel an alle Herausforderungen anuzpassen so gesehen sag ich ohne vorbehalt es ist immer einsetzbar.

evo
evo am Montag, 27. Juni 2005 um 07:42

Ich würde daraus ja eine Funktion machen ;) Allerdings, brauche ich es nicht :D (Sollte nur ein Tipp sein).

Warden
Warden am Montag, 27. Juni 2005 um 16:21

Versteh ich nich :-)

Spike_php
Spike_php am Sonntag, 10. Juli 2005 um 16:24

man kann auch ganz einfach iene variable ganz am anfang definieren die lautet:
$domain
und die hat den wert der domain und wenn sich was ändern brauch ich nur diese variable ändern.

Markus René Einicher
Markus René Einicher am Freitag, 22. Juli 2005 um 18:09

Spike, ich glaub du hast das Tut nciht ganz verstanden.

Luca Summermatter
Luca Summermatter am Mittwoch, 21. März 2012 um 10:55

Guten Tag

Das ist ein sehr interessantes Skript! Bin im meiner Informatikausbildung, und hätte eine Frage betreffend dem Skript.

Wiso gibts mir nur einen Fehler, "Undefined variable: a in in Line 7"?

MFG Luca

Markus René Einicher
Markus René Einicher am Mittwoch, 21. März 2012 um 12:27

Das ist so gesehen kein Fehler, sondern eine Notiz bei der PHP darauf hinweist dass ich der $a mit .= einen Wert dazuknüpf, obwohl die $a zu dem Zeitpunkt gar nicht existiert. Das erscheinen dieser Notice kann man einfach umgehen indem man die $a deklariert bevor man mit .= Sachen anhängt.

Ich habe das ganze Tut gerade überarbeitet, der neue Code sollte keine Notice mehr verursachen.