Rekurzivní volání bloku v šabloně

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

Ahoj,
s Nette se teprve učím, a narazil jsem na malý zádrhel při rekurzivním volání bloku v šabloně.

Dělám stromovou strukturu kategorií a potřeboval bych, aby se mi při první zavolání bloku #menu u ul nastavila class=„categoryTree“, ale při druhém a dalším zavolání už zůstalo pouze prázdné <ul>

Zkoušel jsem to přes nastavení var rekurze, ale to mi nějak nefunguje… Mohu poprosit o radu, co dělám špatně?

{var $rekurze = 0}
{block #menu}
<ul{if $rekurze == 0} class="categoryTree"{/if}>
{foreach $categoryTree as $item}
<li><a n:href="Category:default">{$item->title}</a>{if $item->children} {include #this, categoryTree => $item->children}{/if}</li>
{/foreach}
</ul>
{var $rekurze = 1}
{/block}

Editoval darkwind (28. 4. 2012 17:28)

nanuqcz
Člen | 822
+
0
-

Ahoj,
to s tou {var $rekurze = 1} jsem nepochopil :-) Ale já bych to udělal takto:

{var $depth = 0}

{block #menu}
{?$depth++}
<ul n:class="$depth == 1? categoryTree">
	{foreach $categoryTree as $item}
	<li>
		<a n:href="Category:default">{$item->title}</a>
		{if $item->children} {include #this, categoryTree => $item->children}{/if}
	</li>
	{/foreach}
</ul>
{/block}

Editoval nanuqcz (28. 4. 2012 17:31)

darkwind
Člen | 32
+
0
-

no, ono to rekurze mělo fungovat podobně jako to tvoje $depth, akorat to je jinak pojmenované :-) cílem bylo, aby na začátku byla hodnota 0, a až to aspoň jednou projde, tak se mu nastaví 1.

myšlenka podobná, provedení o trochu horší :D

děkuju moc za radu, to tvoje samozřejmě funguje :))

22
Člen | 1478
+
0
-

to se da asi zapsat elegantněji, nástřel níže, imho proměna se do bloku nedostane, pokud je definovan mimo něj, myslím, ale myslet znamená houby vědět :-)

{block #menu}
{var $rekurze = 0}
<ul n:class="$rekurze === 0 ? categoryTree" n:inner-foreach="$categoryTree as $item">
	<li>
		<a n:href="Category:default">{$item->title}</a>
		{if $item->children}
			{include #this, categoryTree => $item->children}
		{/if}
	</li>
	{var rekurze = 1}
</ul>
{/block}
nanuqcz
Člen | 822
+
0
-

Aha, už asi chápu, podle mě byl problém v tom, že {var rekurze = 1} bylo voláno až po volání {include}. Takže nejdřív se rekurzivně vykreslilo celé menu, a pak až se hodnota rekurze nastavila na 1.

darkwind
Člen | 32
+
0
-

jj, došlo mi to v momentě, kdy jsem viděl tvoje řešení :))

každopádně díky všem, zkombinoval jsem, co tu padlo, nahradil ten foreach za n:inner-foreach a jsem rád, že jsem se naučil něco nového :)