Nette Documentation Preview

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


Редакторы и IDE
===============

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

- PhpStorm: установите в `Settings > Plugins > Marketplace` [плагин Latte |https://plugins.jetbrains.com/plugin/7457-latte]
- VS Code: установите [Nette Latte + Neon |https://marketplace.visualstudio.com/items?itemName=Kasik96.latte], [Nette Latte templates |https://marketplace.visualstudio.com/items?itemName=smuuf.latte-lang] или новейший [Nette for VS Code |https://marketplace.visualstudio.com/items?itemName=franken-ui.nette-for-vscode] плагин
- NetBeans IDE: встроенная поддержка Latte является частью установки
- Sublime Text 3: в Package Control найдите и установите пакет `Nette` и выберите Latte в `View > Syntax`
- в старых редакторах используйте для файлов .latte подсветку Smarty

Плагин для PhpStorm очень продвинутый и отлично подсказывает PHP-код. Чтобы он работал оптимально, используйте [типизированные шаблоны |type-system].

[* latte-phpstorm-plugin.webp *]

Поддержку Latte вы также найдете в веб-подсветчике кода [Prism.js |https://prismjs.com/#supported-languages] и редакторе [Ace |https://ace.c9.io].


Latte внутри JavaScript или CSS
===============================

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

```latte
<style>
	/* ОШИБКА: интерпретируется как тег {color} */
	body {color: blue}
</style>

<script>
	// ОШИБКА: интерпретируется как тег {id}
	var obj = {id: 123};
</script>
```

**Вариант 1**

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

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

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

**Вариант 2**

Полностью отключите обработку тегов Latte внутри элемента с помощью [n:syntax |tags#syntax]:

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

**Вариант 3**

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

```latte
<script n:syntax="double">
	var obj = {id: 123};          // это JavaScript

	{{if $cond}} alert(); {{/if}} // это Latte
</script>
```

В JavaScript [не пишутся кавычки вокруг переменной |tags#Вывод в JavaScript].


Замена `use` в Latte
====================

Как в Latte заменить конструкции `use`, которые используются в PHP, чтобы не писать пространство имен при доступе к классу? Пример на PHP:

```php
use Pets\Model\Dog;

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

**Вариант 1**

Вместо конструкции `use` сохраним имя класса в переменную, а затем вместо `Dog` будем использовать `$Dog`:

```latte
{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}` |tags#contentType].

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

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

```latte
{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}` во включенном шаблоне, существуют только в нем и недоступны во включающем шаблоне. Если бы мы хотели передать какие-либо данные из включенного шаблона обратно во включающий, одним из вариантов является передача объекта в шаблон и вставка данных в него.

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

```latte
{* создает пустой объект $vars *}
{var $vars = (object) null}

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

{* теперь содержит свойство foo *}
{$vars->foo}
```

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

```latte
{* записываем данные в свойство foo *}
{var $vars->foo = 123}
```

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

Редакторы и 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}