Tag {define} jiná funkce než popisuje dokumentace

m.brecher
Generous Backer | 864
+
0
-

Ahoj,

přemýšlím jak správně použít tag {define} https://latte.nette.org/…-inheritance#…

V dokumentaci čtu:

"… jsou definice stejné jako bloky a všechno, co je o blocích řečeno, platí také pro definice. Liší se od bloků tím, že:
a) jsou uzavřeny ve značkách {define}
b) vykreslí se teprve, až když je vložíte přes {include}
c)lze jim definovat parametry podobně jako funkcím v PHP

Na konci bloku o definicích je další informace k funkci definic:

d) Definice nemají přístup k proměnným aktivního kontextu, ale mají přístup ke globálním proměnným.

Otestoval jsem popsané funkce a) až d) s tímto výsledkem:

a), c) – platí co je v dokumentaci

b) – neplatí co je v dokumentaci:

@layout.latte:

{block 'message'}{/block}

actionTemplate.latte:

{define 'message'}<p>hallo</p>{/define}

html výstup:

<p>hallo</p>

Definice tedy přepisují bloky v nadřazených šablonách stejně jako {block}-y

d) – neplatí co je v dokumentaci:

@layout.latte:

{block 'message'}{/block}

actionTemplate.latte:

{var
    $text = 'ahoj'  {* lokální proměnná aktivního kontextu *}
}
{define 'message'} <p>{$text}</p>{/define}

html výstup:

<p>ahoj</p>

Definice tedy mají přístup k lokálním proměnným aktivního kontextu – stejně jako {block}-y.

Závěr: Definice tedy nejsou nic jiného než normální bloky {block} a liší se jedinou věcí a sice tím, že jim lze definovat vstupní proměnné.

Je to celkem rozumná funkcionalita, takže bych ji navrhoval ponechat jak je, ale změnit odpovídajícím způsobem ty pasáže v dokumentaci, které neplatí.

Díky za jakékoliv komentáře nebo připomínky.

edit

I když vlastně hledám ideální způsob jak členit bloky v šabloně a {define} se zdál být ideálně pro toto navržen – kdyby automaticky nepřepisoval bloky v nadřazených šablonách, ale šlo by ho pouze vložit pomocí {include} – a to jak v aktuální šabloně, tak i v nadřazených šablonách. Lokální blok zase neumí definovat vstupní parametry. Stálo by tedy za to funkci {define} takto upravit. Potom by tento tag měl smysluplné praktické použití. Protože když jej chci použít v šabloně pro lepší strukturování obsahu, tak nechci, aby se ještě paralelně přenášel do nadřazených šablon.

Editoval m.brecher (24. 1. 21:47)

Kamil Valenta
Člen | 815
+
+2
-

m.brecher napsal(a):

Závěr: Definice tedy nejsou nic jiného než normální bloky {block} a liší se jedinou věcí a sice tím, že jim lze definovat vstupní proměnné.

Takový závěr úplně dobře není. Přehlížíš např. poměrně důležitou skutečnost, že {define} se do svého zavolání, na rozdíl od {block}, nevykreslí.

m.brecher
Generous Backer | 864
+
0
-

@KamilValenta

že {define} se do svého zavolání, na rozdíl od {block}, nevykreslí.

Tak by mělo být, ale jsou situace, kdy se {define} vykreslí automaticky úplně stejně jako {block}, což je nežádoucí. Testovací kód:

@layout.latte:

{block 'test'}{/block}

šablona akce:

Home.default.latte:

{block 'test'}
   <p>test block</p>    {* vykreslí se v layoutu *}
{/block}

{* varianta s {define}  *}

{define 'test'}
   <p>test define</p>    {* vykreslí se taky !! *}
{/block}

Kamil Valenta
Člen | 815
+
0
-

To je situace, která by Ti neměla vůbec nastat a měla padnout na:

Latte\CompileException Cannot redeclare define 'test'
m.brecher
Generous Backer | 864
+
0
-

@KamilValenta

Latte\CompileException Cannot redeclare define ‚test‘

Ten kód jsem testoval, ale samozřejmě jsem neměl {block ‚test‘} a {define ‚test‘} pohromadě, ale vždycky jenom jednu z variant. Test potvrdil, že blok {define} vybublá automaticky do layoutu a tam se vykreslí – pokud tam je blok shodného jména. Což obvykle není, ale může se to náhodně stát. Proto by bylo fajn, kdyby bloky {define} v žádném případě nebublaly automaticky do layoutu ale zůstaly tam, kde byly definovány.

Kamil Valenta
Člen | 815
+
+1
-

Jenže na Latte je potřeba nahlížet jako na objekt, ve kterém se vše připraví a na závěr vyplivne na výstup.