Tipps und Tricks

Editoren und IDEs

Schreiben Sie Templates in einem Editor oder einer IDE, die Latte unterstützt. Es wird viel angenehmer sein.

  • PhpStorm: Installieren Sie in Settings > Plugins > Marketplace das Plugin Latte
  • VS Code: Installieren Sie Nette Latte + Neon, Nette Latte templates oder das neueste Nette for VS Code Plugin
  • NetBeans IDE: Native Latte-Unterstützung ist Teil der Installation
  • Sublime Text 3: Finden und installieren Sie im Package Control das Paket Nette und wählen Sie Latte in View > Syntax
  • In älteren Editoren verwenden Sie für .latte-Dateien die Smarty-Hervorhebung

Das Plugin für PhpStorm ist sehr fortschrittlich und kann PHP-Code hervorragend vorschlagen. Damit es optimal funktioniert, verwenden Sie typisierte Templates.

Unterstützung für Latte finden Sie auch im Web-Code-Highlighter Prism.js und im Editor Ace.

Latte innerhalb von JavaScript oder CSS

Latte kann sehr bequem auch innerhalb von JavaScript oder CSS verwendet werden. Wie vermeidet man jedoch die Situation, dass Latte fälschlicherweise JavaScript-Code oder CSS-Stil als Latte-Tag betrachtet?

<style>
	/* FEHLER: wird als Tag {color} interpretiert */
	body {color: blue}
</style>

<script>
	// FEHLER: wird als Tag {id} interpretiert
	var obj = {id: 123};
</script>

Variante 1

Vermeiden Sie die Situation, dass direkt nach { ein Buchstabe folgt, indem Sie davor ein Leerzeichen, einen Zeilenumbruch oder ein Anführungszeichen einfügen:

<style>
	body {
		color: blue
	}
</style>

<script>
	var obj = {'id': 123};
</script>

Variante 2

Deaktivieren Sie die Verarbeitung von Latte-Tags innerhalb des Elements vollständig mit n:syntax:

<script n:syntax="off">
	var obj = {id: 123};
</script>

Variante 3

Schalten Sie die Syntax der Latte-Tags innerhalb des Elements auf doppelte geschweifte Klammern um:

<script n:syntax="double">
	var obj = {id: 123};          // das ist JavaScript

	{{if $cond}} alert(); {{/if}} // das ist Latte
</script>

In JavaScript werden keine Anführungszeichen um Variablen geschrieben.

Ersatz für use-Klausel in Latte

Wie ersetzt man in Latte die use-Klauseln, die in PHP verwendet werden, damit man beim Zugriff auf eine Klasse nicht den Namespace schreiben muss? Beispiel in PHP:

use Pets\Model\Dog;

if ($dog->status === Dog::StatusHungry) {
	// ...
}

Variante 1

Anstelle der use-Klausel speichern wir den Klassennamen in einer Variablen und verwenden anschließend $Dog anstelle von Dog:

{var $Dog = Pets\Model\Dog::class}

<div>
	{if $dog->status === $Dog::StatusHungry}
		...
	{/if}
</div>

Variante 2

Wenn das Objekt $dog eine Instanz von Pets\Model\Dog ist, kann {if $dog->status === $dog::StatusHungry} verwendet werden.

Generierung von XML in Latte

Latte kann jedes textbasierte Format generieren (HTML, XML, CSV, iCal usw.), aber damit die ausgegebenen Daten korrekt escaped werden, müssen wir ihm mitteilen, welches Format wir generieren. Dazu dient das Tag {contentType}.

{contentType application/xml}
<?xml version="1.0" encoding="UTF-8"?>
...

Danach können wir beispielsweise eine Sitemap auf ähnliche Weise generieren:

{contentType application/xml}
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" >
	<url n:foreach="$urls as $url">
		<loc>{$url->loc}</loc>
		<lastmod>{$url->lastmod->format('Y-m-d')}</lastmod>
		<changefreq>{$url->frequency}</changefreq>
		<priority>{$url->priority}</priority>
	</url>
</urlset>

Daten aus einem inkludierten Template übergeben

Variablen, die wir mit {var} oder {default} in einem inkludierten Template erstellen, existieren nur darin und sind im inkludierenden Template nicht verfügbar. Wenn wir Daten aus dem inkludierten Template zurück an das inkludierende Template übergeben möchten, ist eine Möglichkeit, dem Template ein Objekt zu übergeben und die Daten darin abzulegen.

Haupt-Template:

{* erstellt ein leeres Objekt $vars *}
{var $vars = (object) null}

{include 'included.latte', vars: $vars}

{* enthält nun die Eigenschaft foo *}
{$vars->foo}

Inkludiertes Template included.latte:

{* schreiben Daten in die Eigenschaft foo *}
{var $vars->foo = 123}
Version: 3.0