sql >> Databáze >  >> RDS >> Mysql

Dynamické menu php bootstrap mysql

Váš kód vygeneruje pouze dvouúrovňové menu, pokud potřebujete projít jakoukoli úrovní, kterou chcete, myslím, že musíte použít rekurzi.

Zde je příklad založený na struktuře vaší databáze a ukázkách. V příkladu vygenerujeme menu v různých úrovních, pro názvy položek menu jsou použity anglické popisky.

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

Chcete-li nakreslit všechny úrovně:

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

drawMenu funkce funguje následovně:

  • Nejprve předáme $db objekt pro vytváření databázových dotazů, $parent že strom bude začínat a $level pro úroveň stromu.
  • Funkce se spustí výběrem potomka daného $parent a ve smyčce pro každý z nich foreach ($m->fetchAll() as $menu_row) {...} .
  • Ve smyčce máme dva případy:

    1. Položka je list, tj. není nadřazená pro jiné položky, nebo dosáhneme konečné úrovně stromu. Tento případ se nazývá Základní případ , ve kterém se rekurze zastaví a vrátí hodnotu echo "<li>" . $menu_row['label'] . "</li>";

    2. Položka je nadřazená, v tomto případě nazýváme drawMenu funkci znovu s id položky $menu_row[0] jako rodič a $level - 1 abyste se ujistili, že zastavíte, když dosáhnete konce úrovní.

Otestujte kód a změňte jej tak, aby vyhovoval vašim potřebám.




  1. Nastavte časové pásmo databáze MySQL na GMT

  2. Azure Automation Methods

  3. MySQL:Vlastnictví adresáře mysql se změní na 'mysql' z 'service_account' při restartu linuxového serveru

  4. Více generátorů Hibernate sekvence pro jednu entitu s PostgreSQL