Hallo Sven,
Etwas, was ziemlich kompliziert ist, und wesentlich einfacher sein könnte. War ja zu erwarten, das. :)
*schluck*
Die Eckdaten:
Eingangsdatum ist als einziges ein Pfad zur aktuell darzustellenden Datei. Ausgangsdaten sollen Links zu allen übergeordneten Dateien sein, wobei dazu die Index-Seite (URL endet auf Slash) des die aktuelle Seite enthaltenden Verzeichnisses sowie aller übergeordneter Verzeichnisse sein soll. Dass diese Links funktionieren, dafür ist der Webmaster durch Anlegen entsprechender Seiten selbst verantwortlich (eine Prüfung dafür zu integrieren, wäre aber natürlich möglich).
Grundsätzlich gibt es zur Zeit keine anderen Seiten als die Startseite und die aktuell angezeigte Seite. Das könnte sich aber in weiterer Folge noch ändern, da eventuell, je nach Themengebiet, eine allgemein erklärende Seite hinzukommen könnte.
Als Schema:
Der URL- bzw. Dateipfad "includes/javascript/popups/irgendwas.txt" soll zerlegt werden:
[...]
includes "includes/"(Ja, die letzte Stufe ist nicht so wirklich Ideal - aber es geht ums Prinzip, nicht um eine fertig nutzbare Lösung.)
Die würde ja immer durch den Home-Link ersetzt.
Und wenn ich jetzt mal deinen Code kommentiere...
<?php
[...]
$intermediate = explode("/",$string);
Bis hierhin ist alles toll - vielleicht mit Ausnahme des Variablennamens $intermediate - der wäre mir persönlich viel zu lang und zu wenig beschreibend.
Ja, lang isser. :-)
Aber, da ich im Zuge dieser Arbeiten gleichzeitig auch meine Englischkenntnisse ein wenig aufpolieren möchte, versuche ich halt nach Möglichkeit, englische Begriffe zu verwenden.
[...]
Oh, Wahnsinn. Du willst ermitteln, wieviele Elemente sich im Array $intermediate befinden. Wozu gibts eigentlich die Funktion count()? ... :)
Ja, jetzt, wo du es sagst... :o)
Ich kannte diese Funktion noch nicht. *g*
switch($count)
[...]
}Bei Switch ist kein Fall für Werte kleiner als 2 vorgesehen. Und kein Fall für Werte größer als 4.
Das Script wird im Endeffekt noch von einer if-Abfrage umklammert, welche das Script nur dann zur Ausführung kommen lässt, wenn $_GET['content'] gesetzt ist.
Ist $_GET['content'] nicht gesetzt, wird nichts ausgegeben.
Deshalb wird es in dieser Struktur keinen Fall geben, der kleiner als 2 oder größer als 4 ist, es sei denn, jemand ergänzt die URL auf der Startseite händisch durch ...index.php?content=
Sollte man diesen unwahrscheinlichen Fall abfangen?
Warum die einzelnen Werte hier umkopiert werden, ist auch nicht ersichtlich. Die Werte aus $intermediate werden 1:1 in neue Variablen gepackt - schön nach Fällen getrennt.
Weil die Variablen(mit Ausnahme von $temp), abhängig von zutreffenden Fall, unterschiedliche Werte haben können.
$link = strtoupper($link);
Hm, das hier könnte man auch weiter oben schon erledigen - also direkt oben bei $link = "STARTSEITE" anstatt $link="Startseite". Aber du willst ja universelleren Code, und $link wird nicht unbedingt so simpel definiert werden.
In diesem Fall hast du wohl recht, diese Variable wird wohl nirgens anders gebraucht.
Aber das hier:
if ($count>=3)
[...]
}
Warum unterscheidest du hier nochmal zwei Fälle, obwohl du im vorhergehensen switch() doch auch einfach hättest schreiben können:
case 3:
$path = strtoupper($intermediate[1]);
break;
[...]
break;
Wenn ich das gewußt hätte, daß eine derartige Verschachtelung möglich ist, hätte ich es wahrscheinlich gemacht. ;-)
Oder aber, anders ausgedrückt, es fehlte mir am Weitblick... :-)
$temp = str_replace($temp,' <a href="index.php">'.$link.'</a> ',$temp);
Diese Zeile erscheint mir auch etwas stark überfrachtet mit Funktionalität. Gemäß deiner Zeilen weiter oben steht in $temp immer das erste Verzeichnis "includes" drin.
Nein, genaugenommen gibt es exakt zwei Fälle. Einen, bei dem immer includes drinnensteht, aber auch_genau_eine_Seite(Gästebuch), welche in einem anderen Verzeichnis liegt, was aber, genau genommen, nichts an der Intention ändert.
Diese Ersetzung gilt immer. Da egal, was in $temp drinsteht, der gesamte Text immer durch den neuen ersetzt wird, kannst du genausogut auch einfach schreiben:
$temp = ' <a href="index.php">'.$link.'</a> ';
Und fertig.
$file = str_replace($file,$title,$file);
Hier genau dasselbe. Du tauscht in der Variablen $file den Komplettinhalt der Variablen $file gegen den Inhalt der Variablen $title.
Einfacher: $file = $title;
Noch einfacher: Es weglassen, und einfach $title verwenden.
*hmpf*
So einfach könnte es sein, wenn man es schaffen würde, strukturiertes Denken einfach an und abzuschalten...
switch($count)
{
case 2:Und hier verzweigst du wieder je nach Anzahl der gefundenen Bestandteile, wie schon zuvor oben.
Das könnte man insgesamt auch stark vereinfachen, indem man wirklich nur einmal verzweigt, und jeweils alle notwendigen Aktivitäten zur Ausgabe einer Brotkrumennavigation für die jeweilige Stufe ausgibt.
Das verstehe ich nicht. Was meinst du damit?
[...]
In Code umgesetzt:<?php
Error_Reporting(E_ALL);
$link = "Startseite";
$title = "Das ist ein Seitentitel"; //wird später aus Array ausgelesen.c
$string ="includes/javascript/popups/irgendwas.txt";$pfad = explode("/",$string); // ein schön kurzer, bezeichnender Arrayname ;)
echo ' <a href="index.php">'.$link.'</a> ';
for ($i=1; $i<count($pfad); $i++)
{
if ($i < count($pfad))
{
echo " » ".strtoupper($pfad[$i]);
}
else
{
echo " » ".$title;
}
}
?>Und fertig. Sollte (ich habe es nicht 100% geprüft - und insbesondere den Code nicht getestet) so ungefähr dasselbe ausgeben, wie dein Code auch - nur eben wesentlich kürzer und übersichtlicher.
Ja stimmt, kürzer ist ein Hilfsausdruck. ;-)
Ich habe das Beispiel mal getestet, es funktioniert aber so nicht. Es wird immer der gesamte Pfad ausgegeben, der else-Zweig wird ignoriert. Testweise habe ich ihn entfernt, keine Auswirkung.
Dann hab ich mal überlegt: count($pfad)_muss_beim Zählen bei 2 beginnen, d.h. wenn count($pfad) bei 3 ist, ist $i 2.
deshalb wird immer der if-Teil ausgeführt.
Denn wenn count($pfad) bei 0 beginnen würde, wäre $i in der if-Abfrage immer um eins größer als count, weshalb immer der else-Zweig angesprungen werden müsste.
Hab ich da einen Knoten in meinen Überlegungen???
Denn sonst ist nachfolgendes für mich nicht erklär-/erfassbar:
Ich habe die if-Abfrage folgendermaßen abgeändert, und so funktioniert es:
if ($i < count($pfad)-1)
In dieser Konfiguration wird beim letzten Teil auf else verzweigt.
Und (großes Plus): Da eine Brotkrumennavigation wenig Sinn macht, wenn man die einzelnen Links nicht auch anklicken kann: Hier hast du jetzt eine einzige Zeile, die für die Ausgabe der (jetzt noch nicht) Links zuständig ist (direkt nach dem IF). Dort kannst du deinen Link zusammenbasteln.
Beispiel: Wenn du einen Link der Form href="/includes/pfad/subpfad/" je nach Bedarf zusammensetzen willst, dann böte sich dafür folgendes an:
echo " $raquo; <a href="/".implode("/",array_slice($pfad,0,$i+1))."/">".strtoupper($pfad[$i])."</a>";
Ja, das ist ein starker Tobak - PHP hat so viele wunderbare Funktionen, die einem viel Arbeit abnehmen.
Ja, das_ist_starker Tobak. :)
Ich hab mal ein wenig rumgespielt und dabei hat mich anfänglich verwirrt, daß, egal, wie ich die Werte verändere, immer der gesamte Pfad ausgegeben wird. Erst, als ich in die Statuszeile schaute, hat sich das Missverständnis geklärt. *g*
array_slice gibt einen Teil eines Arrays als Array zurück. Die drei Parameter sind: 1. Das große Array, 2. Das Startelement, 3. Die Anzahl der Elemente.
Und dieses Teilarray wird mit implode() wieder zu einem String zusammengebacken.
Schau dir im Zweifel einfach mal die Beispiele bei php.net an, um zu verstehen, was da bei array_slice passiert. http://de2.php.net/manual/de/function.array-slice.php
Die Beispiele dort sind mir leider in der Regel zu theoretisch, die kann ich meist nicht umsetzen. Deshalb probiere ich auch immer rum. ;-)
Und wenn jetzt noch Klarheiten bestehen: Die kriege ich auch noch weg. :)
recht viel Arbeit haste damit nimmer... :o)
Danke dir!
Gruß
Kurt
"Wenn wir einmal nicht grausam sind, dann glauben wir gleich, wir seien gut." (Kurt Tucholsky; dt. Schriftsteller u. Satiriker; 1890-1935)
http://elektro-dunzinger.at
http://shop.elektro-dunzinger.at