Navigace pomocí closure table

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

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

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)

Tabetha
Člen | 140
+
0
-

ja myslím ze s dotazmi by nemal byt problem…ja mam cca v strome 96 kategorii(vratane vnorenych)…cele to nabehne do (cela stranka) do 500 ms…vyhoda ze sa to aj cachuje…takze toho by som sa nebal

duskohu
Člen | 778
+
0
-

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>