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 код: търсене на маркерплейс за плъгин за [шаблони |https://marketplace.visualstudio.com/items?itemName=smuuf.latte-lang] [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: в Управление на пакетите намерете и инсталирайте пакета `Nette` и изберете Latte в `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 в JavaScript или CSS .[#toc-latte-inside-javascript-or-css]
=================================================================

Latte може да се използва много удобно в JavaScript или CSS. Но как можете да избегнете погрешното третиране на кода на JavaScript или стиловете на CSS от Latte като тагове на 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
{* създава празен обект $vars *}
{var $vars = (object) null}

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

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

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

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

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

Редактори и IDE

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

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

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

Поддръжката на Latte може да бъде намерена и в разделителя на уеб код Prism.js и редактора Ace.

Latte в JavaScript или CSS

Latte може да се използва много удобно в JavaScript или CSS. Но как можете да избегнете погрешното третиране на кода на 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

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

<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} в шаблона за разрешаване, съществуват само в шаблона за разрешаване и не са достъпни в шаблона за разрешаване. Ако искаме да предадем някакви данни от активирания шаблон обратно към активирания шаблон, една от възможностите е да предадем обект на шаблона и да зададем данните към него.

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

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

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

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

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

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