Syntax

Die Syntax von Latte entstand aus den praktischen Anforderungen von Webdesignern. Wir suchten nach der benutzerfreundlichsten Syntax, mit der Sie auch Konstrukte elegant schreiben können, die sonst eine echte Nuss darstellen. Gleichzeitig werden alle Ausdrücke genauso wie in PHP geschrieben, sodass Sie keine neue Sprache lernen müssen. Sie nutzen einfach das, was Sie schon lange können.

Unten sehen Sie ein minimales Template, das einige grundlegende Elemente veranschaulicht: Tags, n:Attribute, Kommentare und Filter.

{* dies ist ein Kommentar *}
<ul n:if=$items>                  {* n:if ist ein n:Attribut *}
{foreach $items as $item}         {* Tag, das eine foreach-Schleife darstellt *}
	<li>{$item|capitalize}</li>   {* Tag, das eine Variable mit einem Filter ausgibt *}
{/foreach}                        {* Ende der Schleife *}
</ul>

Sehen wir uns diese wichtigen Elemente genauer an und wie sie Ihnen helfen können, ein erstaunliches Template zu erstellen.

Tags

Ein Template enthält Tags, die die Logik des Templates steuern (z. B. foreach-Schleifen) oder Ausdrücke ausgeben. Für beides wird ein einziger Delimiter { ... } verwendet, sodass Sie nicht überlegen müssen, welchen Delimiter Sie in welcher Situation verwenden sollen, wie es bei anderen Systemen der Fall ist. Wenn auf das Zeichen { ein Anführungszeichen oder ein Leerzeichen folgt, betrachtet Latte es nicht als Anfang eines Tags, wodurch Sie in Templates problemlos auch JavaScript-Konstrukte, JSON oder Regeln in CSS verwenden können.

Sehen Sie sich die Übersicht aller Tags an. Darüber hinaus können Sie auch eigene Tags erstellen.

Latte versteht PHP

Innerhalb von Tags können Sie PHP-Ausdrücke verwenden, die Sie gut kennen:

  • Variablen
  • Zeichenketten (einschließlich HEREDOC und NOWDOC), Arrays, Zahlen usw.
  • Operatoren
  • Funktions- und Methodenaufrufe (die durch die Sandbox eingeschränkt werden können)
  • match
  • anonyme Funktionen
  • Callbacks
  • mehrzeilige Kommentare /* ... */
  • usw.

Latte ergänzt die PHP-Syntax außerdem um einige angenehme Erweiterungen.

n:Attribute

Alle paarweisen Tags, wie z. B. {if} … {/if}, die auf einem einzelnen HTML-Element operieren, können in Form von n:Attributen umgeschrieben werden. So könnte beispielsweise auch {foreach} im einleitenden Beispiel geschrieben werden:

<ul n:if=$items>
	<li n:foreach="$items as $item">{$item|capitalize}</li>
</ul>

Die Funktionalität bezieht sich dann auf das HTML-Element, in das sie platziert ist:

{var $items = ['Ich', '♥', 'Latte']}

<p n:foreach="$items as $item">{$item}</p>

gibt aus:

<p>Ich</p>
<p>♥</p>
<p>Latte</p>

Mit dem Präfix inner- können wir das Verhalten so anpassen, dass es sich nur auf den inneren Teil des Elements bezieht:

<div n:inner-foreach="$items as $item">
	<p>{$item}</p>
	<hr>
</div>

Es wird ausgegeben:

<div>
	<p>Ich</p>
	<hr>
	<p>♥</p>
	<hr>
	<p>Latte</p>
	<hr>
</div>

Oder mit dem Präfix tag- wenden wir die Funktionalität nur auf die HTML-Tags selbst an:

<p><a href={$url} n:tag-if="$url">Titel</a></p>

Dies gibt abhängig von der Variablen $url aus:

{* wenn $url leer ist *}
<p>Titel</p>

{* wenn $url 'https://nette.org' enthält *}
<p><a href="https://nette.org">Titel</a></p>

n:Attribute sind jedoch nicht nur Abkürzungen für paarweise Tags. Es gibt auch reine n:Attribute, wie z. B. n:href oder der sehr praktische Helfer für Programmierer n:class.

Filter

Sehen Sie sich die Übersicht der Standardfilter an.

Filter werden nach einem senkrechten Strich geschrieben (ein Leerzeichen davor ist erlaubt):

<h1>{$heading|upper}</h1>

Filter können verkettet werden und werden dann in der Reihenfolge von links nach rechts angewendet:

<h1>{$heading|lower|capitalize}</h1>

Parameter werden nach dem Filternamen, getrennt durch Doppelpunkte oder Kommas, angegeben:

<h1>{$heading|truncate:20,''}</h1>

Filter können auch auf einen Ausdruck angewendet werden:

{var $name = ($title|upper) . ($subtitle|lower)}

Auf einen Block:

<h1>{block |lower}{$heading}{/block}</h1>

Oder direkt auf den Wert (in Kombination mit dem Tag {=expr}):

<h1>{='  Hallo Welt  '|trim}<h1>

Dynamische HTML-Tags

Latte unterstützt dynamische HTML-Tags, die nützlich sind, wenn Sie Flexibilität bei den Tag-Namen benötigen:

<h{$level}>Überschrift</h{$level}>

Der obige Code kann beispielsweise <h1>Überschrift</h1> oder <h2>Überschrift</h2> generieren, abhängig vom Wert der Variablen $level. Dynamische HTML-Tags in Latte müssen immer paarweise sein. Ihre Alternative ist n:tag.

Da Latte ein sicheres Template-System ist, prüft es, ob der resultierende Tag-Name gültig ist und keine unerwünschten oder schädlichen Werte enthält. Es stellt außerdem sicher, dass der Name des schließenden Tags immer derselbe ist wie der Name des öffnenden Tags.

Kommentare

Kommentare werden auf diese Weise geschrieben und gelangen nicht in die Ausgabe:

{* dies ist ein Kommentar in Latte *}

Innerhalb von Tags funktionieren PHP-Kommentare:

{include 'file.info', /* value: 123 */}

Syntaktischer Zucker

Zeichenketten ohne Anführungszeichen

Bei einfachen Zeichenketten können die Anführungszeichen weggelassen werden:

wie in PHP:  {var $arr = ['hallo', 'btn--default', '€']}

verkürzt:    {var $arr = [hallo, btn--default, €]}

Einfache Zeichenketten sind solche, die rein aus Buchstaben, Ziffern, Unterstrichen, Bindestrichen und Punkten bestehen. Sie dürfen nicht mit einer Ziffer beginnen und nicht mit einem Bindestrich beginnen oder enden. Sie dürfen nicht nur aus Großbuchstaben und Unterstrichen bestehen, da sie dann als Konstante betrachtet werden (z. B. PHP_VERSION). Und sie dürfen nicht mit Schlüsselwörtern kollidieren: and, array, clone, default, false, in, instanceof, new, null, or, return, true, xor.

Konstanten

Da bei einfachen Zeichenketten die Anführungszeichen weggelassen werden können, empfehlen wir zur Unterscheidung, globale Konstanten mit einem Schrägstrich am Anfang zu schreiben:

{if \PROJECT_ID === 1} ... {/if}

Diese Schreibweise ist in PHP selbst völlig gültig, der Schrägstrich besagt, dass die Konstante im globalen Namespace liegt.

Verkürzter ternärer Operator

Wenn der dritte Wert des ternären Operators leer ist, kann er weggelassen werden:

wie in PHP:  {$stock ? 'Auf Lager' : ''}

verkürzt:    {$stock ? 'Auf Lager'}

Moderne Schreibweise von Schlüsseln in Arrays

Schlüssel in Arrays können ähnlich wie benannte Parameter beim Funktionsaufruf geschrieben werden:

wie in PHP:  {var $arr = ['one' => 'item 1', 'two' => 'item 2']}

modern:      {var $arr = [one: 'item 1', two: 'item 2']}

Filter

Filter können für beliebige Ausdrücke verwendet werden, es genügt, das Ganze in Klammern zu setzen:

{var $content = ($text|truncate: 30|upper)}

Operator in

Mit dem Operator in kann die Funktion in_array() ersetzt werden. Der Vergleich ist immer strikt:

{* Äquivalent zu in_array($item, $items, true) *}
{if $item in $items}
	...
{/if}

Historisches Fenster

Latte brachte im Laufe seiner Geschichte eine ganze Reihe von syntaktischen Zuckern mit, die nach einigen Jahren in PHP selbst auftauchten. Beispielsweise war es in Latte möglich, Arrays als [1, 2, 3] anstelle von array(1, 2, 3) zu schreiben oder den Nullsafe-Operator $obj?->foo zu verwenden, lange bevor dies in PHP selbst möglich war. Latte führte auch den Operator zum Entpacken von Arrays (expand) $arr ein, der dem heutigen Operator ...$arr aus PHP entspricht.

Der Undefined-Safe-Operator ??->, eine Analogie zum Nullsafe-Operator ?->, der jedoch keinen Fehler auslöst, wenn die Variable nicht existiert, entstand aus historischen Gründen, und heute empfehlen wir die Verwendung des Standard-PHP-Operators ?->.

Einschränkungen von PHP in Latte

In Latte können nur PHP-Ausdrücke geschrieben werden. Das bedeutet, dass keine Anweisungen verwendet werden können, die mit einem Semikolon enden. Klassen können nicht deklariert oder Steuerstrukturen verwendet werden, z. B. if, foreach, switch, return, try, throw und andere, für die Latte seine eigenen Tags anbietet. Ebenso können keine Attribute, Backticks oder einige magische Konstanten verwendet werden. Auch unset, echo, include, require, exit, eval können nicht verwendet werden, da es sich nicht um Funktionen, sondern um spezielle Sprachkonstrukte von PHP handelt und somit keine Ausdrücke sind. Kommentare werden nur als mehrzeilige /* ... */ unterstützt.

Diese Einschränkungen können jedoch umgangen werden, indem Sie die Erweiterung RawPhpExtension aktivieren, dank derer dann im Tag {php ...} beliebiger PHP-Code auf Verantwortung des Template-Autors verwendet werden kann.

Version: 3.0