patrick: PHP Treemenü dynamisch mit mySQL

Hi Forum,

ich versuche mich grade an einem dynamischen Menü wie es oft auch in CMS Systemen zum einsatz kommt aber ich komm einfach nich weiter ich zerbrech mir den Kopf wie ich das am einfachsten hinbekommen kann komm aber zu keiner Lösung in diesem Fall.

Ein Beispiel vom Inhalt der Datenbank:

DB Name: navigation

Struktur mit Inhalt:

id | verzeichnis                    | titel
---|--------------------------------|-----------------
1  | de/Home/                       | Startseite
2  | de/Home/Links/                 | Links
3  | de/Home/Hilfe/                 | Hilfe
4  | de/FAQ/                        | FAQ
5  | de/FAQ/Suche/                  | Suche
6  | de/FAQ/Suche/Erweiterte_Suche/ | Erweitere Suche

id ist autoincrement
verzeichnis beschreibt 1. Hauptpunkte und Unterpunkte 2. Den HTML Link

de -> steht für deutsch und soll nicht in der Navigation mit angezeigt werden, sondern soll abgefragt werden.
z.B. gib alle Seiten aus die "de" im Link haben.

Meine Idee war nun die Werte in *Verzeichnis* durch */* irgendwie trennen zu lassen und dadurch 1. zu erkennen was ein Hauptmenü ist und was ein Untermenü und 2. Da das ganze dynamisch sein soll auch beliebig viele Untermenüs auslesen lassen.

danach soll durch PHP die Menüstruktur erstellt werden die bei der Ausgabe so aussehen soll:

Home

  • Links
  • Hilfe
    FAQ
    -Suche
    --Erweiterte Suche

Hoffentlich kann mir bei diesem Problem jemand helfen ich sitz hier und versuch mir mit pseudocode was hinzubasteln aber irgendwie kommt auch dabei nix rum was ich umsetzen könnte. Ich muss dann ja auch noch feststellen können welches Untermenü zu welchen Hauptmenü gehört. (damit ich diese durch css farbig abheben kann und auch eine Art *Sie sind hier FAQ -> Suche -> Erweiterte Suche* erstellen kann.

Ich gehe erstmal was Essen vielelicht kommt mir ja noch der Stein der Weisen zugeflogen.

~Patrick

  1. Hallo,

    Ein Beispiel vom Inhalt der Datenbank:

    du verwechselst eine Datenbank mit einer Tabelle in einer Datenbank.

    de -> steht für deutsch und soll nicht in der Navigation mit angezeigt werden, sondern soll abgefragt werden.

    Wieso legst du dafür keine eigene Spalte an?

    Meine Idee war nun die Werte in *Verzeichnis* durch */* irgendwie trennen zu lassen und dadurch 1. zu erkennen was ein Hauptmenü ist und was ein Untermenü

    Wieso nicht eine extra Spalte in der die ID's der Hauptmenüpunkte als subid der Untermenüpunkte gespeichert und bei der Ausgabe wieder den entsprechenden Hauptmenüpunkten zugeordnet werden?

    und 2. Da das ganze dynamisch sein soll auch beliebig viele Untermenüs auslesen lassen.

    Das sollte kein Problem sein, solange du mit Spalten für subid's arbeitest.

    Grüße, Matze

    1. du verwechselst eine Datenbank mit einer Tabelle in einer Datenbank.

      Ja hast recht, hab mich falsch ausgedrückt.

      de -> steht für deutsch und soll nicht in der Navigation mit angezeigt werden, sondern soll abgefragt werden.

      Wieso legst du dafür keine eigene Spalte an?

      Hmmm... ja das ginge auch wollte  es eben erstmal so probieren.

      Wieso nicht eine extra Spalte in der die ID's der Hauptmenüpunkte als subid der Untermenüpunkte gespeichert und bei der Ausgabe wieder den entsprechenden Hauptmenüpunkten zugeordnet werden?

      OMG du hast recht ich Depp - nur wird dadurch nicht die Abfrage zum Auslesen der Struktur ziemlich groß? Mein Denkproblem ist irgendwie: Wie sag ich meiner Abfrage wieviele Untermenüs existieren?

      und 2. Da das ganze dynamisch sein soll auch beliebig viele Untermenüs auslesen lassen.

      Das sollte kein Problem sein, solange du mit Spalten für subid's arbeitest.

      Ich versuch das ganze mal grade als pseudocode für mich umzusetzen, danke für denkanstöße.

      1. Hallo

        OMG du hast recht ich Depp - nur wird dadurch nicht die Abfrage zum Auslesen der Struktur ziemlich groß?

        in aller Regel ja.

        Mein Denkproblem ist irgendwie: Wie sag ich meiner Abfrage wieviele Untermenüs existieren?

        Hierarchische Strukturen und relationale DBMS, das beißt sich durchaus. Bei
        Menüs hast Du in aller Regel wenig Änderungen, aber viele Lesezugriffe, daher
        habe ich Dich auch auf das Muster "Nested Set" hingewiesen.

        Freundliche Grüße

        Vinzenz

        1. Danke für die ganzen Tipps,

          werde mich am Wochenende erstmal in die vorhandenen Internetbeispiele einlesen und mir ggf. auch noch ein Buch dazu Kaufen, will das ganze ja auch verstehen und nicht nur copy & paste. Außerdem möchte ich das Menü auch nach meinen Wünschen anpassen und das ist ziemlich schwer wenn man durch Nested Sets noch nicht so durchsteigt. Hätte nicht gedacht das eine Baumstruktur mit ihren Wurzeln, Ästen und Blätter so kompliziert sein kann. Kein wunder warum ich mir da so den Kopf drüber zerbrochen habe. Jetzt liegts wohl an mir dort durchzusteigen.

          Danke nochmal :)

  2. Hallo Patrick,

    ich versuche mich grade an einem dynamischen Menü wie es oft auch in CMS Systemen zum einsatz kommt aber ich komm einfach nich weiter ich zerbrech mir den Kopf wie ich das am einfachsten hinbekommen kann komm aber zu keiner Lösung in diesem Fall.

    Dein Suchwort könnte "Nested Set" sein, eine kleine Auswahl an Archivthreads
    zu diesem Thema:

    </archiv/2007/6/t153764/#m1000589>
    </archiv/2006/2/t123458/#m794964>
    </archiv/2006/3/t125135/#m806548>
    </archiv/2006/3/t125344/#m807986>
    </archiv/2006/3/t125579/#m809645>

    Nested Sets haben auch Nachteile, darauf wirst Du in den verlinkten Threads
    auch hingewiesen.

    Freundliche Grüße

    Vinzenz