Mysql
 sql >> Base de données >  >> RDS >> Mysql

Menu dynamique php bootstrap mysql

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 chacun foreach ($m->fetchAll() as $menu_row) {...} .
  • Dans la boucle nous avons deux cas :

    1. 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>";

    2. 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.