Předání proměnné do {block} v rámci {embed}
- JaxP
- Člen | 62
Zkouším embedování bloků v Latte v2.10.2. Bohužel se mi však
nedaří použít proměnnou v rámci bloku uvnitř {embed}
.
{define nameBlock, $name, $className}
<div n:class=$className>
Můj string je:
{block name}
<i>{$name}</i>
{/block}
</div>
{/define}
{foreach ["hello","world"] as $someString}
{embed nameBlock, className: "bg-green"}
{block name}
{* Undefined variable $someString *}
<b>{$someString}</b>
{/block}
{/embed}
{/foreach}
V dokumentaci vidím pouze ukázky se statickým obsahem jako je například:
{block title}
Hello World
{/block}
Jak správně použít/předat proměnnou do {block}
v rámci
{embed}
? Děkuji
- Šaman
- Člen | 2659
Já si to už budu muset taky vyzkoušet, když se o tom teď všude
mluví.
Bez toho bych jen řekl, že bych čekal, že se má ten
$someString
nějak explicitně předat
{embed nameBlock, name: $someString, className: "bg-green"}
A v bloku pak pracovat s $name
. Ale možná jsem to pochopil
úplně špatně a budu si muset počkat na nějakou přednášku od Davida.
Vypadá to, že embedování by si nějakou zasloužilo, dost lidí je z toho
trochu zmatených.
Editoval Šaman (11. 2. 2021 11:27)
- JaxP
- Člen | 62
Je to tak. Pokud do embed
předám name
, který je
$someString
a v bloku $someString
přejmenuji na
$name
, tak to funguje.
{foreach ["hello","world"] as $someString}
{embed nameBlock, name: $someString, className: "bg-green"}
{block name}
<b>{$name}</b>
{/block}
{/embed}
{/foreach}
Pokud bych však chtěl v bloku implementovat nějakou pokročilejší logiku, pro kterou původní block neobsahuje proměnné v definici, tak to nefunguje:
{foreach ["hello","world"] as $key => $someString}
{* Původni nameBlock neobsahuje $key, ale v embedu bych ho rád použil *}
{embed nameBlock, key: $key, name: $someString, className: "bg-green"}
{block name}
{* Undefined variable $key *}
{if $key % 2}
<b>1: {$someString}</b>
{else}
<u>2: {$someString}</u>
{/if}
{/block}
{/embed}
{/foreach}
Doufal jsem, že pomocí embed
nahradím moje řešení za
použití capture
a include
.
{define nameBlock, $name, $className}
<div n:class=$className>
Můj string je: {$name}
</div>
{/define}
{foreach ["hello","world"] as $key => $someString}
{capture $newName}
{if $key % 2}
<b>1: {$someString}</b>
{else}
<u>2: {$someString}</u>
{/if}
{/capture}
{include nameBlock, name: $newName, className: "bg-grey"}
{/foreach}
Je možné, že to embed
umí, ale nevím jak. Nebo že není
určený pro tento účel. Výhodou u embed
by byla možnost
přetěžování celých bloků popř. mít možnost defaultního zobrazení
pokud blok nepřetížím.
Editoval JaxP (11. 2. 2021 11:59)
- David Grudl
- Nette Core | 8218
Přístup k okolním proměnným se dal snadno doplnit, zkuste 2.10 master.
- JaxP
- Člen | 62
@DavidGrudl
Ještě jsem si všiml jedné zvláštnosti u použití embed. Opět si nejsem
jistý, zda jsem dokumentaci pochopil správně. Pokud importuji blok z jiné
šablony pomocí import
a chci ho embedovat, již nemohu dále
přepisovat jeho vnitřní bloky.
Příklad:
✓ Mám jeden soubor:
{* myTemplate.latte *}
{define blockOuter}
{block blockInner}
nepřepsaný
{/block}
{/define}
{embed blockOuter}
{block blockInner}
přepsaný
{/block}
{/embed}
a výstup je přepsaný
což je dle mého
očekávání v pořádku.
✓ Mám externí soubor, který embeduji:
{* myTemplate.latte *}
{embed "@myBlock.latte"}
{block blockInner}
přepsaný
{/block}
{/embed}
{* @myBlock.latte *}
<div>
{block blockInner}
nepřepsaný
{/block}
</div>
výstup je přepsaný
– stále v pořádku,
ale používám celou šablonu místo bloku
✘ Mám externí soubor, který importuji a chci použít jeho bloky:
{* myTemplate.latte *}
{import "@myBlock.latte"}
{embed blockOuter}
{block blockInner}
přepsaný
{/block}
{/embed}
{* @myBlock.latte *}
{define blockOuter}
{block blockInner}
nepřepsaný
{/block}
{/define}
výstup je nepřepsaný
. Latte se naimportovalo
v pořádku, embedovaný blok byl nalezen a vykreslen, ale jeho vnitřní bloky
již nejsou přetíženy.
Chtěl jsem položit recyklovatelné bloky do jiné šablony, kterou budu v případě potřeb importovat a přetěžovat.
Editoval JaxP (17. 2. 2021 15:57)