Ü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}