Flexible Navigation
otto chilly
- php
0 fastix®0 otto chilly0 fastix®0 otto chilly0 fastix®
0 mbr0 mbr
Abend.
Ich habe versucht, eine flexible Navigation zu entwickeln. Ich nenne dieses Mini-Projekt "NaviFlex".
Ich versuche einmal, das Prinzip zu erklären:
1. Die Datei naviflex.nav sieht so aus:
0|Programmieren|prog.html|1
0|GNU/Linux|linux/index.html|2
1|Entstehungsgeschichte|linux/gesch.html|2
1|Linus Torvalds|linux/linus.html|2
1|Tux|linux/tux.html|2
1|Linux und Ich|linux/self.html|2
0|Sport|sport.html|3
0|Musik|musik.html|4
0|Schüleraustausch|sat/index.html|5
1|SAT 2004|sat/2004DTL.html|5
1|SAT 2004|sat/2004FRA.html|5
1|Frankreichbesuch 2005|sat/2005FRA.html|5
0|Studienfahrt Paris|paris.html|6
0|Meine Lieblingsseiten|links.html|7
0|Projekte|projekte.html|8
0|Beruf|beruf.html|9
0|Meine Schulzeit|schulzeit.html|10
0|Bilder|bilder/index.html|11
1|GNU/Linux|bilder/linux.html|11
1|Sport|bilder/sporthtml|11
1|Musik|bilder/musik.html|11
1|Frankreich|bilder/sat.html|11
1|Projekte|bilder/proj.html|11
1|I, me and myself|bilder/ich.html|11
Alles, was eine 0 vorne stehen hat, ist ein Überpunkt. Die Unterpunkte haben eine 1 vorne. Man kann diese Zahlen also als Ebenen sehen. Die Zahlen ganz hinten dienen dem Nummerieren.
==============================================================
2. Die Datei naviflex.php sieht so aus:
[code lang=php]
<?php
//Naviflex_Sys v1
//Datei öffnen
$dh=fopen("naviflex.nav","r");
//Inhalt der Datei in Array lesen
$inhalt=file("naviflex.nav");
//Erste zwei Zeilen löschen
array_shift($inhalt);
array_shift($inhalt);
// Array aufteilen in mehrdimensionales Array
for($x=0;$x<count($inhalt);$x++){
$inhalt[$x]=explode("|",$inhalt[$x]);
}
// Kompliziertester Teil: Strings formulieren
$x=0;
echo "<ul>\n";
// Anzahl der Überpunkte holen
$faktor1=file_get_contents("naviflex.nav");
$faktor2=(strlen(file_get_contents("naviflex.nav")))-2;
$lasttwo=substr($faktor1, $faktor2);
for($x;$x<=$lasttwo;$x++){
if($inhalt[$x][0]==0){
$sup_menu="<li><a href="?h=".$inhalt[$x][2]."&ak=".$inhalt[$x][3]."">".$inhalt[$x][1]."</a></li>\n";
echo $sup_menu;
}
if($inhalt[$x][0]==1 && $inhalt[$x][3]==$ak){
$sub_menu="<li style="margin-left:5%;"><a href="?h=".$inhalt[$x][2]."">".$inhalt[$x][1]."</a></li>\n";
echo $sub_menu;
}
}
echo "</ul>";
fclose($dh);
?>
Wie ihr seht, werden nur die Punkte bis "Schüleraustausch" widergegeben. Was ich aber vorhabe (und was ihr sicherlich schon bemerkt habt) ist, eine Navigation aufzubauen, bei dem beim Klick auf den Überpunkt die Unterpunkte ohne JS, aber mit PHP, eingeblendet werden.
Was für einen Fehler habe ich übersehen? Ist bestimmt etwas ganz banales, nur ich komme nicht drauf.
Und kann ich das mit der Nummerierung in der Datei naviflex.nav irgendwie umgehen? Weil ich müsste ja dann alle Nummern neu schreiben, wenn ich einen neuen Punkt in der Mitte dazunehmen möchte.
Danke
euer Bundesinnenminister chilly
Moin!
Dir hilft eine schlichte eineindeutige Nummerierung und die Bindung mittels einer Parent-Id, sowie ein rekursiver Funktionsaufruf
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Hi fastix
Dir hilft eine schlichte eineindeutige Nummerierung und die Bindung mittels einer Parent-Id, sowie ein rekursiver Funktionsaufruf
Bin ich wirklich so dumm oder verstehen hier mehrere diesen Text nicht? Ich glaube ersteres...
Was ist/sind:
Danke
otto chilly
Moin!
Hi fastix
Was ist/sind:
- eindeutige Nummerierung
Jeder Deiner Einträge, egal ob Link oder Untermenüpunkt erhält eine eindeutige Nummer...
- Parent-ID
Die Nummer des Untermenüpunktes, zu dem der aktuelle Eintrag gehört, gibt es keinen solchen: 0
- rekursiver Funktionsaufruf
Eine Funktion, welche die Freunbdlichkeit sich selbst aufzurufen (das geht tatsächlich).
Danke
Bitte.
otto chilly
Du bist also der coole, erholte Otto, nicht dieser Terror-ängstliche, selbst Terror verbreitende?
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Hi
Was ist/sind:
- eindeutige Nummerierung
Jeder Deiner Einträge, egal ob Link oder Untermenüpunkt erhält eine eindeutige Nummer...
Ja, aber das hab ich doch. Meinst du nicht in der datei naviflex.nav, sondern dass ich PHP die Elemente nummerieren lasse?
- Parent-ID
Die Nummer des Untermenüpunktes, zu dem der aktuelle Eintrag gehört, gibt es keinen solchen: 0
Also nur dir Überpunkte nummerieren, die Unterpunkte erhalten die Nummer 0?
- rekursiver Funktionsaufruf
Eine Funktion, welche die Freunbdlichkeit sich selbst aufzurufen (das geht tatsächlich).
Und was soll die dann machen? Was soll das bringen?
otto chilly
Du bist also der coole, erholte Otto, nicht dieser Terror-ängstliche, selbst Terror verbreitende?
Ooch, betrachte meinen Nicknamen als Synonym (hoffe das tun alle hier, sonst bekomm ich noch Post vom Staat :-) )
otto chilly (noch Bundesinnenminister)
Moin!
Ein Bleistift sagt mehr als tausend Worte:
ID;ParentId;Objekt
1;0;Wirbellose Tiere
2;0;Wirbeltiere
3;1;Insekten
4;1;Würmer
5;1;Schnecken
6;3;Biene
7;3;Fliege
8;4;Regenwurm
9;2;Vögel
10;9;Amsel
11;2;Säugetiere
12;11;Menschen
13;12;Du
14;12;ich
Der rekursive Funktionsaufruf hat hier den Vorteil, dass Dein Programm Dein Menü und vor allem dessen Strukturtiefe nicht kennen muss... weil die Funktion eben bei jedem gefundenen Kind neu (rekursiv) aufgerufen wird.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Hallo,
hab mir gerade mal deinen Quellcode kopiert und bin am Testen.
(übrigens: wäre schön eine etwas genauere Fehlerbeschreibung zu bekommen und evtl. einen Link auf eine Seite, wo man sich das Ergebnis deiner Bemühungen mal anschauen kann)
So, nachdem ich nun also den Quellcode aus deinem Post 1:1 kopiert habe fällt mir folgendes auf:
//Erste zwei Zeilen löschen
array_shift($inhalt);
array_shift($inhalt);
(ich mein: wozu die dienen ist schon klar, aber _weshalb_ willst du die ersten zwei Zeilen löschen??
liebe Grüße mbr
Hallo
(übrigens: wäre schön eine etwas genauere Fehlerbeschreibung zu bekommen und evtl. einen Link auf eine Seite, wo man sich das Ergebnis deiner Bemühungen mal anschauen kann)
War meine Fehlerbeschreibung nicht genau genug?
- Wozu dienen folgende Zeilen:
//Erste zwei Zeilen löschen
array_shift($inhalt);
array_shift($inhalt);(ich mein: wozu die dienen ist schon klar, aber _weshalb_ willst du die ersten zwei Zeilen löschen??
Oh, ja, da hab ich euch etwas unterschlagen. Über den Zeilen in der naviflex.nav sind noch zwei irrelevante, die habe ich für euch rausgemacht. Kannst also diese Zeilen mit array_shift($inhalt) entfernen.
- Bei mir wird gar nix angezeigt - was daran zu liegen scheint, das die Variable $lasttwo ein leerer String ist und damit die Schleife nur einmal durchlaufen wird und dabei nichts ausgegeben wird...
Bei "echo $lasttwo;" (was ich probeweise gemacht habe) kam "11" heraus. Ich habe mich schon gefragt ob es ein String sein kann, ist das möglich?
Wenn ich noch mehr Zeit habe werd ichs mir in Ruhe anschauen. Soll jetzt nicht hochnäsig klingen, aber ich muss mal schauen, ob ichs noch schaffe ;-)
Ist in Ordnung. Wenn der Thread hier archiviert wird, dann fang ich einfach einen neuen an (sonst schreien gleich alle DOPPELPOSTING ;-) )
Danke
otto chilly
Hallo otto,
ich bins nochmal. Hab jetzt unter http://www.planet-brueckner.de/beispiele/beispiel_007
eine Version eingestellt. Schau doch einfach mal, ob du es dir so vorgestellt hast.
Ich habe extra noch keine Inhalte eingebunden. Dabei solltest du nämlich ziemlich aufpassen. Das Skript gibt über GET die filenamen weiter. Das ist von der Sicherheit her eine der gefährlicheren Sachen und man sollte gut darauf achten, was man dann über include einbindet...
liebe Grüße
mbr
Hi!!
ich bins nochmal. Hab jetzt unter http://www.planet-brueckner.de/beispiele/beispiel_007
eine Version eingestellt. Schau doch einfach mal, ob du es dir so vorgestellt hast.
Du bist der Beste, vielen vielen Dank!!! Eigentlich bin ich es wirklich nicht gewohnt, dass hier gleich einer mir die ganze Arbeit abnimmt, wie komme ich also zu der Ehre?
PS: Was genau hast du jetzt im Quelltext verändert? Das Prinzip ist doch gleich geblieben, du hast nur mehr Klammern eingefügt. Es lag bei mir also nur an flascher Klammerung?
Ich habe extra noch keine Inhalte eingebunden. Dabei solltest du nämlich ziemlich aufpassen. Das Skript gibt über GET die filenamen weiter. Das ist von der Sicherheit her eine der gefährlicheren Sachen und man sollte gut darauf achten, was man dann über include einbindet...
Mit $_SERVER['DOCUMENT_ROOT'];
kann man das Einbinden von externen Dateien vermeiden, und somit nur Dateien vom Server, auf dem sich die Datei befindet, einbinden. Finde ich genial, sowas.
Noch einmal: VIELEN VIELEN VIELEN DANK für das alles. Ich kann immer noch nicht begreifen, warum man mir in diesem Forum auf einmal Code gibt, und dann noch ganze fertige Skripte!
merci
otto chilly