Porady i sztuczki

Edytory i IDE

Szablony pisz w edytorze lub IDE, które obsługuje Latte. Będzie o wiele przyjemniej.

  • PhpStorm: zainstaluj plugin Latte w Settings > Plugins > Marketplace
  • VS Code: zainstaluj Nette Latte + Neon, Nette Latte templates albo najnowszy plugin Nette for VS Code
  • NetBeans IDE: natywna obsługa Latte jest częścią instalacji
  • Sublime Text 3: w Package Control znajdź i zainstaluj pakiet Nette, a w View > Syntax wybierz Latte
  • w starszych edytorach używaj dla plików .latte podświetlania Smarty

Plugin do PhpStorm jest bardzo zaawansowany i potrafi doskonale podpowiadać kod PHP. Aby działał optymalnie, używaj typowanych szablonów.

Obsługę Latte znajdziesz też w webowym podświetlaczu kodu Prism.js i w edytorze Ace.

Latte wewnątrz JavaScriptu lub CSS

Latte da się bardzo wygodnie używać wewnątrz JavaScriptu lub CSS. Jak jednak uniknąć sytuacji, w której Latte omyłkowo uzna kod JavaScriptu albo style CSS za tagi Latte?

<style>
	/* BŁĄD: zinterpretuje jako tag {color} */
	body {color: blue}
</style>

<script>
	// BŁĄD: zinterpretuje jako tag {id}
	var obj = {id: 123};
</script>

Możliwość 1

Unikaj sytuacji, w których bezpośrednio po { następuje litera, na przykład wstawiając przed nią spację, nowy wiersz albo cudzysłów:

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

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

Możliwość 2

Całkowicie wyłącz przetwarzanie tagów Latte wewnątrz elementu za pomocą n:syntax:

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

Możliwość 3

Przełącz składnię tagów Latte wewnątrz elementu na podwójne klamry:

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

	{{if $cond}} alert(); {{/if}} // to jest tag Latte
</script>

W JavaScripcie nie umieszczaj zmiennej w cudzysłowach.

Zamiennik klauzuli use w Latte

Czym w Latte zastąpić klauzule use używane w PHP, aby przy odwołaniu do klasy nie trzeba było pisać przestrzeni nazw? Przykład w PHP:

use Pets\Model\Dog;

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

Możliwość 1

Zamiast klauzuli use zapisz nazwę klasy do zmiennej, a następnie używaj $Dog zamiast Dog:

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

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

Możliwość 2

Jeśli obiekt $dog jest instancją Pets\Model\Dog, można użyć {if $dog->status === $dog::StatusHungry}.

Generowanie XML w Latte

Latte potrafi generować dowolny format tekstowy (HTML, XML, CSV, iCal itd.), ale aby poprawnie escapować wypisywane dane, musimy mu powiedzieć, jaki format generujemy. Służy do tego tag {contentType}.

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

Następnie możemy w podobny sposób wygenerować na przykład mapę strony:

{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>

Przekazywanie danych z dołączonego szablonu

Zmienne utworzone przez {var} albo {default} w dołączonym szablonie istnieją tylko w tym szablonie i nie są dostępne w szablonie dołączającym. Jeśli chcesz przekazać jakieś dane z dołączonego szablonu z powrotem do dołączającego, jedną z możliwości jest przekazanie do szablonu obiektu i zapisanie danych do niego.

Szablon główny:

{* tworzymy pusty obiekt $vars *}
{var $vars = (object) null}

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

{* teraz zawiera właściwość foo *}
{$vars->foo}

Dołączony szablon included.latte:

{* zapisujemy dane do właściwości foo *}
{var $vars->foo = 123}
wersja: 3.x