Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Dynamisches Menü PHP Bootstrap mysql

Ihr Code generiert nur ein Menü mit zwei Ebenen. Wenn Sie eine beliebige Ebene durchlaufen müssen, müssen Sie meiner Meinung nach die Rekursion verwenden.

Hier ist ein Beispiel, das auf Ihrer Datenbankstruktur und Ihren Beispielen basiert. Im Beispiel generieren wir ein Menü in verschiedenen Ebenen, die englischen Bezeichnungen werden für die Namen der Menüelemente verwendet.

<?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>

So zeichnen Sie alle Ebenen:

echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";

Das drawMenu Funktion funktioniert wie folgt:

  • Zuerst übergeben wir ein $db Objekt, um Datenbankabfragen zu machen, $parent mit dem der Baum beginnt und $level für die Ebene des Baums.
  • Die Funktion beginnt mit der Auswahl des untergeordneten Elements des angegebenen $parent und gehe in eine Schleife für jeden foreach ($m->fetchAll() as $menu_row) {...} .
  • In der Schleife haben wir zwei Fälle:

    1. Das Element ist ein Blatt, d. h. kein übergeordnetes Element für andere Elemente, oder wir erreichen die letzte Ebene des Baums. Dieser Fall wird als Basisfall bezeichnet , in dem die Rekursion stoppt und einen Wert zurückgibt echo "<li>" . $menu_row['label'] . "</li>";

    2. Das Element ist ein übergeordnetes Element, in diesem Fall nennen wir das drawMenu Funktion wieder mit der Element-ID $menu_row[0] als Elternteil und $level - 1 um sicherzustellen, dass Sie aufhören, wenn Sie das Ende des Levels erreichen.

Testen Sie den Code und passen Sie ihn an Ihre Bedürfnisse an.