Embed v embedu s předáním bloku, jde?

BayerMeister
Člen | 10
+
0
-

Čau, zkouším zanořit do sebe {embed}
a narážím na předání bloků hlouběji. Následující příklad jsem zjednodušil a zobecnil.

Dejme tomu mám šablonu default.latte:

{embed 'special.latte', rows: $someSelection}
	{block caption}<i class="fas fa-fw fa-comment-dollar"></i> Speciální nadpis{/block}
{/embed}

special.latte:

{varType Nette\Database\Table\Selection $rows}

<h1>{block caption}{/block}</h1>
<p>Tuna speciální vomáčky</p>
<table>
	<tr n:foreach="$rows as $r">
		<td>{$r->special}</td>
	</tr>
</table>

Ukázalo se, že mám ale další hodně podobné případy. Když jsem psal 3. variantu special.latte, už bylo jasný, že společné vyhodím do general.latte. Tak jsem to chtěl rozdělit, to ale možná takto nepůjde. general.latte:

{varType Nette\Database\Table\Selection $rows}

<h1>{block caption}{/block}</h1>
<p>{block sauce}{/block}</p>
<table>
	<tr n:foreach="$rows as $r">
		{block tableRow}{/block}
	</tr>
</table>

čímž by v každém special zbylo (nové special.latte):

{embed 'general.latte', rows: $someSelection}
	{block sauce}Tuna speciální vomáčky{/block}
	{block tableRow}{$r->special}{/block}
	{block caption}{include caption}{/block} {*Halt! So geht es nicht!*}
{/embed}

Blok caption definovaný venku skrz {embed} neprobublá. I kdyby se vnitřní caption přejmenoval na caption1, aby nebyl konflikt jmen, tak neprojde {block caption1}{include caption}{/block} (hláška zní „Cannot include undefined block ‚caption‘“). Můžu to zpátky zploštit, ale budu u každého {embed 'general.latte'... opakovat „Tunu speciální vomáčky“ a další. Přitom proměnné se předají snado.

Předem mockrát děkuju za návrhy.

Editoval BayerMeister (13. 2. 2022 11:39)

David Grudl
Nette Core | 8218
+
0
-

Tohle uvedeným způsobem udělat nejde. Leda přidat nějaké {include outer caption}, které by dokázalo načítat vnější bloky. Ale dá se to snadno vyřešit dědičností:

general.latte:

{varType Nette\Database\Table\Selection $rows}

<h1>{block caption}{/block}</h1>
<p>{block sauce}{/block}</p>
<table>
	<tr n:foreach="$rows as $r">
		{block tableRow}{/block}
	</tr>
</table>

special.latte:

{extends 'general.latte'}
{block sauce}Tuna speciální vomáčky{/block}
{block tableRow}{$r->special}{/block}

default.latte:

{embed 'special.latte', rows: $someSelection}
	{block caption}<i class="fas fa-fw fa-comment-dollar"></i> Speciální nadpis{/block}
{/embed}
BayerMeister
Člen | 10
+
+1
-

Díky, nasazeno a funguje. Přímá dědičnost uvnitř {embedu} mě vůbec nenapadla.

Buď svatořečen! :-)

RgB

Editoval BayerMeister (15. 2. 2022 18:20)