phpbar.de logo

Mailinglisten-Archive

[php] Menustruktur

[php] Menustruktur

=?iso-8859-1?Q?Bj=F6rn_Schotte?= bjoern_(at)_baer.mayn.de
Sun, 27 Jun 1999 17:09:09 +0200


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