![]() 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