Avatar
BlugW
Redaktor
Avatar
BlugW:

Hoj,
potřeboval bych poradit s dynamickým menu.
Jde o to že mám menu pomoci seznamu, a u některých položek po najeti mi vyjede nabídka a u některých nevyjede nic.

HTML navigace:

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

PHP:

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

mám na to 2 tabulky, jedná pro menu a druha pro submenu.

Menu:

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;

Submenu"

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;

Už jsem se v tom zamotal.
Jde mi o to aby se ul v li uzavřelo až po vypsání všech položek a ne jen 1.
A tam kde není podmenu aby se ul nevypsalo vůbec.

Budu vděčný za radu.

Editováno 29.11.2014 14:40
Odpovědět 29.11.2014 14:38
Pořiď si mac na www.appletrh.cz. Novinky a zajímavosti ze světa Apple na https://www.applemagazin.eu
Avatar
Odpovídá na BlugW
Martin Konečný (pavelco1998):

Pokud se dívám správně, tak špatně vypisuješ to submenu - procházíš jednotlivé položky hlavního menu a ke všem vypisuješ všechny položky submenu.
Je více možností, jak to udělat. Jednoduchý příklad:

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

echo "<ul>";
foreach ($menus as $menu) {
  $submenus = Db::queryAll("SELECT * FROM " . SUBMENU . " WHERE menu_id = ?", $menu["id"]);

  echo "<li>";

  if (!empty($submenus)) {  // pokud se nějaké řádky našly
    echo "<ul>";
    foreach ($submenus as $submenu) {
      echo "<li>" ... "</li>";
    }
    echo "</ul>";
  }

  echo "</li>";
}
echo "</ul>";

Druhá možnost, která mě teď napadla, je ta, že bys to submenu nenacházel jednotlivě v tom foreach, ale nalezl všechny řádky a uložil si je pod klíčem ID menu.
Tzn. že by to vypadalo nějak takhle

$submenus = array(
  3 => array(
     ...
  ),

  5 => array(
     ...
  )
)

// klíče = ID menu

pak bys v tom foreach jen napsal

if (isset($submenus[$menu["id"]])) {
  // menu obsahuje submenu
}
Editováno 29.11.2014 14:58
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 29.11.2014 14:56
Avatar
BlugW
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
BlugW:

Ono to jde tak jednoduše a já se s tím patlal pár hodin :D
Díky zkusil jsem první řešení a pomohlo .

Nahoru Odpovědět 29.11.2014 15:18
Pořiď si mac na www.appletrh.cz. Novinky a zajímavosti ze světa Apple na https://www.applemagazin.eu
Avatar
Odpovídá na BlugW
Martin Konečný (pavelco1998):

To jsi na tom ještě v poho, já se dokážu patlat pár hodin s věcí, ve který nakonec ani chyba není.

 
Nahoru Odpovědět  +2 29.11.2014 16:58
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.