Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem bei Navigations-Funktion

Einklappen

Neue Werbung 2019

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

  • Problem bei Navigations-Funktion

    Hi PHPler,

    ich habe mich mal an einer Klasse für mein Seitenlayout probiert und hänge an der Funktion, die eigentlich die Navigation aufbauen soll.
    Sie sieht folgendermaßen aus:

    PHP-Code:
      function writeNav($tid 1) {
        
    $active basename($_SERVER['PHP_SELF']);
        
        
    $nav_sel = new sqlQuery('SELECT * FROM navigation WHERE treeid="'.$tid.'" OR treeid IS NULL');
        echo 
    '<div id="navigation">';
          echo 
    '<div class="tree">';
          
    // Gibt alle Navigationsbäume aus
          
    while($nav $nav_sel->fetch()) {
            if(
    is_null($nav['treeid'])) {
              echo 
    '<h2>'.$nav['name'].'</h2>';
            }
            if(!
    is_null($nav['treeid'])) {
              
    // Gibt alle Eltern-Elemente aus
              
    if(is_null($nav['parentid'])) {
                echo 
    '<a href="'.$nav['url'].'" id="nav_'.(($active == $nav['url']) ? 'active' $nav['id']).'">'.$nav['name'].'</a>';
              } else {
                
    $parent_sel = new sqlQuery('SELECT url FROM navigation WHERE id="'.$nav['id'].'" LIMIT 1');
                
    $parent $parent_sel->fetch();
                
    // Gibt alle Kind-Elemente aus
                
    if($nav['url'] == $active || $parent['url'] == $nav['url']) {
                  echo 
    '<a href="'.$nav['url'].'" '.(($nav['url'] == $active) ? 'id="subnav_active"' '').' class="subnav">'.$nav['name'].'</a>';
                }
              }
            }
          }
        echo 
    '</div>';
        echo 
    '</div>';
      } 
    Meine Datenbankstruktur:
    Code:
    id | parentid | treeid | name | url
    wobei id automatisch vergeben wird, treeid die ID der Navigation ist. Also alles was unter treeid 1 stehen hat (Standard) gehört zur ersten Navigation. parentid ist die ID des übergeordneten Menüpunktes, name gibt den Text des Links an und url ist der Name der Datei (also z. B. impressum.php).

    Folgender Fehler tritt auf:
    Die Unterpunkte werden von allen Menüs angezeigt.

    Mein Ziel:
    Es sollen nur die Unterpunkte der ausgewählten Kategorie angezeigt werden und es soll auch in tiefere Ebenen funktionieren. Meins würde nämlich nur bis in die 2te Ebene funktionieren...

    Ich bin mir ziemlich sicher, dass mein ganzer Ansatz nicht wirklich richtig ist.

    Hoffe jemand von euch blickt da durch und kann mir weiterhelfen.

    SilentSight

  • #2
    Kann mir keiner von euch helfen?
    Oder habe ich irgendwas beim Erstellen des Themas falsch gemacht?

    Kommentar


    • #3
      Wenn ich dich richtig verstanden habe willst du einen Navigationstree bauen, der beim Klick auf eine Kategorie alle Unterseiten dieser Kategorie anzeigt und diese Unterseiten dann zu den einzelnen Seiten verlinken...?!

      Also eigentlich ein ganz normales "Klappmenu" ?

      Kommentar


      • #4
        Richtig, eigentlich ein ganz normales Klappmenü.
        Es soll bei einem Klick auf den Link eine neue Seite geöffnet werden, welche auch die Menü-Funktion includet. Aber in dieser Datei sollen dann alle Unterpunkte angezeigt werden.

        Ein Beispiel:
        impressum.php hat
        Code:
           - id="6"
           - parentid=NULL
           - treeid="1"
           - url="impressum.php"
           - name="Impressum"
        impressum.php wird aufgerufen:
        Code:
           - Menüpunkt "Impressum" wird markiert
           - Alle Punkte deren parentid="6" (also die id des Oberpunktes) hat werden angezeigt
        Wenn ich jetzt auf den Unterpunkt "Kontakt" klicke (parentid="6") soll der Menüpunkt "Impressum" markiert bleiben, "Kontakt" auch markiert werden und das Untermenü weiterhin angezeigt werden.

        Hoffe du verstehst das

        Kommentar


        • #5
          Habe dich leider noch nicht ganz verstanden.. kann auch an meinem derzeitigen Zustand liegen

          Also, du willst ein Klappmenu, dass ohne Javascript (also reines PHP und HTML eben) funktioniert, und immer per Link deine Kategorien und somit das jeweilige Untermenu aufrufen...

          Das ist einfach zu lösen, indem du die $_GET-Methode benutzt:
          Wenn deine Kategorien folgende Links haben
          index.php?kategorie=[id]
          dann kannst du abfragen, welches Menu gerade "aktiv" ist...
          Das heißt, du kannst folgende Abfrage machen:
          PHP-Code:
          $sql mysql_query("SELECT * FROM [tabelle] WHERE parentid = '".$_GET["kategorie"]."'"); 
          Ich denke mal das weist du, oder??
          Wenn dir diese Methode nicht bekannt ist, schau mal bei Google nach PHP $_GET oder so... da findest du sicher genug, was dir helfen wird.

          Wenn du dein Menu mit Javascript lösen willst, kann ich dir auch eine Lösung geben, aber jetzt sag mir erstmal genau wie dus willst!
          (Also ob du zwei Menu's offen haben musst oder auch eines reicht (so wie beschrieben))

          MfG
          dex

          Kommentar


          • #6
            Jo, ich weiß was du meinst. Aber so möchte ich es nicht lösen.
            Ich möchte nicht die Links als Query-String anhängen, sondern die Dateien als eigene aufrufen (also nicht index.php?cat=impressum sondern impressum.php).
            Sonst wäre es ja auch viel zu einfach

            Kommentar


            • #7
              Dann solltest du mal hier vorbeischauen:
              PHP: $_SERVER - Manual

              $_SERVER["SCRIPT_FILENAME"] gibt dir den absoluten Pfad deiner Datei.
              Dann kannst du den Pfad wie bei $_GET["cat"] benutzen!

              Kommentar


              • #8
                Dann solltest du mal hier vorbeischauen:
                PHP: $_SERVER - Manual

                $_SERVER["SCRIPT_FILENAME"] gibt dir den absoluten Pfad deiner Datei.
                Dann kannst du den Pfad wie bei $_GET["cat"] benutzen!
                PHP-Code:
                $active basename($_SERVER['PHP_SELF']); 
                Ich brauch noch nen ID - ParentID Vergleich, welcher die Funktion in tiefere Ebenen hin nützlich macht.

                Beispiel:
                Code:
                id | parentid | treeid | name      | url
                1  | NULL     | 1      | Über mich | aboutme.php 
                2  | 1        | 1      | Beruf     | job.php
                3  | 2        | 1      | Anfang    | beginning.php
                Das meine ich mit tiefere Ebenen:
                Jetzt sind es drei Ebenen, weil Anfang nochmal unter Beruf steht.

                Kannst du mir nicht mal ein Beispiel geben, wie du es meinst?
                Oder kannst du mir vll. sagen, was ich in der Funktion, die ich zu Anfang gepostet hab falsch gemacht habe?

                Kommentar


                • #9
                  Hallo!

                  Ich habe es zwar nicht komplett Verstanden was du eigentlich willst,aber du könntest dir das Thema rekursion oder nested sets anschauen!

                  Bei der rekursion habe ich auch ne ganze Weile gebraucht und habe noch Probleme das richtig umzusetzen und das nested sets modell ist sehr DB Performance freundlich weil alles in einer Abfrage passiert aber ich finde das auch relativ kompliziert!
                  Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                  [URL]http://www.lit-web.de[/URL]

                  Kommentar


                  • #10
                    Rekursion find ich auch sehr schwierig zu verstehen, aber es ist wohl in diesem Thema die einzige bzw. beste Lösung!?

                    Vom Nested-Sets-Modell habe ich noch nie etwas gehört, was ist das?

                    Kommentar


                    • #11
                      Gib das mal in Google ein da findest einiges an guten Tuts.

                      Naja es geht mit rekursion aber um eine Baumstrucktur oder so darzustellen kommst nicht drumherum oder aber nested sets,nur das habe ich bis jetzt auch nocht verstanden. Das Problem daran ist das es nicht so einfach ist wenn navigationspunkte verschieben willst oder löschen willst!

                      Ein nested sets Modell sieht in der DB so aus!

                      Code:
                      id name lft rgt
                      Da hast du praktisch den linken und rechten bezugspunkt eines childs mit abgespeichert. Die Performance wird in Mysql wird nicht so belastet weil alles in einer Abfrage gesteuert wird beim auslesen!

                      Und bei der rekursion wird eine Funktion ja immer wieder ausgeführt wenn es sein soll und bei einer tieferen Struktur und wenn 200 User sich auf einmal durch deine Navigation klicken dann rappelts ganz schön in der DB!

                      Hier mal ein TUT für nested sets [url=http://www.php-resource.de/tutorials/read/21/1/]Das 'Nested Sets' Modell - B
                      Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                      [URL]http://www.lit-web.de[/URL]

                      Kommentar


                      • #12
                        Also muss ich bei der Rekursion für jede Ebene einen neuen SQL-Query erstellen?
                        Das ist doch ziemlich belastend für die Datenbank oder nicht?

                        Kommentar


                        • #13
                          Naja keinen extra Query in dem Sinne das du das jedes mal neu schreibst!

                          Du musst eine Funktion schreiben die sich jedesmal wieder neu aufruft wenn sie verbindungen zu childs findet und ganz wichtig du musst eine abbruchbedingung schaffen sonst endet in einem endloslauf!

                          Und ja eine Rekursive Lösung belastet bei großen Baumtiefen die Perfomance enorm,darum ist dafür die bessere aber auch nicht leicht zu verstehende Lösung nested sets!
                          Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                          [URL]http://www.lit-web.de[/URL]

                          Kommentar


                          • #14
                            Also, was eine rekursive Funktion ist, wusste ich schon
                            Und mit dem SQL-Query hab ich auch den einen, der dann mindestens zu Anfang der Funktion aufgerufen wird.
                            Dann werd ich wohl, um ein gutes DB-Design zu schaffen, nicht um die Nested-Sets rumkommen

                            Danke für die Hilfe, ich meld mich dann nochmal, falls ich es so auch nicht schaffe.

                            Bis denne, SilentSight

                            Kommentar


                            • #15
                              Aber diese Nested-Sets bringen doch eigentlich nur was, wenn ich ganz tiefe Ebenen habe?
                              Ich glaube nicht, dass es so schlimm ist, wenn ich ein Menü mit 2-5 Ebenen habe und es mit einer rekursiven Funktion ausgeben muss.
                              Das Nested-Sets-Modell hat auch seinen Nachteil:
                              Das Updaten bzw. Inserten braucht halt mehrere Abfragen...

                              Aber jetzt weiß ich wenigstens mal darüber Bescheid und werde mich mal mit beiden Methoden auseinandersetzen.

                              Danke für die Hilfe
                              SilentSight

                              Kommentar

                              Lädt...
                              X