Su código solo generará un menú de dos niveles, si necesita pasar por cualquier nivel que desee, creo que necesita usar la recursividad.
Aquí hay un ejemplo basado en la estructura de su base de datos y ejemplos. En el ejemplo, generaremos un menú en diferentes niveles, las etiquetas en inglés se usan para los nombres de los elementos del menú.
<?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>
Para dibujar todos los niveles:
echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";
El drawMenu la función funciona de la siguiente manera:
- Primero pasamos un
$dbobjeto para hacer consultas a la base de datos,$parentcon el que comenzará el árbol y$levelpara el nivel del árbol. - La función comenzará seleccionando el hijo del
$parentdado y entre en bucle para cada unoforeach ($m->fetchAll() as $menu_row) {...}. -
En el bucle tenemos dos casos:
-
El elemento es una hoja, es decir, no un padre para otros elementos, o llegamos al nivel final del árbol. Este caso se llama Caso base , en el que la recursividad se detendrá y devolverá un valor
echo "<li>" . $menu_row['label'] . "</li>"; -
El elemento es un padre, en este caso llamamos al
drawMenuvuelva a funcionar con el id del elemento$menu_row[0]como padre y$level - 1para asegurarse de detenerse cuando llegue al final de los niveles.
-
Pruebe el código y cámbielo para que se ajuste a sus necesidades.