Übergabe von Variablen über Templates hinweg

In diesem Leitfaden wird erklärt, wie Variablen zwischen Vorlagen in Latte mit Hilfe 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 können und welchen Zweck das Tag {parameters} erfüllt.

Arten von Variablen

Variablen in Latte können in drei Kategorien unterteilt werden, je nachdem, wie und wo sie definiert sind:

Eingabevariablen sind diejenigen, die von außen an die Vorlage übergeben werden, z. B. von einem PHP-Skript oder mit einem Tag wie {include}.

$latte->render('template.latte', ['userName' => 'Jan', 'userAge' => 30]);

Umgebungsvariablen sind Variablen, die an der Stelle eines bestimmten Tags existieren. Dazu gehören alle Eingabevariablen und andere Variablen, die mit Tags wie {var}, {default} oder innerhalb einer Schleife {foreach} erstellt werden.

{foreach $users as $user}
	{include 'userBox.latte', user: $user}
{/foreach}

Explizite Variablen sind diejenigen, die direkt in einem Tag angegeben und an die Zielvorlage gesendet werden.

{include 'userBox.latte', name: $user->name, age: $user->age}

{block}

Das Tag {block} wird verwendet, um wiederverwendbare Codeblöcke zu definieren, die in vererbten Vorlagen angepasst oder erweitert werden können. Die vor dem Block definierten Umgebungsvariablen sind innerhalb des Blocks verfügbar, aber alle Änderungen an den Variablen werden nur innerhalb dieses Blocks berücksichtigt.

{var $foo = 'original'}
{block example}
	{var $foo = 'modified'}
{/block}

{$foo}    // outputs: original

{define}

Das Tag {define} wird verwendet, um Blöcke zu erstellen, die nur gerendert werden, wenn sie mit {include} aufgerufen werden. Die innerhalb dieser Blöcke verfügbaren Variablen hängen davon ab, ob in der Definition Parameter angegeben sind. Wenn Parameter angegeben sind, sind nur diese Parameter zugänglich. Wenn nicht, sind alle Eingabevariablen der Vorlage, in der die Blöcke definiert sind, zugänglich.

{define hello}
	{* has access to all input variables of the template *}
{/define}

{define hello $name}
	{* has access only to the $name parameter *}
{/define}

{parameters}

Das Tag {parameters} wird verwendet, um erwartete Eingabevariablen am Anfang der Vorlage explizit zu deklarieren. Auf diese Weise können Sie erwartete Variablen und ihre Datentypen leicht dokumentieren. Es ist auch möglich, Standardwerte zu definieren.

{parameters int $age, string $name = 'unknown'}
<p>Age: {$age}, Name: {$name}</p>

{include file}

Das Tag {include file} wird verwendet, um eine komplette Vorlage einzufügen. Dieser Vorlage werden sowohl die Eingabevariablen der Vorlage, in der das Tag verwendet wird, als auch explizit definierte Variablen übergeben. Die Zielvorlage kann jedoch den Umfang mit {parameters} einschränken.

{include 'profile.latte', userId: $user->id}

{include block}

Beim Einfügen eines Blocks, der in derselben Vorlage definiert ist, werden alle umgebenden und explizit definierten Variablen an ihn übergeben:

{define blockName}
	<p>Name: {$name}, Age: {$age}</p>
{/define}

{var $name = 'Jan', $age = 30}
{include blockName}

In diesem Beispiel werden die Variablen $name und $age an den Block blockName übergeben. Das gleiche Verhalten gilt für {include parent}.

Beim Einfügen eines Blocks aus einer anderen Vorlage werden nur Eingabevariablen und explizit definierte Variablen übergeben. Umgebende Variablen sind nicht automatisch verfügbar.

{include blockInOtherTemplate, name: $name, age: $age}

{layout} oder {extends}

Diese Tags definieren ein Layout, an das Eingabevariablen der untergeordneten Vorlage und Variablen, die im Code vor den Blöcken erstellt wurden, übergeben werden:

{layout 'layout.latte'}
{var $seo = 'index, follow'}

Vorlage layout.latte:

<head>
	<meta name="robots" content="{$seo}">
</head>

{embed}

Der {embed} -Tag ähnelt dem {include} -Tag, ermöglicht aber die Einbettung von Blöcken in die Vorlage. Im Gegensatz zu {include} werden nur explizit deklarierte Variablen übergeben:

{embed 'menu.latte', items: $menuItems}
{/embed}

In diesem Beispiel hat die Vorlage menu.latte nur Zugriff auf die Variable $items.

Umgekehrt haben die Blöcke innerhalb von {embed} Zugriff auf alle umgebenden Variablen:

{var $name = 'Jan'}
{embed 'menu.latte', items: $menuItems}
	{block foo}
		{$name}
	{/block}
{/embed}

{import}

Das Tag {import} wird verwendet, um Blöcke aus anderen Vorlagen zu laden. Sowohl Eingabe- als auch explizit deklarierte Variablen werden an die importierten Blöcke übergeben.

{import 'buttons.latte'}

{sandbox}

Das Tag {sandbox} isoliert die Vorlage für eine sichere Verarbeitung. Variablen werden ausschließlich explizit übergeben.

{sandbox 'secure.latte', data: $secureData}
Version: 3.0