Navigation wie hier im Forum

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

  • Navigation wie hier im Forum

    hi

    Ich bin momentan dabei eine lösung für eine solche Navigation wie hier im Forum zu finden.

    PHP script resource > Entwicklung > PHP Developer Forum

    Doch ich komme einfach nicht weiter. Ich habe schon im Forum und bei Google gesucht bin aber immer nur auf menu_menu und nested sets gestoßen.

    Also ich gehe mal davon aus, das es mit der richtigen Datenbank anfrage zutun haben muss.

    Also zunächst habe ich mir ein DB-Layout überlegt zur Navigationsführung:

    Alles nur Beispieleiträge mir ist nichts besseres eingefallen.

    tabelle 1 = categorien

    cat_id | cat_name
    1 | Verbrauch
    2 | Netzwerk
    3 | CD-Rohlinge
    4 | CD-R
    5 | CD-RW
    6 | Modem
    7 | DSL
    8 | ISDN
    9 | Netzwerkkabel
    10 | Bluetooth

    tabelle 2 = categorien_sort

    id | eben_id
    0 | 1
    1 | 3
    3 | 4
    3 | 5
    0 | 2
    2 | 6
    2 | 9
    2 | 10
    6 | 7
    6 | 8

    Ok das sind meine DB Tabellen und hier der Code mit dem ich das Abfrage aber halt nicht so wie ich will.

    PHP-Code:
         $ebene 1;

         
    $sql['legende'] = "SELECT a.cat_name, s.eben_id
                                   FROM categorien AS a LEFT JOIN categorien_sort AS s
                                   ON a.cat_id = s.eben_id
                                   WHERE s.id = '"
    .$ebene."'";
         
         
    $_db->query($sql['legende']);

             while(
    $test $_db->get_row())
             {
                         echo 
    $test['cat_name']."<br>";
             } 
    Eigentlich sollte es so sein das wenn ich der Variable $ebene z.B. den wert 3 gebe mir das ausgegeben wird:

    Verbrauch
    - CD-Rohlinge
    - CD-R
    - CD-RW

    aber ich bekomme ja nur das:

    CD-R
    CD-RW

    Wie kann ich nun die Kategorien die Dahinterstehen herausbekommen?

    P.s. Mit nested_sets bin ich nicht sehr weit gekommen nur so wie im Turtorial angegeben.
    Sobalt es darum ging ddie Ausgabe einzuschränke ist schluss gewesen. Also habe ich nach einem anderen weg gesucht aber auch hier fehlanzeige.

    Ich währe euch echt dankbar über eure Hilfe!

    MfG. ppapsd

  • #2
    Ich kann deine zweite tabelle grad nicht nachvollziehen. ist das die menu_has_menu??

    ansonsten hilft dir das suchwort "breadcrumb" vielleicht noch weiter

    Kommentar


    • #3
      das geht ja schnell, ja in der Tabelle habe ich das menü gegliedert also im prinzi so:

      Verbrauch
      - CD-Rohlinge
      -- CD-R
      -- CD-RW

      Netzwerk
      - Modem
      -- DSL
      -- ISDN
      - Netzwerkkabel
      - Bluetooth

      und nach breadcrumb werde ich gleich mal suchen danke schonmal.

      Kommentar


      • #4
        Also deute ich das eher als NEIN.

        Du speicherst nur die parent_id in zweite Tabelle. Das ist natürlich absolut überflüssig, denn die kannst du direkt in die erste tabelle speichern.

        Wenn du jetzt von der aktuellen Kategorie "CD-RW" alle übergeordneten Kats haben willst, musst du die rekursiv aufrufen.

        Aber Achtung, dass kann bei Großen Strukturen schonmal recht anstrengend werden, weil du bei

        10 Subkats auch 10 Queries auswerten musst. NUR für die Navigation.

        Mit Nested_sets lässt sich dass in einer Query erledigen. Mit der Menu_Menu struktur glaube ich auch.

        Kommentar


        • #5
          aber mit nested sets bin ich nicht sehr weit gekommen als so:

          PHP-Code:
               $sql['legende'] = "SELECT node1.payload,
                                         COUNT(*) AS level
                                         FROM node AS node1,
                                              node AS node2
                                         WHERE node1.root_id = 1
                                           AND node2.root_id = 1
                                           AND node1.lft BETWEEN
                                               node2.lft
                                           AND node2.rgt
                                         GROUP BY node1.LFT;"
          ;

                   
          $_db->query($sql['legende']);
                   while(
          $test $_db->get_row())
                   {
                   
          $leer '';
                      for(
          $x=1;$x<$test[level];$x++)
                      {
                          
          $leer .= '&nbsp;&nbsp;&nbsp;';
                      }
                      echo 
          $leer.$test[payload]."</a><br>";
                   } 
          also eben wie im Turtorial angegeben.

          Weil wenn jetzt die ID von CD-RW angegebn ist soll auch nur das angezeigt werden.

          Verbrauch
          - CD-Rohlinge
          -- CD-RW
          Zuletzt geändert von ; 31.12.2006, 14:54.

          Kommentar


          • #6
            erwarte bitte keinen fertigen code, da bist du hier falsch.

            aber schau dir mal die datensätze an, die du haben willst. was fällt dir an denen auf. welche bedingungen müssen die erfüllen?

            Kommentar


            • #7
              Also irgendwie komme ich da nicht weiter er müsste doch einfach von der obersten id also wie in diesem Beispiel:

              Verbrauch
              - CD-Rohlinge
              -- CD-RW

              von der id 5 CD-RW über id 3 CD-Rohlinge zu der id 1 Verbrauch gelangen das ergebnis drehe ich am ende um und meine Navigation ist fertig so habe ich mir das ganz am anfang gedacht aber keinen ansatz dafür gefunden.

              Könntest du mir nicht mal einen ansatz geben das ich weiss was ich machen muss?
              Zuletzt geändert von ; 31.12.2006, 15:25.

              Kommentar


              • #8
                das wäre der rekursive ansatz.

                Kommentar


                • #9
                  Ok wenn ich bei nested sets bleibe ist das meine DB:

                  node_id | root_id | payload | lft | rgt
                  1 | 1 | A - Das Wurzelposting | 1 | 10
                  2 | 1 | B - Replay auf "A" | 2 | 7
                  3 | 1 | C-Replay auf "B" | 3 | 4
                  4 | 1 | D - 2. Replay auf "B" | 5 | 6
                  5 | 1 | E - 2. Replay auf "A" | 8 | 9

                  Ok das ist die ausgabe:

                  A- Das Wurzelposting
                  -B-Replay auf "A"
                  -- C-Replay auf "B"
                  -- D-2. Replay auf "B"
                  - E-2.Replay auf "A"

                  Wenn ich jetzt aber nur das haben will funktioniert das aber nicht weil ich so die suche doch nicht einschränken kann.

                  A- Das Wurzelposting
                  -B-Replay auf "A"
                  -- D-2. Replay auf "B"

                  mit diesem Code habe ich versucht das einzuschränken aber das funktiniert ja nicht so wie ich das möchte:

                  AND node1.lft >= 1
                  AND node1.rgt <= 4

                  aber dan bekomme ich ja nur das

                  C - Reply auf "B"

                  Kommentar


                  • #10
                    Es heißt reply. nicht replay.

                    AND node1.lft >= 1
                    AND node1.rgt <= 4
                    bezieh den lft-wert der aktuellen kategorie noch mit ein.

                    Kommentar


                    • #11
                      Wie meinst du das?

                      so?
                      AND node1.lft >= 1
                      AND node1.rgt <= 4
                      AND node1.lft = 3

                      aber das bringt doch garnichts ich bekomme immernoch das:

                      C - Reply auf "B"
                      Zuletzt geändert von ; 31.12.2006, 16:31.

                      Kommentar


                      • #12
                        nein, so sicher nicht. wäre ja unfug. left ist ja nachweislich nur bei EINEM EINZIGEN Datensatz gleich 3. und somit übrigens automatisch größer-gleich 1.

                        Kommentar


                        • #13
                          ah jetzt glaube ich es zu haben, so nichtwahr:

                          AND node1.rgt >= 8
                          AND node1.lft <= 7
                          AND node1.lft >= 1
                          Zuletzt geändert von ; 31.12.2006, 17:25.

                          Kommentar


                          • #14
                            das ergebnis ist das gewünschte?

                            Kommentar


                            • #15
                              ja super danke für deine Hilfe, und noch einen guten rutsch.

                              Kommentar

                              Lädt...
                              X