Tabellen für beliebig viele hierarchische Menüs

Hallo Experten.

irgendwie stehe ich auf dem schlauch.
seit 2 tagen versuche ich ein web-content-management zu bauen,
in dem die menüs hierarchisch angeordnet sind. die menüs sollen sich dazwischen schieben, man könnte es vergleichen mit einer liste die eine liste enthält die aber manchmal noch eine liste enthält.
natürlich :smile:) soll es möglich sein beliebig viele menüs in einander zu schachteln.

bis jetzt habe ich es mit GRUPPEN von einzelnen Seiten.
aber dann müsste ich irgendwie/irgendwo die GRUPPEN mit einander verschachteln. das ist mein hauptproblem.

weiss jemand eine lösung oder vielleicht hat es schon jemand programmiert (eigentlich modeliert)

bin für jede hilfe dankbar.

GRUSS
WEBANDI

Hi Andi,

ich verstehe dein Problem folgendermaßen:

|Menü 1
 \> Punkt 1
 \> Punkt 2
 \> Punkt 3
 |Untermenü 3
 \> Punkt 3.1
 \> Punkt 3.2
 |Untermenü 3.2
 \> Punkt 3.2.1
 \> Punkt 4

Es handelt sich also um einen nicht binären Baum.
Diesen möchtest du in einer DB verwalten?

Du könntest alle Einträge flat in eine Tabelle schreiben, also Ordnung des Eintrags (entspricht der 1.2.3.4-Notation), angezeigter Wert, URL.
Beim Aufbau des Menüs müsste dann dein Parser anhand der Ordnung des Eintrags deine Menüstruktur bestimmen.

Bei relativ kleinen Bäumen würde dies bestimmt ausreichen, aber bei größeren könnte es da schon zu Komplikationen kommen.

Eine andere Möglichkeit ist die, dass du dir den Baum selbst aufbaust.
Für jede Ordnung in der Hierarchie, also jede Ebene in deinem Baum, wird eine Tabelle erzeugt.
Jede Tabelle ist so aufgebaut:

  • Id (primary key)
  • Eintrag
  • URL
  • Vater-Knoten (foreign key)

Bei deiner ersten Tabelle, also der Wurzel des Baumes, ist bei allen Einträgen der Vaterknoten die NULL oder ein eindeutiger Wert für die Wurzel.
Ein kleiner Auszug zum Verständnis:
Menüstruktur (als Baum):

 Wurzel
 / / | \ \
1 2 3 4 5
 / | \
 3.1 3.2 3.3
 / \
 3.3.1 3.3.2

Du benötigst also 3 Tabellen:

Tabelle 1:

Id | Eintrag | URL | Vater
1 Punkt 1 - Wurzel
2 Punkt 2 - Wurzel
3 Punkt 3 - Wurzel
4 Punkt 4 - Wurzel
5 Punkt 5 - Wurzel

Tabelle 2:

Id | Eintrag | URL | Vater
1 Punkt 3.1 - 3
2 Punkt 3.2 - 3
3 Punkt 3.3 - 3

Tabelle 3:

Id | Eintrag | URL | Vater
1 Punkt 3.3.1 - 3
2 Punkt 3.3.2 - 3

Dabei bezieht sich der Vater-Knoten immer auf die Tabelle n-1, also die nächst höher gelegene Ebene.
Dies sollte bei der Verwendung von echten foreign keys schon bei der Erzeugung beachtet werden.
Bei MySQL, wo ja standardmäßig keine echten Verknüpfungen erzeugt werden, kann man dies ja beim Auslesen beeinflussen.

Ich würde jedoch eine solche Struktur generell in einem XML-Dokument ablegen, da man hier mit einem Parser bestimmt einfach umgehen kann, als eine ziemlich aufwändige Datenbank-Struktur zu designen, die dann auch noch dynamisch sein soll…

Hilft dir das weiter?

Ciao, Bill

Hallo Experten.

irgendwie stehe ich auf dem schlauch.
seit 2 tagen versuche ich ein web-content-management zu bauen,
in dem die menüs hierarchisch angeordnet sind. die menüs
sollen sich dazwischen schieben, man könnte es vergleichen mit
einer liste die eine liste enthält die aber manchmal noch eine
liste enthält.
natürlich :smile:) soll es möglich sein beliebig viele menüs in
einander zu schachteln.

Ich habe das mit einer Datei statt DB gemacht, sollte aber auch mit einer DB gehen. Speichere neben den anzuzeigenden Daten die Reihenfolge (in der Textdatei automatisch, per DB braucht man nen Index), und ein „Level“, wie tief das Menü eingerückt ist.
PHP-Code:
// Menu
// 0:id, 1:Level, 2:txt, 3:lnk, 4:lopt, 5:aktiv, 6:ausgeklappt

function menu_active(&$menu, $nr) {
// Suche vorhergehendes Element mit tieferem Level
for ($i=$nr; $i>=-1; $i–)
if ($menu[$i][1]-1) {
// Klappe direkte Unterpunkte des akt. Punktes aus
for($i=$nr+1; $i=0)
$nr = menu_active($menu, $nr);
};
// Darstellung
for ($i=0; $i

Vielen dank für Dein vorschlag.
Dein script ist GUT.
Inzwischen habe ich das problem etwas anders
gelöst. Bei jeder seite wird die folgende menügruppe
abgespeichert. gleichzeitig gehört jede Seite
zu einer bestimmten gruppe.
beim öffnen des nächsten menüs übergebe ich in
variablen (so viele wie hierarchien) die aktuelle
position.

damit habe ich erreicht, dass die gesamte webseite
vollständig veränderbar ist.

GRUSS
webandi