Předání proměnných blokům v šablonách

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
mancze
Člen | 58
+
0
-

Ahoj,

narazil jsem na následující užití šablon, které by snad mělo jít vyřešit elegantněji. Týká se dědičnosti:

Potřebuji mít v nadřazené šabloně (@layout.phtml) definovaný blok, který má vesměs stejnou strukturu, ale chci mít možnost na různých stránkách upravit hodnoty na některých jeho místech.

@layout.phtml:
...
{block #image}<img src="{$baseUri}images/{$filename}" width="{$width}" height="{$height}" alt="{$alt}" />{/block}
...

Nechce se mi používat globální proměnné – nezdá se mi to jako pěkné řešení (kolize jmen, „k čemu je v šabloně tato proměnná…?“). Navíc na některých stránkách nepotřebuji vložit img, ale třeba flash, někde blok nechci zobrazit vůbec.

Ano, aktuální řešení je možné a to vcelku pěkně:

v šablonách:
...
{extends $layout}
{block #image}{include #parent filename => "image", width => 100, height => 42}{/block}
...

Přesto si myslím, že by to šlo vyřešit elegantněji:

v šablonách:
...
{extends $layout}
{block #image filename => "image", width => 100, height => 42 /}
...

Myslím, že by to mohla být další pěkná vlastnost šablon. Samozřejmě pokud to s něčím nekoliduje – vývoj frameworku pomalu nestíhám sledovat 0:).

Pokud by se taková vlastnost měla implementovat, nebylo by navíc ku škodě mít možnost nastavit např. výchozí hodnoty v kořenové definici bloku:

@layout.phtml:
...
{block #image filename => "defaultFilename", height => 100, ...}<img src="{$baseUri}images/{$filename}" width="{$width}" height="{$height}" alt="{$alt}" />{/block}
...

Možná to šablony už podobně pěkným způsobem umí, ale jen jsem to přehlídl. V takovém případě budu rád za poučení.

Jan Tvrdík
Nette guru | 2595
+
0
-

Výchozí hodnoty lze nastavit makrem {default} (dokumentace).

{block #image}
    {default filename => "defaultFilename", height => 100, ...}
    <img src="{$baseUri}images/{$filename}" width="{$width}" height="{$height}" alt="{$alt}" />
{/block}

Zápis {block #image filename => "image", width => 100, height => 42 /} mi přijde moc magický. Spíš bych vytvořil nové makro {setBlockParams #imagem filename => "image", width => 100, height => 42}, ale do distribuce bych ho asi nezařazoval.