Tag {define} jiná funkce než popisuje dokumentace
- m.brecher
- Generous Backer | 864
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
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
@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
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
@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
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.