Übergabe von Variablen zwischen Templates
Diese Anleitung erklärt, wie Variablen zwischen Templates in Latte mithilfe verschiedener Tags wie {include}
,
{import}
, {embed}
, {layout}
, {sandbox}
und anderen übergeben werden. Sie
erfahren auch, wie Sie mit Variablen in den Tags {block}
und {define}
arbeiten und wofür der Tag
{parameters}
dient.
Variablentypen
Variablen in Latte können je nachdem, wie und wo sie definiert sind, in drei Kategorien eingeteilt werden:
Eingabevariablen sind solche, die von außen an das Template übergeben werden, beispielsweise aus einem PHP-Skript oder
mithilfe eines Tags wie {include}
.
$latte->render('template.latte', ['userName' => 'Jan', 'userAge' => 30]);
Umgebungsvariablen sind Variablen, die an der Stelle eines bestimmten Tags existieren. Sie umfassen alle
Eingabevariablen und weitere Variablen, die mit Tags wie {var}
, {default}
oder innerhalb einer
{foreach}
-Schleife erstellt wurden.
{foreach $users as $user}
{include 'userBox.latte', user: $user}
{/foreach}
Explizite Variablen sind solche, die direkt innerhalb eines Tags spezifiziert und an das Ziel-Template gesendet werden.
{include 'userBox.latte', name: $user->name, age: $user->age}
{block}
Der Tag {block}
wird verwendet, um wiederverwendbare Codeblöcke zu definieren, die in vererbten Templates
angepasst oder erweitert werden können. Umgebungsvariablen, die vor dem Block definiert wurden, sind innerhalb des Blocks
verfügbar, aber jegliche Änderungen an Variablen wirken sich nur innerhalb dieses Blocks aus.
{var $foo = 'original'}
{block example}
{var $foo = 'geändert'}
{/block}
{$foo} // gibt aus: original
{define}
Der Tag {define}
dient zur Erstellung von Blöcken, die erst gerendert werden, wenn sie mit {include}
aufgerufen werden. Die innerhalb dieser Blöcke verfügbaren Variablen hängen davon ab, ob Parameter in der Definition angegeben
sind. Wenn ja, haben sie nur Zugriff auf diese Parameter. Wenn nicht, haben sie Zugriff auf alle Eingabevariablen des Templates,
in dem die Blöcke definiert sind.
{define hello}
{* hat Zugriff auf alle Eingabevariablen des Templates *}
{/define}
{define hello $name}
{* hat nur Zugriff auf den Parameter $name *}
{/define}
{parameters}
Der Tag {parameters}
dient zur expliziten Deklaration erwarteter Eingabevariablen am Anfang des Templates. Auf
diese Weise können erwartete Variablen und ihre Datentypen einfach dokumentiert werden. Es ist auch möglich, Standardwerte zu
definieren.
{parameters int $age, string $name = 'unbekannt'}
<p>Alter: {$age}, Name: {$name}</p>
{include file}
Der Tag {include file}
dient zum Einfügen eines gesamten Templates. An dieses Template werden sowohl die
Eingabevariablen des Templates, in dem der Tag verwendet wird, als auch die darin explizit definierten Variablen übergeben. Das
Ziel-Template kann jedoch den Umfang mit {parameters}
einschränken.
{include 'profile.latte', userId: $user->id}
{include block}
Wenn Sie einen Block einfügen, der im selben Template definiert ist, werden alle Umgebungs- und explizit definierten Variablen an ihn übergeben:
{define blockName}
<p>Name: {$name}, Alter: {$age}</p>
{/define}
{var $name = 'Jan', $age = 30}
{include blockName}
In diesem Beispiel werden die Variablen $name
und $age
an den Block blockName
übergeben. Genauso verhält sich auch {include parent}
.
Beim Einfügen eines Blocks aus einem anderen Template werden nur Eingabevariablen und explizit definierte Variablen übergeben. Umgebungsvariablen sind nicht automatisch verfügbar.
{include blockInOtherTemplate, name: $name, age: $age}
{layout}
oder {extends}
Diese Tags definieren ein Layout, an das die Eingabevariablen des untergeordneten Templates und weiterhin Variablen übergeben werden, die im Code vor den Blöcken erstellt wurden:
{layout 'layout.latte'}
{var $seo = 'index, follow'}
Das Template layout.latte
:
<head>
<meta name="robots" content="{$seo}">
</head>
{embed}
Der Tag {embed}
ähnelt dem Tag {include}
, ermöglicht jedoch das Einbetten von Blöcken in das
Template. Im Gegensatz zu {include}
werden nur explizit deklarierte Variablen übergeben:
{embed 'menu.latte', items: $menuItems}
{/embed}
In diesem Beispiel hat das Template menu.latte
nur Zugriff auf die Variable $items
.
Umgekehrt ist in Blöcken innerhalb von {embed}
der Zugriff auf alle Umgebungsvariablen möglich:
{var $name = 'Jan'}
{embed 'menu.latte', items: $menuItems}
{block foo}
{$name}
{/block}
{/embed}
{import}
Der Tag {import}
wird zum Laden von Blöcken aus anderen Templates verwendet. Es werden sowohl Eingabe- als auch
explizit deklarierte Variablen an die importierten Blöcke übertragen.
{import 'buttons.latte'}
{sandbox}
Der Tag {sandbox}
isoliert ein Template zur sicheren Verarbeitung. Variablen werden ausschließlich explizit
übergeben.
{sandbox 'secure.latte', data: $secureData}