Vložená šablona nevidí nadřízené bloky: Cannot include undefined block

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

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
+
0
-

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
+
0
-

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
+
+1
-

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
+
0
-

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
+
0
-

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.