Votre code ne générera qu'un menu à deux niveaux, si vous devez passer par n'importe quel niveau que vous voulez, je pense que vous devez utiliser la récursivité.
Voici un exemple basé sur la structure de votre base de données et des exemples. Dans l'exemple, nous allons générer un menu à différents niveaux, les étiquettes en anglais sont utilisées pour les noms des éléments de 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>
Pour dessiner tous les niveaux :
echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";
Le drawMenu
la fonction fonctionne comme suit :
- Nous passons d'abord un
$db
objet pour effectuer des requêtes de base de données,$parent
par lequel l'arborescence commencera et$level
pour le niveau de l'arborescence. - La fonction commencera par sélectionner l'enfant du
$parent
donné et aller en boucle pour chacunforeach ($m->fetchAll() as $menu_row) {...}
. -
Dans la boucle nous avons deux cas :
-
L'élément est une feuille, c'est-à-dire qu'il n'est pas un parent pour d'autres éléments, ou nous atteignons le niveau final de l'arbre. Ce cas est appelé le cas de base , dans lequel la récursivité s'arrêtera et renverra une valeur
echo "<li>" . $menu_row['label'] . "</li>";
-
L'élément est un parent, dans ce cas nous appelons le
drawMenu
fonctionner à nouveau avec l'identifiant de l'élément$menu_row[0]
en tant que parent et$level - 1
pour vous assurer de vous arrêter lorsque vous atteignez la fin des niveaux.
-
Testez le code et modifiez-le selon vos besoins.