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

- BayerMeister
- Člen | 10
Č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 | 8285
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
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)