otto chilly: Flexible Navigation

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]."&amp;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

  1. Moin!

    Dir hilft eine schlichte eineindeutige Nummerierung und die Bindung mittels einer Parent-Id, sowie ein rekursiver Funktionsaufruf

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
    1. 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:

      1. eindeutige Nummerierung
      2. Parent-ID
      3. rekursiver Funktionsaufruf
        ?

      Danke
      otto chilly

      1. Moin!

        Hi fastix

        Was ist/sind:

        1. eindeutige Nummerierung

        Jeder Deiner Einträge, egal ob Link oder Untermenüpunkt erhält eine eindeutige Nummer...

        1. Parent-ID

        Die Nummer des Untermenüpunktes, zu dem der aktuelle Eintrag gehört, gibt es keinen solchen: 0

        1. 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®

        --
        Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
        1. Hi

          Was ist/sind:

          1. 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?

          1. 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?

          1. 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)

          1. 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®

            --
            Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
  2. 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:

    1. 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??

    1. 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...
      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 ;-)

    liebe Grüße mbr

    1. 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?

      1. 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.

      1. 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

  3. 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

    1. 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