Ü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}
Version: 3.0