Verschachteltes Menu über Datenbank abfragen

psychokill

Grünschnabel
Heyho Leute, wieder mal.
Dieses mal hab ich das Problem das ich ein einfaches Verschachteltes Menu erstellen möchte: Dynamisch aus der Datenbank.

Und zwar hab ich eine einfache HTML Struktur die automatisch umgewandelt wird (per Javascript) sofern folgender Syntax vorhanden ist.
Das funktioniert auch sehr gut, statischer HTML Code: Keine Probleme.

HTML:
<ul>
	<li> <a href="#"> Das ist der Haupt-Menu Button </a>
		<ul>
			<li> Ein Unter-Menu Button </li>
			<li> Noch einer ... </li>
		</ul>
	</li>
</ul>

Da ich das ganze Dynamisch haben will, erdachte ich mir eine einfache While Schleife mit Konditionen zum Auswahlverfahren. Zwecks der Abfrage ob hier ein Untermenu vorhanden ist, gibt es die _link tabelle des Menüs. Dabei wird lediglich festgelegt wer denn "parent".
Leider wird das ganze nun nebeneinander oder garnicht angezeigt.

PHP:
$sql = Baum::$_db->query('SELECT a.*, b.* FROM bmc_menu a LEFT JOIN bmc_menu_link b ON a.id = b.linkID WHERE a.perm = 0');
while($row = Baum::$_db->fetchArray($sql)) {
	if(Baum::$_page->getPage() == strtolower($row['name'])) $firstActive = ' class="firstActive"';
	else $firstActive = "";
	if($row['parentID'] == 0) { 
		echo '<li'.$firstActive.'><a href="'.$row['url'].'"><img src="./data/images/icon/'.$row['icon'].'" alt="" /> '.$row['name'].'</a>';
		echo "<ul>";
	} elseif($row['parentID'] != 0) {
		echo '<li><a href="'.$row['url'].'">'.$row['name'].'</a></li>';
	} else echo "\r\n</ul></li>";
}


Habt ihr eventuelle Ideen oder Lösungsmöglichkeiten parat?
 
Auf die Schnelle
Ich denke du willst hier nach li noch ein Leerzeichen setzen
PHP:
 echo '<li'.$firstActive.'><a href="'.$row['url'].'"><img src="./data/images/icon/'.$row['icon'].'" alt="" /> '.$row['name'].'</a>';

Am besten gleich sauber formatieren
PHP:
 echo "<li {$firstActive}><a href='{$row['url']}'><img src='./data/images/icon/{$row['icon']}' alt='' /> {$row['name']}</a>';
 
Okay danke, das kannt ich so noch nicht mit der Formatierung.

Das Problem bleibt aber weiterhin bestehen.
Im Grunde möchte ich eine Dynamische Verschachtelung eines Menus.
Dabei ist im aktuellen Code das Problem das zwar das Hauptmenu abgerufen wird, allerdings die Vererbung nicht funktioniert.

Beispiel:
:Menupunkt 1 // Funktioniert
- Submenu 1 // - Funktioniert nicht
- Submenu 2 // - Funktioniert nicht
:Menupunkt 2 // Funktioniert
:Menupunkt 3 // Funktioniert
- Submenu 1 // - Funktioniert nicht
 
Okay, ich bin mittlerweile etwas weiter...

Ich hab mich für die Nutzung von Assoc und Foreach Schleifen entschieden.
Nun hab ich folgendes Problem:
Ich lasse automatisch in einem Array aus dem Assoc die parentID angeben und als Unterpunkt die ID des eigentlichen Menupunktes.

Nun kommt die Meldung das mein Array keine 0 definiert hätte, was so nicht stimmt.
Notice: Undefined offset: 0 in ... "PFAD"

print_r gibt nämlich genau das gegenteil aus:
PHP:
Array ( [0] => 7 )
Array ( [0] => 8 )
Array ( [8] => 9 )
Array ( [8] => 10 )
Array ( [8] => 11 )

Mein PHP Code:
PHP:
    $query = 'SELECT id,
			IFNULL(parentID, 0) AS parent,
    		name,
			perm
    		FROM bmc_menu
			WHERE perm = 0
    		ORDER BY parent ASC';
    $res = Baum::$_db->query($query);
    $data_link = array();
    while ($row = Baum::$_db->fetchAssoc($res)) {
		$data = "IRGENDWELCHE DATEN"
		$data_link = array($row['parent'] => $row['id']);
	}
	foreach($data_link[0] as $parentID => $linkID) {
		echo $data[$linkID];
	}

Also... Warum sagt mir die Fehlermeldung das Array(0) nicht vorhanden ist, obwohl es tatsächlich doch vorhanden ist?
 
Was soll das für ein array sein? Einem Schlüssel kann nur EIN Wert zugeordnet werden! Bei dir stehen da 2 bzw 3 für einen key - das geht nicht!
 
PHP:
$data_link = array($row['parent'] => $row['id']);


Du überschreibst $data_link jedes Mal innerhalb dieser Schleife. Das print_r hattest du wahrscheinlich innerhalb der while-Schleife, die foreach-Schleife kommt aber danach, und zu dem Zeitpunkt ist in $data_link nur ein Key-Value-Paar (das letzte) vorhanden. Wenn du dein print_r nach der while-Schleife setzt siehst du das Problem.

PHP:
 foreach($data_link[0] as $parentID => $linkID) {

ist an der Stelle faktisch nicht vorhanden, deswegen Fehler. Der zweite Fehler kommt, weil $data_link[0], selbst wenn 0 als Index vorhanden wäre, kein Array ist.

Um das Menü zu bekommen brauchst du mindestens noch eine Dimension mehr in dem Array.

PHP:
$data_link[] = array($row['parent'] => $row['id']);

Das erweitert $data_link jeweils um einen neuen Index, beginnend mit 0, und dem Value, was wiederum ein Array ist mit Parent => Child. Dann hast du jeden Menüpunkt erstmal in dem Array, für die Ausgabe bräuchtest du dann eine rekursive Funktion.
 
Zurück