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