Autor Zpráva
kironet96
Profil
Zdravím,

snažím se udělat dynamické menu pomocí seznamu (li).
Takže tam bude i submenu(podmenu).

Problém je v tom že submenu není u každé položky, takže jsem se zamotal.
PHP script mi sice udělá vše jak potřebují, ale taky mi po každé položce uzavře <ul> což ja potřebují aby se uzavřelo až se vypíšou všechny položky.
Ukázka html kodu:
<nav>
    <ul id="nav">
        <li><a class="hov-menu" href="#">TEST</a>
            <ul>
                <li><a class="hov-submenu" href="#">TEST1</a></li>
                <li><a class="hov-submenu" href="#">TEST1</a></li>
            </ul>
        </li>
        <li><a class="hov-menu" href="#">TEST</a> </li>
        <li><a class="hov-menu" href="#">TEST</a></li>
    </ul>
    <div class="nav-line"></div>
</nav>

Tady je můj php script:
<?php
mb_internal_encoding("UTF-8");
require('Db.php');
require('define.php');
$menus = Db::queryAll('SELECT * FROM '.MENU.'');
$sub_menus = Db::queryAll('SELECT * FROM '.SUBMENU.'');
?>
<nav>
    <ul id="nav">
        <?php
        foreach($menus as $menu)
        {
            $menu_name = $menu['menu_name'];
            $menu_url = $menu['menu_url'];
            $id = $menu['id'];
            echo('<li><a class="hov-menu" href="'.$menu_url.'">'.$menu_name.'</a>');
            foreach($sub_menus as $sub_menu)
            {
                $submenu_name = $sub_menu['submenu_name'];
                $submenu_url = $sub_menu['submenu_url'];
                $menu_id = $sub_menu['menu_id'];
                if($id == $menu_id) {
                    echo('<ul><li><a class="hov-submenu" href="'.$submenu_url.'">'.$submenu_name.'</a></li></ul>');
                }
            }
            echo("</li>");
        }
        ?>

    </ul>
    <div class="nav-line"></div>
</nav>

Použivám 2 tabulky.
1) Menu
2) Submenu

Struktura:
CREATE TABLE `isoeucom_menu` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `menu_name` varchar(255) DEFAULT NULL,
  `menu_url` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

CREATE TABLE `isoeucom_submenu` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `menu_id` int(11) DEFAULT NULL,
  `submenu_name` varchar(255) DEFAULT NULL,
  `submenu_url` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;


Budu vděčný za každou radu
Martin02
Profil
kironet96:
Ta databáze není úplně ideální... Většinou se to dělá tak, že vytvoříš jen jednu tabulku, kde vnořené položky (submenu) mají ve sloupci např. "parent" id rodiče, tedy té položky, ve které jsou vnořené.

Pokud to ale necháš takhle, tak vidím nejjednodušší řešení toto: (jestli ti teda nevadí, že tam bude trochu více dotazů do mysql)
<?php
    mb_internal_encoding("UTF-8");
    require('Db.php');
    require('define.php');

    $menus = Db::queryAll('SELECT * FROM '.MENU);

    echo '
    <nav>
        <ul id="nav">';

    foreach ($menus as $menu)
    {
        echo '<li><a class="hov-menu" href="'.$menu['menu_url'].'">'.$menu['menu_name'].'</a>';

        // Položky konkrétního submenu
        $sub_menus = Db::queryAll('SELECT * FROM '.SUBMENU.' WHERE menu_id = '.$menu['id']);

        // Jen pokud nějaké existují, tak píšu <ul> atd.
        if (count($sub_menus) > 0)
        {
            echo '<ul>';

            foreach ($sub_menus as $sub_menu)
                echo '<li><a class="hov-submenu" href="'.$sub_menu['submenu_url'].'">'.$sub_menu['submenu_name'].'</a></li>';

            echo '</ul>';
        }
        
        echo '</li>';
    }
    
    echo '
        </ul>
        <div class="nav-line"></div>
    </nav>';

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: