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
$db
objeto para hacer consultas a la base de datos,$parent
con el que comenzará el árbol y$level
para el nivel del árbol. - La función comenzará seleccionando el hijo del
$parent
dado 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
drawMenu
vuelva a funcionar con el id del elemento$menu_row[0]
como padre y$level - 1
para asegurarse de detenerse cuando llegue al final de los niveles.
-
Pruebe el código y cámbielo para que se ajuste a sus necesidades.