sql >> Base de Datos >  >> RDS >> Mysql

menú dinámico php bootstrap mysql

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 uno foreach ($m->fetchAll() as $menu_row) {...} .
  • En el bucle tenemos dos casos:

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

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