Mailinglisten-Archive |
Hi, > Über Antworten würde ich mich freuen. Mach dir folgende Datenbankstruktur: CREATE TABLE menueintrag( m_id INT NOT NULL DEFAULT '0' auto_increment, obermenu INT NOT NULL DEFAULT '0', menutext char(255), pfad char(255), PRIMARY KEY(m_id) ); Hier erzeugst du durch obermenu eine Verkettung deiner Menüeinträge. 0 sei hierbei die Wurzel: Wurzel /------|--------|------\ / | | \ Menü 1 Menü2 Menü3 Menü4 / \ \ Menü1.1Menü1.2 \ Menü2.1(ID=7) / \ / \ Menü2.1.1 \ (ID=8) Menü2.1.2(ID=9) etc.pp. Menü1 hat als ID den Wert 1, Menü2 den Wert 2 usw. Menü1.1 hat als ID den Wert 5, als obermenu den Wert 1 (Zeiger auf Menü1). Menü1 selbst hat als obermenu den Wert 0 (0=Wurzel). Danach baust du dir eine Funktion, die dir den pfad generiert. Das heißt von Menü1.1 (ID 5) aus gesehen sollte dein Pfad so lauten: 0-1-5 Von Menü2.1.2 aus gesehen lautet dein Pfad so: 0-2-7-9 Das erreichst du, indem du von der aktuellen Position (z.B. ID=9) solange via obermenu rückwärts gehst, bist du die 0 erreicht hast. Das baust du dir in ein Array, welches du revers sortierst. Dann erzeugst du mittels implode("-",$arr) deinen Pfad und speicherst ihn im Daten- satz ab. Dann baust du dir eine rekursive Funktion, die dir den Baum präsentiert. Am Anfang rufst du sie mit dem Parameter 0 auf, da deine aktuelle Position die Wurzel ist. Du gibst in der Funktion alle Punkte aus, deren Oberbereich dein Übergabeparameter (im ersten Fall also 0 == die Wurzel) ist. $id sei die ID des aktuellen Punkts, den du ausgibst. Dann gibst du folgendes aus: <A HREF="$PHP_SELF?id=$id">$menupunkt</A>. (Klickt der User also auf einen Menüpunkt, wird das Script erneut aufgerufen, in der Variablen $id erhälst du dann die id des Menü- punktes, der aufgerufen wurde. Diesen übergibst du dann wieder deiner rekursiven Funktion.) Bevor du diese Funktion mit dem Parameter 0 bzw. $id aufrufst, solltest du am Anfang deines Scripts prüfen, ob $id != 0 ist. Dann holst du dir den Pfad (also z.B. "0-2-7-9") aus dem Datensatz $id, splittest ihn via explode in ein Array auf, z.B. $mybaum. Diesen setzt du als GLOBAL $mybaum in deiner Funktion. Intern läßt du einen Zähler $zaehler (bei 0 beginnend) mitlaufen. So. Falls $zaehler<count($mybaum)) und $mybaum[$zaehler]==$id, dann $zaehler++, showbaum($berid); , $zaehler --. => Wenn das Feld in deinem Array an der aktuellen Zählerposition (==Baumtiefe) mit der $id des aktuellen Menüpunkts (den du in der Funktion ausgibst) übereinstimmt, dann gehe eine Tiefe weiter rein ($zaehler++), rufe die Funktion erneut auf (==rekursiv) mit deiner $id, und erniedrige danach den Zähler wieder um eins. Jedesmal, wenn du z.B. via admin-Oberfläche einen Menüpunkt neu erstellst oder gar verschiebst, mußt du natürlich den Pfad erneut berechnen und im Datensatz ablegen. Das hat nämlich den Vorteil, daß du dir einige SELECT's zur Laufzeit sparst. -- Björn Schotte 09364/810492 http://www.php-center.de/
php::bar PHP Wiki - Listenarchive