Il tuo codice genererà solo menu a due livelli, se devi passare attraverso qualsiasi livello desideri, penso che tu debba usare la ricorsione.
Ecco un esempio basato sulla struttura del database e sui campioni. Nell'esempio genereremo un menu a diversi livelli, le etichette in inglese vengono utilizzate per i nomi delle voci di 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>
Per disegnare tutti i livelli:
echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";
Il drawMenu
la funzione funziona come segue:
- Prima passiamo un
$db
oggetto per effettuare query sul database,$parent
che l'albero inizierà con e$level
per il livello dell'albero. - La funzione inizierà selezionando il figlio del dato
$parent
e vai in loop per ciascunoforeach ($m->fetchAll() as $menu_row) {...}
. -
Nel ciclo abbiamo due casi:
-
L'elemento è una foglia, cioè non un genitore per altri elementi, oppure si raggiunge il livello finale dell'albero. Questo caso è chiamato caso base , in cui la ricorsione si fermerà e restituirà un valore
echo "<li>" . $menu_row['label'] . "</li>";
-
L'elemento è un genitore, in questo caso chiamiamo
drawMenu
funzione di nuovo con l'elemento id$menu_row[0]
come genitore e$level - 1
per assicurarti di fermarti quando raggiungi la fine dei livelli.
-
Testare il codice e modificarlo in base alle proprie esigenze.