Váš kód vygeneruje pouze dvouúrovňové menu, pokud potřebujete projít jakoukoli úrovní, kterou chcete, myslím, že musíte použít rekurzi.
Zde je příklad založený na struktuře vaší databáze a ukázkách. V příkladu vygenerujeme menu v různých úrovních, pro názvy položek menu jsou použity anglické popisky.
<?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>
Chcete-li nakreslit všechny úrovně:
echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";
drawMenu
funkce funguje následovně:
- Nejprve předáme
$db
objekt pro vytváření databázových dotazů,$parent
že strom bude začínat a$level
pro úroveň stromu. - Funkce se spustí výběrem potomka daného
$parent
a ve smyčce pro každý z nichforeach ($m->fetchAll() as $menu_row) {...}
. -
Ve smyčce máme dva případy:
-
Položka je list, tj. není nadřazená pro jiné položky, nebo dosáhneme konečné úrovně stromu. Tento případ se nazývá Základní případ , ve kterém se rekurze zastaví a vrátí hodnotu
echo "<li>" . $menu_row['label'] . "</li>";
-
Položka je nadřazená, v tomto případě nazýváme
drawMenu
funkci znovu s id položky$menu_row[0]
jako rodič a$level - 1
abyste se ujistili, že zastavíte, když dosáhnete konce úrovní.
-
Otestujte kód a změňte jej tak, aby vyhovoval vašim potřebám.