Předání proměnné do {block} v rámci {embed}

JaxP
Člen | 62
+
0
-

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}

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

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

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

Přístup k okolním proměnným se dal snadno doplnit, zkuste 2.10 master.

JaxP
Člen | 62
+
0
-

Super, funguje. Díky

JaxP
Člen | 62
+
0
-

@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)

David Grudl
Nette Core | 8218
+
+1
-

Je to opravené v 2.10 master.

JaxP
Člen | 62
+
0
-

Od commitu 9aace… funguje. Díky