Barrierefreie Treenavigation

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

  • Barrierefreie Treenavigation

    Hallo,

    ich bin grad dabei für meine Download-Sektion ein nettes Menü zu programmieren, nur stehe ich gerade vor einem Problem, wo ich nicht weiss wie ich sowas realisieren könnte.

    Folgende Situation.

    Datenbank der Kategorie:
    catid | subid | subcount | name | show | description
    1 | 0 | 0 | Main | 1 | ...
    2 | 1 | 1 | Programme | 1 | ...
    3 | 1 | 1 | Games | 1 | ...
    4 | 2 | 2 | Messanger | 0 | ...
    5 | 3 | 2 | Command & Conquer | 0 | ...
    6 | 5 | 3 | Red Alert | 0 | ...
    7 | 5 | 3 | Tiberian Sun | 0 | ...

    Das sollte dann so aussehen:

    1 Main
    2 » Programme
    3 » Games

    Wenn ich auf Games klicke sollte es dann so aussehen:

    1 Main
    3 » Games
    5 » » Command & Conquer
    6 » » » Red Alert
    7 » » » Tiberian Sun

    So, das heisst unbegrenzlich erweiterbar. Soweit so gut.

    Nur wie realisiere ich das am besten das ich nicht 500 if-Abfragen machen muss, welches subcount (Anzahl der Steps die nach vorne geschoben werden) grade benutzt werden soll.
    Vorallem, die Gesamte Menü Struktur zurückverfolgt werden soll.
    Ich übergebe ja lediglich nur die catid im Link.

    Weiss da einer weiter ?

    Mit freundlichen Grüssen
    Tobias

  • #2
    1. eine rekursive funktion löst dein problem. kannst nach "nested sets" suchen, so eine navigation ist ein paradebeispiel aller zeiten.
    2. die spalte 'subcount' ist unnötig, imho.

    Kommentar


    • #3
      Original geschrieben von penizillin
      2. die spalte 'subcount' ist unnötig, imho.
      nicht zwingend, wenn man annimmt, dass das die spalte für die levelebene ist.

      denn hier kann er ja immer den korrekten faktor zur einrückung schreiben, um nicht rekursiv bei der generation des menüs die ebenentiefe zu ermitteln.
      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


      • #4
        Danke für die Antwort hab gleich mal nach nested sets gegoogelt - der Name war mir noch gar nicht bekannt, danke! - und habe gleich was gefunden!

        Richtig, Abraxax, diese Spalte benötige ich um das einrücken bzw. das erstellen der "Ordner-Icons".

        http://www.develnet.org/38.html

        Thema erledigt!

        Kommentar


        • #5
          natürlich wäre es eine belastung, die struktur komplett durchzugehen, nur um die ebene zu ermitteln, jedoch bin ich bisher der meinung gewesen, dass man diese "ebenentiefe" in einer rekursiven funktion mittels eines parameters messen kann, und entsprechend weiter übergeben kann, was definitiv schneller wäre.

          eine weitere belastung wäre jedoch, die spalte jedesmal upzudaten und hoffen, dass es nicht zu einer unstimmigkeit (mir fehlt der fachbegriff) zwischen dem wert und der tatsächlichen ebenentiefe.

          aber ist "subcount" nicht einfach die anzahl der unterelemente?

          Kommentar


          • #6
            Ja subcount und die Anzahl der Unterebene in der diese Kategorie sein sollte.

            An einer rekursiven Funktion habe ich auch schon gedacht, nur bin an dem Punkt stehen geblieben, wie ich das zbs. bei 9 weiteren Unterebenen einfach und schnell realisieren kann. Deshalb werde ich mal die "nested sets" Variante probieren und danach mal versuchen eine Rekursive Funktion zu erstellen. Mal schauen, was einfacher von der Handhabung ist.

            Kommentar


            • #7
              in einer rekursiven funktion mittels eines parameters messen kann, und entsprechend weiter übergeben kann, was definitiv schneller wäre.
              und sowas willst du bei jedem seitenabruf neu ermitteln? nein. das muss nun wirklich nicht sein.

              im admin bereich könnte man das einmalig für alle einträge machen. dann dauerst halt mal kurz (2-5 sec) und das wars. beim anzeigen des menüs muss es damit eben nicht jedesmal performance-fressend mittels rekursion gemacht werden. das halt ich eher für subotimal.
              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


              • #8
                ich verdeutliche mal das, was ich meine, an einem beispiel:
                PHP-Code:
                function getNodes($level=0){
                   
                //ausgabe
                   
                getNodes($level+1);


                getNodes(); 
                so verschwendet man keine sql-ressourcen auf die ebenentiefe, die wird in $level enthalten sein. natürlich muss die funktion komplizierter sein, mir gings nur um den zähler.

                der vorteil ist, dass ich die baumstruktur flexibeler erweitern kann - löschen, verschieben (pid ändern), etc.

                p.s. das wort, das ich oben gesucht habe - inkonsistenz. bzw. die gefahr einer inkonsistenz
                Zuletzt geändert von penizillin; 19.01.2005, 15:38.

                Kommentar


                • #9
                  wofür die fkt wenn die levelebene in der db steht? oder verstehe ich dich wirklich nciht? *gg*
                  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


                  • #10
                    siehe post scriptum

                    Kommentar


                    • #11
                      OffTopic:
                      bist du inkontinent?


                      *lol* lassen wir das thema und lassen ihn einfach mal machen ...
                      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


                      • #12
                        OffTopic:
                        as you wish! bin nachhilfe geben!

                        Kommentar


                        • #13
                          Uff also diese "nested sets" sind wirklich kompliziert, wird wohl noch n paar Tage dauern bis man da durchblickt.

                          Gibt es noch eine andere Möglichkeit?

                          Kommentar


                          • #14
                            ja, man könnte es umständlich und unflexibel machen, und zu jedem eintrag, d.h. jedem menüpunkt informationen speichern: 'ordering', also die reihenfolge in einem vertikalen menü, angefangen bei 0; und 'level' - eben diese ebenentiefe, wo 0 die obersten elemente bezeichnet, 1 eine ebene drunter usw.

                            zu weiteren perversitäten gehört auch die zusammensetzung von diesen zwei werten, wie z.b. die automatische nummerierung bei word.

                            1
                            11
                            111
                            12
                            121
                            122
                            2
                            21
                            etc.

                            wo jedes zeichen von links an die ebenen nummer angibt, und seine stelle die ebenentiefe.

                            lässt sich mit mathematische operatoren schnell auseinandernehmen.

                            bleibe jedoch der meinung, dass nested sets für die navigation am meisten geeignet ist.

                            Kommentar


                            • #15
                              Soweit so gut mit den Nested-Set

                              Habe es bis jetzt so:
                              http://web3.oslo035.server4you.de/gl...load&showcat=1


                              Nun wollte ich natürlich auch "untergruppen" machen, jedoch will ich die nur anzeigen wenn ich auf die "Haupt Gruppe" klicke.

                              Code:
                              DB-Menü:
                              id | lft | rgt | name             | show
                              ---|-----|-----|------------------|------
                              1  |  1  |  11 | Main             |   0
                              2  |  3  |   4 | Programme        |   0
                              3  |  5  |   6 | Games            |   0
                              4  |  7  |   8 | Driver           |   0
                              5  |  9  |  10 | Movies           |   0
                              PHP-Code:
                              # Query
                              $source    $db->sql("
                              SELECT node1.cat_id,node1.subcount,node1.lft,node1.rgt,node1.name,COUNT(*) AS level
                              FROM "
                              .$GLOBALS["table_download_cat"]." AS node1,".$GLOBALS["table_download_cat"]." AS node2
                              WHERE node1.lft BETWEEN node2.lft AND node2.rgt GROUP BY node1.LFT
                              "
                              ); 
                              Vorallem, wie muss jetzt die Unter-Kategorien mit den lft & rgt werten belegen?

                              Grüsse aus Bünde
                              Tobias

                              Kommentar

                              Lädt...
                              X