Variablen über Templates hinweg übergeben
Diese Anleitung erklärt, wie Variablen in Latte zwischen Templates übergeben werden – mit den verschiedenen Tags wie
{include}, {import}, {embed}, {layout}, {sandbox} und weiteren.
Sie erfahren außerdem, wie Sie mit Variablen innerhalb der Tags {block} und {define} arbeiten und wozu
der Tag {parameters} dient.
Arten von Variablen
Variablen lassen sich in Latte danach, wie und wo sie definiert werden, in drei Kategorien einteilen:
Eingabevariablen sind jene, die dem Template von außen übergeben werden, zum Beispiel aus einem PHP-Skript oder mit
einem Tag wie {include}.
$latte->render('template.latte', ['userName' => 'Jan', 'userAge' => 30]);
Umgebende Variablen sind Variablen, die an der Stelle eines bestimmten Tags existieren. Dazu gehören alle
Eingabevariablen und weitere Variablen, die mit Tags wie {var}, {default} oder innerhalb einer
{foreach}-Schleife entstanden sind.
{foreach $users as $user}
{include 'userBox.latte', user: $user}
{/foreach}
Explizite Variablen sind jene, die direkt in einem Tag angegeben und an das Ziel-Template gesendet werden.
{include 'userBox.latte', name: $user->name, age: $user->age}
{block}
Der Tag {block} dient dazu, wiederverwendbare Codeblöcke zu definieren, die sich in erbenden Templates anpassen
oder erweitern lassen. Umgebende Variablen, die vor dem Block definiert wurden, stehen innerhalb des Blocks zur Verfügung,
Änderungen an ihnen wirken sich jedoch nur innerhalb dieses Blocks aus.
{var $foo = 'original'}
{block example}
{var $foo = 'modified'}
{/block}
{$foo} // gibt aus: original
{define}
Der Tag {define} dient dazu, Blöcke zu erstellen, die erst beim Aufruf mit {include} gerendert
werden. Welche Variablen innerhalb dieser Blöcke verfügbar sind, hängt davon ab, ob in der Definition Parameter deklariert
sind. Ein Block mit deklarierten Parametern hat Zugriff sowohl auf diese Parameter als auch auf alle Eingabevariablen des
Templates, in dem er definiert ist. Ein Block ohne Parameter hat ebenfalls Zugriff auf diese Eingabevariablen. In keinem der
beiden Fälle stehen die umgebenden Variablen zur Verfügung.
{define hello}
{* hat Zugriff auf alle Eingabevariablen des Templates *}
{/define}
{define hello $name}
{* hat Zugriff auf den Parameter $name und die Eingabevariablen *}
{/define}
{parameters}
Der Tag {parameters} dient dazu, die erwarteten Eingabevariablen am Anfang des Templates ausdrücklich zu
deklarieren. So lassen sich die erwarteten Variablen und ihre Datentypen leicht dokumentieren. Es ist auch möglich, Standardwerte
festzulegen.
{parameters int $age, string $name = 'unknown'}
<p>Alter: {$age}, Name: {$name}</p>
{include file}
Der Tag {include file} dient dazu, ein ganzes Template einzufügen. Diesem Template werden sowohl die
Eingabevariablen des Templates, in dem der Tag verwendet wird, als auch die ausdrücklich angegebenen Variablen übergeben. Das
Ziel-Template kann den Umfang jedoch mit {parameters} einschränken.
{include 'profile.latte', userId: $user->id}
{include block}
Beim Einfügen eines Blocks, der im selben Template definiert ist, werden ihm alle umgebenden und ausdrücklich angegebenen Variablen übergeben:
{define blockName}
<p>Name: {$name}, Alter: {$age}</p>
{/define}
{var $name = 'Jan', $age = 30}
{include blockName}
In diesem Beispiel werden dem Block blockName die Variablen $name und $age übergeben.
Dasselbe Verhalten gilt für {include parent}.
Beim Einfügen eines Blocks aus einem anderen Template werden nur die Eingabevariablen und die ausdrücklich angegebenen Variablen übergeben. Umgebende Variablen stehen nicht automatisch zur Verfügung.
{include blockInOtherTemplate, name: $name, age: $age}
{layout} oder {extends}
Diese Tags definieren ein Layout, dem die Eingabevariablen des Kind-Templates und die im Code vor den Blöcken erzeugten Variablen übergeben werden:
{layout 'layout.latte'}
{var $seo = 'index, follow'}
Template layout.latte:
<head>
<meta name="robots" content="{$seo}">
</head>
{embed}
Der Tag {embed} ähnelt dem Tag {include}, erlaubt aber, Blöcke in das Template einzubetten. Anders
als bei {include} werden nur die ausdrücklich deklarierten Variablen übergeben:
{embed 'menu.latte', items: $menuItems}
{/embed}
In diesem Beispiel hat das Template menu.latte nur Zugriff auf die Variable $items.
Umgekehrt haben Blöcke innerhalb von {embed} Zugriff auf alle umgebenden Variablen:
{var $name = 'Jan'}
{embed 'menu.latte', items: $menuItems}
{block foo}
{$name}
{/block}
{/embed}
{import}
Der Tag {import} dient dazu, Blöcke aus anderen Templates zu laden. Den importierten Blöcken werden sowohl die
Eingabevariablen als auch die ausdrücklich deklarierten Variablen übergeben.
{import 'buttons.latte'}
{sandbox}
Der Tag {sandbox} isoliert das Template zur sicheren Verarbeitung. Variablen werden ausschließlich ausdrücklich
übergeben.
{sandbox 'secure.latte', data: $secureData}