aufklappbare Baumstruktur ( Menü ) klappt nicht richtig... Bitte um Hilfe

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • aufklappbare Baumstruktur ( Menü ) klappt nicht richtig... Bitte um Hilfe

    Hallo!

    Folgendes Problem:

    Ich habe eine Verzeichnisstruktur, die z.Zt z.B. so aussieht:

    home
    seite1
    - seite1-1
    - seite1-2
    - - seite1-2-1
    - - seite1-2-2
    - seite1-3
    seite2
    - seite2-1
    seite3
    seite4
    seite5
    - seite5-1
    - seite5-2
    - seite5-3
    - seite5-4
    - - seite5-4-1
    seite6

    Diese Struktur generiert sich aus dem Verzeichnisbaum. In jedem Ordner liegt eine index.php, die aufgerufen werden soll, und die an das Menü mittels $root die Verzeichnistiefe übergibt. Also für die erste Ebene $root="../", für die zweite $root="../../", und für die dritte $root="../../../".
    Allerdings weiß ich nicht, wie ich $root anwenden müsste oder könnte, deswegen wird diese Variable noch nicht genutzt.

    Aus dieser Verzeichnisstruktur soll nun ein aufklappbares Navigationsmenü werden. Bis zur ersten Ebene habe ich es hinbekommen, aber wenn ich mich auf der zweiten Ebene befinde, dann kann ich nicht mehr zurück, mir fehlt dann die erste Ebene.

    Also, wenn ich z.B. auf [seite1] klicke, dann ist noch alles gut, es sieht dann so aus:

    home
    seite1
    - seite1-1
    - seite1-2
    - seite1-3
    seite2
    seite3
    seite4
    seite5
    seite6

    Klicke ich nun z.B. auf die [seite1-2] dann habe ich das:

    seite1-1
    seite1-2
    - seite1-2-1
    - seite1-2-2
    seite1-3

    Ich möchte aber das:

    home
    seite1
    - seite1-1
    - seite1-2
    - - seite1-2-1
    - - seite1-2-2
    - seite1-3
    seite2
    seite3
    seite4
    seite5
    seite6

    Folgenden Code nutze ich
    PHP-Code:

    // hier wird das aktive Verzeichnis ermittelt

    function this_folder_name($path){
           if (!
    $path){$path=$_SERVER['PHP_SELF'];}
           
    $current_directory dirname($path);
           
    $current_directory str_replace('\\','/',$current_directory);
           
    $current_directory explode('/',$current_directory);
           
    $current_directory end($current_directory);
           return 
    $current_directory;
        }
        
    $dir this_folder_name();

    // Ab hier wird die Baumstruktur aufgebaut:
        
        
    $path "../";
        
    $files1 scandir($path);
        
        foreach (
    $files1 as $wert1) { 
                if (
    $wert1!="." && $wert1!=".." && $wert1!="source" && $wert1!="test" && $wert1!="index.php") {
                echo (
    "<a href='../$wert1/'>$wert1</a><br>"); 
                if(
    is_dir($path."/".$wert1) && ($dir == $wert1)) {
                   
    $files2 scandir($path."/".$wert1);
                   foreach (
    $files2 as $wert2) {
                         if (
    $wert2!="." && $wert2!=".." && $wert2!="index.php") {
                              echo (
    "- <a href='../$wert1/$wert2/'>$wert2</a><br>"); 
                              if(
    is_dir($path."/".$wert1."/".$wert2) && ($dir == $wert2)) {
                                  
    $files3 scandir($path."/".$wert1."/".$wert2);
                                  foreach (
    $files3 as $wert3) {
                                  if (
    $wert3!="." && $wert3!=".." && $wert3!="index.php") {
                                      echo (
    "- - <a href='../$wert1/$wert2/$wert3/'>$wert3</a><br>"); 
                                      }
                                  }
                             }
                         }
                    }
                } 
            }
        } 
    Die Aufklappgeschichte funktioniert also noch nicht so richtig, und ich finde das Problem nicht.

    Ich bitte um Hilfe!

    Ihr könnt Euch die Struktur gerne mal runterladen, der Code ist komplett enthalten.
    Angehängte Dateien
    Gruss,

    Volker

  • #2
    such mal bei google nach nested sets, vielleicht erleichtert dir das die arbeit.

    gruß
    peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Hi Peter,

      Danke für die Antwort.
      Ich bin schon über die "Nested Sets" gefallen, auch bei der Suche hier im Forum nach einer Lösung für mein Problem. Wenn ich mich nicht verlesen habe, dann laufen die aber nur mit einer Datenbank, und genau das soll es nicht.

      Ich brauche lediglich maximal 3 Ebenen in der Tiefe, und denke, dass ich schon ganz gut davor bin, auch wenn der Code wahrscheinlich für Profis grottig ist.

      Mir fehlt echt nur noch dieser blöde Klappmechanismus....

      Ich werd noch wahnsinnig....
      Gruss,

      Volker

      Kommentar


      • #4
        wenn du schon nicht mit einer DB arbeiten willst, dann scanne aber wenigstens nicht bei jedem seitenaufruf die verzeichnis/datei-struktur auf dem server.

        lege deine navigation in einem array ab.
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Kommentar


        • #5
          Warum nicht?

          Das Menü muss sich doch bei jedem Aufruf generieren, denn nur dann kann ich doch sicherstellen, dass bei dem "reload" auch die evtl. nötige Klappe zum nächten Verzeichnis aufgeht... Oder denke ich da falsch?

          Ich hatte auch schon den Ansatz, die Menüs der einzelnen Ebenen in Arrays abzulegen, aber dann weiß ich ehrlich gesagt auch nicht weiter...
          Gruss,

          Volker

          Kommentar


          • #6
            die daten in einem array abzulegen löst zwar nicht wirklich dein problem, hilft dem webserver aber ein wenig länger online zu sein.

            denn wenn du jedesmal die strukturen auf dem server scannst, dauert der aufbau der seite erst einmal länger, und wenn du viele zugriffe hast, auch so lange, dass die seite quasi offline ist.

            das aber nur am rande zum thema performance.

            um zu wissen, was du aufklappen musst, brauchst du nur wissen, wo du bist.

            d.h. baue dir ein array mit z.b. nummerischen indizies und vergleiche jeweils den index mit der an dein script übergebenen id.
            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


            Kommentar


            • #7
              Original geschrieben von Abraxax
              um zu wissen, was du aufklappen musst, brauchst du nur wissen, wo du bist.
              Genau das mache ich doch mit dem Teil ab && in dieser Zeile:

              if(is_dir($path."/".$wert1) && ($dir == $wert1))

              $wert1 ist ein durch scandir() gefundener Eintrag, und
              $dir gibt mir das aktuelle Verzeichnis zurück.

              Also wenn der aktuelle Ordner = dem gefundenen Eintrag ist, dann scanne, also quasi wenn $dir (z.B. seite1) = $wert1 (auch seite1), dann ist die Bedingung doch erfüllt und es wird das nächst tiefere Verzeichnis gescannt.

              Das funktioniert ja auch bis zur ersten Ebene, aber dann versteh ich das nicht.

              Wenn ich die Ordner aus allen Tiefen in 3 Arrays habe, dann habe ich doch wieder das gleiche Problem. Hier habe ich gedacht, könnte mir $root noch helfen, die ja je nach Tiefe "../", "../../" oder "../../../" als Wert hat, und an das Menü übergeben wird.

              Nur wie?
              Gruss,

              Volker

              Kommentar


              • #8
                du musst das ganze rekusiv machen.

                und auch noch einmal der hinweis, NICHT das filesystem zu scannen, sondern ein array zu verwenden.
                INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                Kommentar


                • #9
                  Auch rekursiv habe ich es versucht, damit bin ich noch nicht mal bis zum ersten Aufklappen gekommen.

                  Ich hatte dann quasi eine Sitemap, aber auch hier stand ich wieder vor dem gleichen Problem...

                  Ich teste gerade:
                  PHP-Code:
                  $dir "../";
                      
                  $files1 scandir($dir);
                      
                      foreach (
                  $files1 as $wert1) { 
                              if (
                  $wert1!="." && $wert1!=".." && $wert1!="source" && $wert1!="test" && $wert1!="index.php") {
                              
                  //echo ("<a href='../$wert1/'>$wert1</a><br>"); 
                              
                  $arraylevel_1[] = "$wert1";
                              if(
                  is_dir($dir."/".$wert1)) {
                                 
                  $files2 scandir($dir."/".$wert1);
                                 foreach (
                  $files2 as $wert2) {
                                       if (
                  $wert2!="." && $wert2!=".." && $wert2!="index.php") {
                                            
                  //echo ("- <a href='../$wert1/$wert2/'>$wert2</a><br>"); 
                                            
                  $arraylevel_2[] = "$wert2";
                                            if(
                  is_dir($dir."/".$wert1."/".$wert2)) {
                                                
                  $files3 scandir($dir."/".$wert1."/".$wert2);
                                                foreach (
                  $files3 as $wert3) {
                                                if (
                  $wert3!="." && $wert3!=".." && $wert3!="index.php") {
                                                    
                  //echo ("- - <a href='../$wert1/$wert2/$wert3/'>$wert3</a><br>"); 
                                                    
                  $arraylevel_3[] = "$wert3";
                                                    }
                                                }
                                           }
                                       }
                                  }
                              } 
                          }
                      } 
                  Damit habe ich dann 3 Arrays, in denen jeweils die Einträge stehen,
                  $arraylevel_1[]
                  $arraylevel_2[]
                  $arraylevel_3[]

                  Aber ich stehe damit vor dem gleichen Problem, wie jetzt auch.
                  Gruss,

                  Volker

                  Kommentar


                  • #10
                    ich habe mal in meinen archiven gesucht und diesen tollen absolut veralteten code gefunden.

                    hier kannst du dir mal ansehen wie ich das ganze umgesetzt habe. evtl hilft es dir weiter.

                    aber vorsicht.

                    der code ist absolut veraltet und schon viele viele jahre alt. ja ich habe auch mal sch*** geschrieben.

                    aber das war mal ein menu, was auch aufklappen sollte.

                    der code im anhang ist ein absolutes beispiel wie man NICHT programmieren sollte, es dient nur dem verständnis!
                    Angehängte Dateien
                    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                    Kommentar


                    • #11
                      Guten morgen, Abraxax

                      Also erstmal vielen Dank für Deine Mühe und Deine Geduld.

                      Ich habe mir Deinen Code angesehen, leider arbeitest Du dort auch mit Datenbanken. Du hast bestimmt bemerkt, dass ich in Sachen PHP noch ganz am Anfang stehe. Du bist offenbar Profi, und denkst in anderen Dimensionen, wie ich.

                      Daraus resultieren leider Missverständnisse, denn das, was Du für selbstverständlich und leicht erachtest, ist bei mir noch lange nicht angekommen.

                      Ich versuche es mit learning by doing, in wirklich ganz kleinen Schritten, mit viel lesen im Forum und auf php.net, und komme damit ganz langsam voran, Grundkenntnisse festigen sich ein wenig.

                      Dein Code ist meinem Verständnis leider noch ca. 150.000 Schritte voraus, u.A. weil ich mit Datenbanken noch gar nix am Hut habe, und deswegen nichts davon verstehe.

                      Vielleicht habe ich mir meine jetzige Aufgabe auch zu schwer gewählt, aber ich werde noch etwas weiter probieren, und auf Erfolg hoffen.

                      Ich danke Dir und allen Anderen trotzdem für die gut gemeinte Hilfe!
                      Gruss,

                      Volker

                      Kommentar


                      • #12
                        das was in diesem uralten script mit einer datenbank gemacht wurde, kannst du auf array-ebene umbauen.

                        es ging mir hier nur um das prinzip des aufklappens. das sollte dort nämlich drin sein.
                        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                        Kommentar

                        Lädt...
                        X