Nette Documentation Preview

syntax
Советы и трюки
**************
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Советы и трюки

Редакторы и 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, чтобы не писать пространство имен при доступе к классу? Пример на 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}