Rekursives Menu - funktioniert - aber nicht ganz wie ich es will
Patrick
- php
Hallo
ich habe mich gestern in rekursive Menüs eingelesen und habe mir aus Codeschnipsel in PHP ein solches Menü erstellt.
Es wird auch alles so ausgegeben wie es sein soll, nun habe ich versucht dem Menü zu sagen, das es nur bestimmte Menüs/Untermenüs öffnet/ausklappt.
Mein Menü sieht zur Zeit also so aus:
Obermenue_1
|-Kat_1
|-Kat_2
Obermenue_2
|-Kat_1
|-Unterkat_1
|-Unterkat_2
|-Kat_2
und ich möchte erreichen das mein Menü anfangs so aussieht:
Obermenue_1
Obermenue_2
und beim klick auf Obermenue_2 soll es dann so aus sehen:
Obermenue_1
Obermenue_2
|-Kat_1
|-Kat_2
und bei klick auf Kat1:
Obermenue_1
Obermenue_2
|-Kat_1
|-Unterkat_1
|-Unterkat_2
|-Kat_2
ich denke es ist nun sehr klar was ich möchte :) habe es allerdings nach stundenlangem versuchen nicht hinbekommen.
Mein derzeitiger Quellcode sieht wie folgt aus:
function getMenu($oberkat) {
$einlesen = mysql_query("SELECT ID,name FROM ".SERVER_DB_PREFIX."menu WHERE parentID='".$oberkat."' ORDER BY name");
$menu = "";
while($einzeln = @mysql_fetch_assoc($einlesen)){
if(hasChildKats($einzeln['ID'])) {
$menu .= "<li><a href=?p=".$einzeln['ID'].">".$einzeln['name']."</a><ul>";
$menu .= getMenu($einzeln['ID']);
$menu .= "</ul></li>";
} else {
$menu .= "<li><a href=?p=".$einzeln['ID'].">".$einzeln['name']."</a></li>";
}
}
return $menu;
}
function hasChildKats($katID) {
$einlesen = mysql_query("SELECT ID FROM ".SERVER_DB_PREFIX."menu WHERE parentID='".$katID."'");
if(mysql_num_rows($einlesen) > 0){
return true;
}
else{
return false;
}
}
print getMenu(0);
Meine Idee war es getMenu noch einen 2. Wert mitzugeben und zwar mit dem Inhalt von $_GET['p'], also der aktuell angeklickte Link.
function getMenu($oberkat,$currentkat) {...}
...
print getMenu(0,$_GET['p']);
Nun komme ich aber mit der weiteren Abfrage nicht zurecht, ich weiss einfach nicht wie ich das was ich erreichen möchte in eine PHP abfrage einbaue.
Moin!
ich habe mich gestern in rekursive Menüs eingelesen und habe mir aus Codeschnipsel in PHP ein solches Menü erstellt.
Dein programmierter Ansatz ist aber leider alles andere als optimal. Du produzierst viel zuviele SQL-Querys.
Die maximal erlaubte Anzahl an Querys für ein Menü ist 1.
Dein Ansatz liest mit dem ersten Query alle Obermenüs aus:
Für "root": SELECT ID,name FROM ".SERVER_DB_PREFIX."menu WHERE parentID='".$oberkat."' ORDER BY name
Dann prüft es für alle gefundenen Kategorien, ob diese Unterkategorien haben:
Oberkat1: SELECT ID FROM ".SERVER_DB_PREFIX."menu WHERE parentID='".$katID."'
Oberkat2: SELECT ID FROM ".SERVER_DB_PREFIX."menu WHERE parentID='".$katID."'
Dann wird für jede Kategorie, die Unterkategorien hat, die Funktion wieder rekursiv aufgerufen:
Oberkat1: SELECT ID,name FROM ".SERVER_DB_PREFIX."menu WHERE parentID='".$oberkat."' ORDER BY name
Oberkat2: SELECT ID,name FROM ".SERVER_DB_PREFIX."menu WHERE parentID='".$oberkat."' ORDER BY name
Jeder dieser Querys liefert die Unterkategorien, die jeweils wieder auf Unterkategorien geprüft werden.
Kat1.1: SELECT ID FROM ".SERVER_DB_PREFIX."menu WHERE parentID='".$katID."'
Kat1.2: SELECT ID FROM ".SERVER_DB_PREFIX."menu WHERE parentID='".$katID."'
Kat2.1: SELECT ID FROM ".SERVER_DB_PREFIX."menu WHERE parentID='".$katID."'
Kat2.2: SELECT ID FROM ".SERVER_DB_PREFIX."menu WHERE parentID='".$katID."'
Für die Unterkategorie gibts wieder einen Query:
Kat2.1: SELECT ID,name FROM ".SERVER_DB_PREFIX."menu WHERE parentID='".$oberkat."' ORDER BY name
Und nochmal Checks:
Unterkat2.1.1: SELECT ID FROM ".SERVER_DB_PREFIX."menu WHERE parentID='".$katID."'
Unterkat2.1.2: SELECT ID FROM ".SERVER_DB_PREFIX."menu WHERE parentID='".$katID."'
Zählen wir mal durch: 12 Querys für ein simples, einfaches Menü mit einer Datenmenge, die locker auf einen Bierdeckel passen würde.
Meine Empfehlung: Lies einmal die komplette Menütabelle in einem Query aus und sortiere die Elemente dann in PHP. An dieser Stelle kannst du dann auch entscheiden, ob ein Menü ausgeklappt sichtbar sein soll, oder nicht. Im Moment steckst du in einer Rekursionsschleife fest.
- Sven Rautenberg