Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

Diskuze: dynamicke menu (li)

PHP PHP dynamicke menu (li) American English version English version

Aktivity (1)
Avatar
Bogdan
Redaktor
Avatar
Bogdan:29.11.2014 14:38

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
Avatar
Odpovídá na Bogdan
Martin Konečný (pavelco1998):29.11.2014 14:56

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
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Bogdan
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Bogdan:29.11.2014 15:18

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
Avatar
Odpovídá na Bogdan
Martin Konečný (pavelco1998):29.11.2014 16:58

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
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
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.