Съвети и трикове

Редактори и IDE

Пишете шаблони в редактор или IDE, който има поддръжка за Latte. Ще бъде много по-приятно.

  • PhpStorm: инсталирайте в Settings > Plugins > Marketplace плъгин Latte
  • VS Code: инсталирайте Nette Latte + Neon, Nette Latte templates или най-новия Nette for VS Code плъгин
  • NetBeans IDE: нативната поддръжка на Latte е част от инсталацията
  • Sublime Text 3: в Package Control намерете и инсталирайте пакета Nette и изберете Latte в View > Syntax
  • в стари редактори използвайте за файлове .latte подчертаване на Smarty

Плъгинът за PhpStorm е много напреднал и може отлично да подсказва PHP код. За да работи оптимално, използвайте типизирани шаблони.

Поддръжка за Latte ще намерите също и в уеб подчертавача на код Prism.js и редактора Ace.

Latte в JavaScript или CSS

Latte може много удобно да се използва и в JavaScript или CSS. Но как да избегнем ситуация, в която Latte погрешно би счело JavaScript код или CSS стил за Latte таг?

<style>
	/* ГРЕШКА: интерпретира се като таг {color} */
	body {color: blue}
</style>

<script>
	// ГРЕШКА: интерпретира се като таг {id}
	var obj = {id: 123};
</script>

Вариант 1

Избягвайте ситуация, в която след { веднага следва буква, например като вмъкнете интервал, нов ред или кавичка преди нея:

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

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

Вариант 2

Напълно изключете обработката на Latte тагове вътре в елемента с помощта на n:syntax:

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

Вариант 3

Превключете синтаксиса на Latte таговете вътре в елемента на двойни къдрави скоби:

<script n:syntax="double">
	var obj = {id: 123};          // това е JavaScript

	{{if $cond}} alert(); {{/if}} // това е Latte
</script>

В JavaScript не се пишат кавички около променливата.

Замяна на use клауза в Latte

Как в Latte да заменим клаузите use, които се използват в PHP, за да не се налага да пишем namespace при достъп до клас? Пример в PHP:

use Pets\Model\Dog;

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

Вариант 1

Вместо клауза use, ще запазим името на класа в променлива и след това вместо Dog ще използваме $Dog:

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

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

Вариант 2

Ако обектът $dog е инстанция на Pets\Model\Dog, тогава може да се използва {if $dog->status === $dog::StatusHungry}.

Генериране на XML в Latte

Latte може да генерира всякакъв текстов формат (HTML, XML, CSV, iCal и т.н.), но за да екранира правилно извежданите данни, трябва да му кажем какъв формат генерираме. За това служи тагът {contentType}.

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

След това можем например да генерираме sitemap по подобен начин:

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

Предаване на данни от включен шаблон

Променливите, които създаваме с помощта на {var} или {default} във включения шаблон, съществуват само в него и не са достъпни във включващия шаблон. Ако искаме да предадем данни от включения шаблон обратно към включващия, една от възможностите е да предадем обект на шаблона и да вмъкнем данните в него.

Основен шаблон:

{* създава празен обект $vars *}
{var $vars = (object) null}

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

{* сега съдържа свойството foo *}
{$vars->foo}

Включен шаблон included.latte:

{* записваме данни в свойството foo *}
{var $vars->foo = 123}
версия: 3.0