Twój kod wygeneruje tylko dwupoziomowe menu, jeśli chcesz przejść przez dowolny poziom, myślę, że musisz użyć rekurencji.
Oto przykład oparty na strukturze Twojej bazy danych i próbkach. W tym przykładzie wygenerujemy menu na różnych poziomach, angielskie etykiety są używane do nazw pozycji menu.
<?php
$db = new PDO('mysql:host=localhost;dbname=testdb', 'root', '');
function drawMenu($db, $parent, $level = null){
$m = $db->prepare(" SELECT * FROM
administrator_menu, administrator_menu_description
where administrator_menu.id = administrator_menu_description.id
and language_id = 2
and parent_id = $parent");
$m->execute();
foreach ($m->fetchAll() as $menu_row) {
$m = $db->prepare("SELECT count(*) FROM administrator_menu where parent_id = $menu_row[id]");
$m->execute();
// The item is parent, so do recursion again
if($m->fetchAll()[0][0] !== '0' && $level !== 0){
echo "<li>" . $menu_row['label']."<ul>";
drawMenu($db, $menu_row[0], $level - 1);
echo "</ul></li>";
}else{ // The item is a leaf or we reach the end level, i.e. base case, so do print the item label
echo "<li>" . $menu_row['label'] . "</li>";
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<?php
echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";
echo "--------------------------------------------------------";
echo "<div> <ul>";
drawMenu($db, 0, 0); // level 0
echo "</ul></div>";
echo "--------------------------------------------------------";
echo "<div> <ul>";
drawMenu($db, 0, 1); // level 1
echo "</ul></div>";
echo "--------------------------------------------------------";
echo "<div> <ul>";
drawMenu($db, 0, 2); // level 2
echo "</ul></div>";
?>
</body>
</html>
Aby narysować wszystkie poziomy:
echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";
drawMenu
funkcja działa w następujący sposób:
- Najpierw przekazujemy
$db
obiekt do tworzenia zapytań do bazy danych,$parent
że drzewo zacznie się od i$level
dla poziomu drzewa. - Funkcja uruchomi się po wybraniu potomka danego
$parent
i przejdź w pętli dla każdegoforeach ($m->fetchAll() as $menu_row) {...}
. -
W pętli mamy dwa przypadki:
-
Element jest liściem, czyli nie jest rodzicem dla innych elementów, albo dochodzimy do ostatniego poziomu drzewa. Ten przypadek nazywa się przypadek podstawowy , w którym rekursja zatrzyma się i zwróci wartość
echo "<li>" . $menu_row['label'] . "</li>";
-
Element jest rodzicem, w tym przypadku wywołujemy
drawMenu
funkcja ponownie z identyfikatorem elementu$menu_row[0]
jako rodzic i$level - 1
aby upewnić się, że zatrzymasz się po osiągnięciu końca poziomów.
-
Przetestuj kod i dostosuj go do swoich potrzeb.