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.