Problém s block a parametry uvnitř v šabloně

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

Ahoj, zkoušel jsem nasadit komponentu NavigationBuilder od Karla Klímy, ale nějak mi nefunguje vykreslování bloku, který má v příkladě použití. Co jsem ho porovnával s příkladem v dokumentaci, tak to odpovídá. Problém je, že se dovnitř bloku nepřenese proměnná z vnějšku.

Konkrétně ta proměnná children. Zkoušel jsem i do toho block přidat , 'children' => $item->getItems(), ale nepomohlo to. Výsledkem je, že ve vygenerované šabloně je pro foreach iterator předávána proměnná $children, která ale obsahuje NULL. Jinak ta childeren proměnná naplněná je, mám to ověřené přes dump mezi assign a block.

Ve vygenerované šabloně je volání

<?php
call_user_func(reset($_cb->blocks['nav']), $_cb, $template->getParams());
?>

tak počítám, že ten $template->getParams() nevrátí proměnnou $children, která byla naplněna na začátku pomocí assign.

Co dělám blbě? Prolezl jsem dokumentaci i fórum, ale asi jsem slepej. Zkoušel jsem to na vývojové verzi ze 14.3.2010.

<?php
{assign children $control->getRoot()->getItems()}
{block #nav}
	{foreach $children as $item}
	<li{if $item->isCurrent} class="current"{/if}><a href="{$item->url}">{$item->label}</a>
	{if count($item->getItems())}
		<ul>
			{include #nav, 'children' => $item->getItems()}
		</ul>
	{/if}
	</li>
	{/foreach}
{/block}
?>

EDIT:

Tak jsem ještě víc prozkoumal vygenerovanou šablonu, a při volání bloku tam bylo:

<?php
<?php $children = $control->getRoot()->getItems() ;if (function_exists("debugbreak")) debugbreak(); elseif (function_exists("xdebug_break")) xdebug_break() ;if (!$_cb->extends) { call_user_func(reset($_cb->blocks['nav']), $_cb, $template->getParams()); } ?>
?>

Takže ten assign vytvoří jen lokální proměnnou, která není součástí $template. Zatím jsem to obešel tím, že místo assign jsem použil

<?php
{?$template->children = $control->getRoot()->getItems()}
?>

což vygeneruje

<?php
<?php $template->children = $control->getRoot()->getItems() ;if (function_exists("debugbreak")) debugbreak(); elseif (function_exists("xdebug_break")) xdebug_break() ;if (!$_cb->extends) { call_user_func(reset($_cb->blocks['nav']), $_cb, $template->getParams()); } ?>
?>

a to už je v pořádku a block normálně funguje.

Jak by se teda měly správně předávat proměnné do bloku? Udivuje mě, že takhle to je ve všech příkladech dané komponenty a nikdo se neozval… Změnilo se teda něco ve vývojové verzi Nette nebo jak?

Editoval Petr Daňa (19. 3. 2010 16:04)

LM
Člen | 206
+
0
-

Je to hlášeno https://github.com/…nette/issues#… a https://github.com/…nette/issues#…. Nette verze 0.9 (stabilní) tímhle myslím netrpí.

Petr Daňa
Člen | 109
+
0
-

Tak nevím, jestli to David čte, ať už tady na fóru nebo na tom GitHubu, ale už vyšlo několik dalších dev verzí, ovšem oprava nikde :-( Tohle mi přijde teda důležitější, než nějaký DebugBar… Jasně, můžu si to opravit sám, je to jednoduchá záležitost, navíc popsaná přímo u bug hlášení na Gitu, jenže to bych to pak musel hlídat a upravovat při každé nové dev verzi.

Editoval Petr Daňa (8. 4. 2010 8:09)

kravčo
Člen | 721
+
0
-

Petr Daňa napsal(a):

Tak nevím, jestli to David čte, ať už tady na fóru nebo na tom GitHubu, ale už vyšlo několik dalších dev verzí, ovšem oprava nikde :-( Tohle mi přijde teda důležitější, než nějaký DebugBar… Jasně, můžu si to opravit sám, je to jednoduchá záležitost, navíc popsaná přímo u bug hlášení na Gitu, jenže to bych to pak musel hlídat a upravovat při každé nové dev verzi.

Ak ti to príde dôležitejšie a navyše je to jednoduchá oprava, môžeš to opraviť a poslať patch. Pomôžeš tým sebe aj ostatným…

Petr Daňa
Člen | 109
+
0
-

Ta oprava je přímo v bug reportu, který už dávno hlásil někdo jiný – konkrétně první odkaz v příspěvku #2 v tomto vlákně. Problém je, že se k němu David pořád nevyjádřil, takže nikdo neví, jestli to je schválně nebo jestli je to opravdu bug.

srigi
Nette Blogger | 558
+
0
-

Petr Daňa napsal(a):

Ta oprava je přímo v bug reportu, který už dávno hlásil někdo jiný – konkrétně první odkaz v příspěvku #2 v tomto vlákně. Problém je, že se k němu David pořád nevyjádřil, takže nikdo neví, jestli to je schválně nebo jestli je to opravdu bug.

To ale nie je oprava, ale workaround ;)

Vyki
Člen | 388
+
0
-

srigi napsal(a):
To ale nie je oprava, ale workaround ;)

Když jsem si to tu včera četl tak mě napadlo úplně to samé. Škoda, že naní znám algoritmus podle, kterého se přisuzuje chybám v Nette závažnost :o)

David Grudl
Nette Core | 8139
+
0
-

Sorry že oprava trvala tak dlouho, měl jsem za to, že je tam jiný problém, který tam nakonec nebyl.

Petr Daňa
Člen | 109
+
0
-

Super, díky moc… Zajásal jsem, když jsem otevřel RSS čtečku a tam na mě vybafla tahle oprava :)