Vložená šablona nevidí nadřízené bloky: Cannot include undefined block
- ludek
- Člen | 83
Zdravím a prosím radu. Mám poměrně komplikovanou šablonu a rád bych ji
kvůli přehlednosti rozřezal na menší kousky do dílčích souborů. Když
ale ve vložené šabloně zavolám blok definovaný v nadřízené, dostanu
Cannot include undefined block
.
hlavni.latte:
{block content}
{define vykresli}
<div>Vykresli něco...</div>
{/define}
<div>
{include "podrizena1.latte"}
</div>
<div>
{include "podrizena2.latte"}
</div>
<div>
{include "podrizena2.latte"}
</div>
podrizena1.latte:
<p>Následující řádek způsobí "Cannot include undefined block".</p>
{include vykresli}
Dokud kus kódu neoddělím do zvláštního souboru, všechno funguje. Je nějaká možnost, jak toto udělat? Nette 2.3.2. Díky.
- David Matějka
- Moderator | 6445
Takto inkludovane sablony maji vlastni scope bloku. Je zde ale makro „includeblock“, ktere sdili bloky se svoji nadrazenou sablonou, ale jeho pouziti je spise obracene, tedy ze mas
hlavni.latte
{block #content}
{includeblock "podrizena1.latte"}
{include #foo}
a v podrizena1.latte mas definovane bloky:
{block #foo}
..
Takze to makro includeblock by melo slouzit spise ke vkladani bloku.
Ale vzhledem k tomu, jak je to implementovane, by mohlo jit pouzit i pro tvuj pripad (tedy melo by pouze stacit nahradit include za includeblock). Ale zvaz, jestli je to vhodny pristup, zda by se napriklad vice nehodily komponenty.
- ludek
- Člen | 83
Díky. Aha, původně jsem předpokládal, že se šablona nejdřív sestaví a pak zpracuje. Tohle pro mě asi není vhodné, protože v blocích navíc pracuju s proměnnými a pořád dostávám nějaké chyby.
{block content}
{define vykresli}
<div>Vykresli něco jako {$foo}...</div>
{/define}
{* odsud *}
{var $foo = 'pes'}{include vykresli}
{var $foo = 'kočka'}{include vykresli}
{* až sem jsem to chtěl odsunout do zvláštního souboru a includovat *}
Nechám to tak a v budoucnu rozmyslím co s tím. Díky.
- petr.pavel
- Člen | 535
Sice moc nechápu, proč bys to chtěl takto dělat, ale takhle by to šlo ohnout:
{block content}
{define vykresli}
<div>Vykresli něco jako {$foo}...</div>
{/define}
{capture $obsah}
{include vykresli foo => 'pes'}
{include vykresli foo => 'kočka'}
{/capture}
{include odsudsem obsah => $obsah}
P.S. Tohle vlákno oživuju, protože jsem teď potřeboval na úrovni
rodiče definovat blok a vložit ho v externím dítěti. Vyřešil jsem to
přes makro capture
.
- vymak
- Člen | 92
Ahoj, řeším podobný problém.
Mám klasický @layout.latte a v něm
....
<div class="row">
<div class="col-lg-12">
<script> document.documentElement.className += ' js'</script>
{snippet flashes}
{control flashMessageAdmin}
{/snippet}
</div>
{include #content}
</div>
dále mám ve složce templates/News/edit.latte soubor s následujícím obsahem:
{block content}
<div class="col-lg-12">
<h1 class="page-header">Aktualizace novinky</h1>
</div>
<div class="col-lg-8">
<div class="panel panel-default">
<div class="panel-body">
{control news}
</div>
</div>
</div>
{/block}
a {control news} má v šabloně tohle:
{control news}
Pokud {control news} z edit.latte souboru odeberu, vše funguje v pořádku. S Nette 2.3 fungovalo vše v pořádku. S Nette 2.4 mi to však zprovoznit nelze a vyhazuje to chybu:
Cannot include undefined block ‚content‘.
Díky za případné rady.
EDIT: Tak už jsem zjistil, že Nette 2.4 za chybu nemůže, ale je způsobena nastavením rendereru formuláře :)
...
$form->setRenderer(new BootstrapRenderer);
return $form;
když nastavení rendereru zakomentuji, vše v pořádku funguje.
Editoval vymak (1. 9. 2016 22:36)
- ludek
- Člen | 83
vymak napsal(a):
EDIT: Tak už jsem zjistil, že Nette 2.4 za chybu nemůže, ale je způsobena nastavením rendereru formuláře :)$form->setRenderer(new BootstrapRenderer);
když nastavení rendereru zakomentuji, vše v pořádku funguje.
U mě totéž. Po upgradu na Nette 2.4 přestal fungovat Instante/Bootstap3Renderer,
hláška Cannot include undefined block
moc nápomocná není a
zatím nevím v čem je problém.