Dropdown menu v šabloně z databáze

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Blaueminence
Člen | 31
+
0
-

Dobrý den,
snažím se vytvořit dropdown menu o více úrovních (zatím alespoň dvou), které mám uložené v databázi – jedna položka je jeden řádek a případně odkazuje cizím klíčem na svého předka.

Kód vypadá následovně:

<div class="menu" id="menu">
    <div id="nav">
        <ul>
            {var $basemenu=$menu->where('id_parent', NULL)}
            <li n:foreach="$basemenu as $item">
                <a href="{$item->link}">
                    <div n:if="$item->icon" class="icon">{$item->icon}</div>
                    {$item->label_cz}
                </a>
                {var $children=$menu->where('id_parent = ?', $item->id_menu_item)}
                <ul n:if="$children">
                    <li n:foreach="$children as $child">
                        child
                    </li>
                </ul>
            </li>
        </ul>
    </div>
</div>

Základní menu funguje v pořádku, pokud odstraním vložený cyklus foreach za druhou úroveň. Pokud ho tam ale nechám, vypíše se pouze první položka základního menu (která podpoložky nemá) a dál základní cyklus nepokračuje. Navíc se mi generuje nesmyslný SQL dotaz za vnořený cyklus

SELECT `id_menu_item, link, label_cz, icon
FROM menu
WHERE (id_parent IS NULL) AND (id_parent = 1)`

Tušíte někdo, co s tím? Děkuji.

Jan Tvrdík
Nette guru | 2595
+
0
-

Tohle je problém týkající se Nette Database, přesouvám. Pravděpodobně tam bude potřeba přidat clone nebo tak něco.

David Matějka
Moderator | 6445
+
+1
-

Selection si vsechny „where“ pamatuje a spoji je ANDem. Proto vetsinou jedno Selection==jeden dotaz.

Pouzij related

Blaueminence
Člen | 31
+
0
-

Výborně, díky moc. Dal jsem $children=$item->related('menu.id_parent') a funguje to. Nechápu, proč mě to nenapadlo hned:-)