Советы и приёмы

Редакторы и IDE

Пишите шаблоны в редакторе или IDE с поддержкой Latte. Это будет намного приятнее.

  • PhpStorm: установите плагин Latte в Settings > Plugins > Marketplace
  • VS Code: установите Nette Latte + Neon, Nette Latte templates или новейший плагин Nette for VS Code
  • NetBeans IDE: встроенная поддержка Latte входит в установку
  • Sublime Text 3: найдите и установите пакет Nette в Package Control, затем выберите 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, чтобы не писать пространство имён при обращении к классу? Пример на 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"?>
...

Затем мы можем, например, похожим образом сгенерировать карту сайта:

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