Problém s block a parametry uvnitř v šabloně
- Petr Daňa
- Člen | 109
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
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
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
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…
- srigi
- Nette Blogger | 558
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 ;)
- David Grudl
- Nette Core | 8228
Sorry že oprava trvala tak dlouho, měl jsem za to, že je tam jiný problém, který tam nakonec nebyl.