Navigace pomocí closure table
- lunak83
- Člen | 47
Dobrý den. V článku http://tinyurl.com/bnjebul jsem se dočetl o principu Closure Table a rád bych ho použil na navigační menu. Nevím ale jak tuto strukturu propojit s doplňkem navigation, nebo vypsat ručně v šabloně když mám více menu na nejvyšší úrovni. Používáte prosím někdo Closure Table pro navigaci?
- raketoplan2005
- Člen | 147
Ahoj, řeším zrovna to samé, databázi mám navrženou takto:
tabulka category
id|name
tabulka category_closure
id|ancestor|descendant|depth
Udělal jsem v modelu select těch kategorií, které jsou kořenové:
$this->db->query('SELECT c.*, cc.depth FROM category c JOIN category_closure cc
ON (c.id = cc.descendant) WHERE ((SELECT COUNT(*) FROM category_closure
WHERE descendant = c.id)=1)');
A teď bych asi dělal ve foreachi pro každou nový dotaz do databáze na kompletní strom, který začíná tímto kořenem.
$this->db->query('SELECT c.*, cc.depth FROM category c JOIN category_closure cc
ON (c.id = cc.descendant)
WHERE cc.ancestor = XXX;
To je velké množství dotazů do DB, které se dělá při každém obnovení stránky.
To zcela určitě není správně, ale já zatím nevím jak z toho ven.
Editoval raketoplan2005 (24. 7. 2012 22:25)
- duskohu
- Člen | 778
Caute podarilo sa vam vyriesit ako radit (weight) jednotlive polozky? Mne sa strom porarilo vyriesit takto:
<ul>
{? $temp = 1; }
{foreach $childs as $node}
{if ($node->depth+1) > $temp}
<ul>
{? $temp = ($node->depth+1);}
{elseif (($node->depth+1) == $temp) && (!$iterator->isFirst())}
</li>
{elseif ($node->depth+1) < $temp}
</li>
{? $a=str_repeat("</ul></li>",$temp - ($node->depth+1))}
{!$a}
{? $temp = ($node->depth+1);}
{/if}
<li>{$node->name}
{/foreach}
</li>
{? $a=str_repeat("</ul></li>",$temp-1)}
{!$a}
</ul>