Syntax

Syntax Latte wurde aus den praktischen Anforderungen von Webdesignern geboren. Wir waren auf der Suche nach einer möglichst benutzerfreundlichen Syntax, mit der man auf elegante Weise Konstrukte schreiben kann, die sonst eine echte Herausforderung sind. Gleichzeitig sind alle Ausdrücke genau so geschrieben wie in PHP, so dass Sie keine neue Sprache lernen müssen. Sie machen einfach das Beste aus dem, was Sie bereits kennen.

Im Folgenden finden Sie eine minimale Vorlage, die einige grundlegende Elemente veranschaulicht: Tags, n:Attribute, Kommentare und Filter.

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

Werfen wir einen genaueren Blick auf diese wichtigen Elemente und wie sie Ihnen helfen können, eine unglaubliche Vorlage zu erstellen.

Tags

Eine Vorlage enthält Tags, die die Logik der Vorlage (z. B. foreach-Schleifen) oder die Ausgabeausdrücke steuern. Für beides wird ein einziges Begrenzungszeichen { ... } verwendet, so dass Sie nicht wie bei anderen Systemen überlegen müssen, welches Begrenzungszeichen in welcher Situation zu verwenden ist. Wenn auf das {-Zeichen ein Anführungszeichen oder ein Leerzeichen folgt, betrachtet Latte es nicht als Beginn eines Tags, so dass Sie ohne Probleme JavaScript-Konstrukte, JSON oder CSS-Regeln in Ihren Vorlagen verwenden können.

Siehe Übersicht über alle Tags. Darüber hinaus können Sie auch benutzerdefinierte Tags erstellen.

Latte versteht PHP

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

Darüber hinaus fügt Latte einige nette Erweiterungen der PHP-Syntax hinzu.

n:Attribute

Jedes Tag-Paar, wie z. B. {if} … {/if}, das auf ein einzelnes HTML-Element wirkt, kann in n:Attribut-Notation geschrieben werden. Zum Beispiel könnte {foreach} im obigen Beispiel auch so geschrieben werden:

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

Die Funktionalität entspricht dann dem HTML-Element, in das sie geschrieben ist:

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

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

Druckt:

<p>I</p>
<p>♥</p>
<p>Latte</p>

Durch die Verwendung des Präfixes inner- können wir das Verhalten so ändern, dass die Funktionalität nur für den Körper des Elements gilt:

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

Druckt:

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

Oder durch die Verwendung des Präfixes tag- wird die Funktionalität nur auf die HTML-Tags angewendet:

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

Je nach dem Wert der Variable $url wird dies gedruckt:

// when $url is empty
<p>Title</p>

// when $url equals 'https://nette.org'
<p><a href="https://nette.org">Title</a></p>

Allerdings sind n:Attribute nicht nur eine Abkürzung für Paar-Tags, es gibt auch einige reine n:Attribute, zum Beispiel den besten Freund des Programmierers n:class.

Filter

Siehe die Zusammenfassung der Standardfilter.

Latte erlaubt den Aufruf von Filtern mit Hilfe der Pipe-Schreibweise (vorangestelltes Leerzeichen ist erlaubt):

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

Filter können verkettet werden, in diesem Fall gelten sie in der Reihenfolge von links nach rechts:

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

Die Parameter werden durch Doppelpunkt oder Komma getrennt hinter den Filternamen gesetzt:

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

Filter können auf Ausdrücke angewendet werden:

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

Auf Block:

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

Oder direkt beim Wert (in Kombination mit {=expr} Tag):

<h1>{='  Hello world  '|trim}<h1>

Kommentare

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

{* dies ist ein Kommentar in Latte *}

PHP-Kommentare funktionieren innerhalb von Tags:

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

Syntaktischer Zucker

Zeichenketten ohne Anführungszeichen

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

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

abbreviated: {var $arr = [hello, btn--default, €]}

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

Kurzer ternärer Operator

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

as in PHP:   {$stock ? 'In stock' : ''}

abbreviated: {$stock ? 'In stock'}

Moderne Schlüsselschreibweise im Array

Array-Schlüssel können ähnlich wie benannte Parameter beim Aufruf von Funktionen geschrieben werden:

as 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 jeden beliebigen Ausdruck verwendet werden, indem man das Ganze in Klammern setzt:

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

Operator in

Der Operator in kann anstelle der Funktion in_array() verwendet werden. Der Vergleich ist immer streng:

{* wie in_array($item, $items, true) *}
{if $item in $items}
	...
{/if}

Optionale Verkettung mit Undefined-Safe-Operator

Der undefiniert-sichere Operator ??-> ähnelt dem nullsicheren Operator ?->, löst aber keinen Fehler aus, wenn eine Variable, eine Eigenschaft oder ein Index überhaupt nicht existiert.

{$order??->id}

Dies ist eine Art zu sagen, dass, wenn $order definiert und nicht null ist, $order->id berechnet wird, aber wenn $order null ist oder nicht existiert, stoppen wir, was wir tun und geben einfach null zurück.

Möglicherweise werden Sie ?-> verwenden, um eine Menge Code zu ersetzen, der sich wiederholende Null-Prüfungen durchführt:

{$user??->address??->street}
// roughly means isset($user) && isset($user->address) ? $user->address->street : null

Ein Fenster in die Geschichte

Latte hat im Laufe seiner Geschichte eine Reihe von syntaktischen Bonbons entwickelt, die ein paar Jahre später in PHP selbst auftauchten. Zum Beispiel 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 Arrayerweiterungsoperator (expand) $arr ein, der dem heutigen ...$arr Operator von PHP entspricht.

PHP-Einschränkungen in Latte

In Latte können nur PHP-Ausdrücke geschrieben werden. Das heißt, Sie können keine Klassen deklarieren oder Kontrollstrukturen verwenden, wie if, foreach, switch, return, try, throw und andere, an deren Stelle Latte seine Tags anbietet. Sie können auch keine Attribute, Backticks oder magische Konstanten verwenden, denn das würde keinen Sinn machen. Sie können nicht einmal echo, include, require, exit, eval, unset verwenden, da es sich nicht um Funktionen, sondern um spezielle PHP-Sprachkonstrukte und somit nicht um Ausdrücke handelt.

Sie können diese Einschränkungen jedoch umgehen, indem Sie die RawPhpExtension-Erweiterung aktivieren, die es Ihnen ermöglicht, beliebigen PHP-Code im {php ...} -Tag auf Verantwortung des Vorlagenautors zu verwenden.