Nette Documentation Preview

syntax
Советы и рекомендации
*********************


Редакторы и IDE .[#toc-editors-and-ide]
=======================================

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

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

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

[* latte-phpstorm-plugin.webp *]

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


Latte Inside JavaScript или CSS .[#toc-latte-inside-javascript-or-css]
======================================================================

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

```latte
<style>
	/* ERROR: interprets as tag {color} */
	body {color: blue}
</style>

<script>
	// ERROR: interprets as tag {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};          // this is JavaScript

	{{if $cond}} alert(); {{/if}} // this is Latte tag
</script>
```

В JavaScript [не заключайте переменную в кавычки |tags#Filters].


Замена для пункта `use` .[#toc-replacement-for-use-clause]
==========================================================

Как заменить клаузулу `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 .[#toc-generating-xml-in-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>
```


Передача данных из включенного шаблона .[#toc-passing-data-from-an-included-template]
=====================================================================================

Переменные, которые мы создаем с помощью `{var}` или `{default}` во включенном шаблоне, существуют только в нем и недоступны во включающем шаблоне.
Если мы хотим передать некоторые данные из включаемого шаблона обратно в включающий, один из вариантов - передать в шаблон объект и установить в него данные.

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

```latte
{* creates an empty object $vars *}
{var $vars = (object) null}

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

{* now contains property foo *}
{$vars->foo}
```

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

```latte
{* write data to the property foo *}
{var $vars->foo = 123}
```

Советы и рекомендации

Редакторы и IDE

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

  • NetBeans IDE имеет встроенную поддержку
  • PhpStorm: установите плагин Latte в Settings > Plugins > Marketplace
  • VS Code: поиск маркерплейса для плагина Nette Latte + Neon или шаблонов Nette Latte
  • Sublime Text 3: в Package Control найдите и установите пакет Nette и выберите Latte in View > Syntax
  • в старых редакторах используйте подсветку Smarty для файлов .latte

Плагин для PhpStorm очень продвинутый и может отлично подсказывать PHP код. Для оптимальной работы используйте типизированные шаблоны.

Поддержку Latte также можно найти в веб-выделителе кода Prism.js и редакторе Ace.

Latte Inside JavaScript или CSS

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

<style>
	/* ERROR: interprets as tag {color} */
	body {color: blue}
</style>

<script>
	// ERROR: interprets as tag {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};          // this is JavaScript

	{{if $cond}} alert(); {{/if}} // this is Latte tag
</script>

В JavaScript не заключайте переменную в кавычки.

Замена для пункта use

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

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

{* creates an empty object $vars *}
{var $vars = (object) null}

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

{* now contains property foo *}
{$vars->foo}

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

{* write data to the property foo *}
{var $vars->foo = 123}