Синтаксис шаблонизатора
=======================
Лучшим ресурсом для изучения основ шаблонизатора Twig является официальная документация, которую можно найти тут -
[twig.sensiolabs.org](http://twig.sensiolabs.org/documentation). Ниже описаны синтаксические расширения, специфичные для Yii:
## Вызов метода и функции
Если необходимо получить результат в переменную, вы можете вызвать метод или функцию следующим образом:
```twig
{% set result = my_function({'a' : 'b'}) %}
{% set result = myObject.my_function({'a' : 'b'}) %}
```
Если необходимо вывести результат без сохранения в переменную:
```twig
{{ my_function({'a' : 'b'}) }}
{{ myObject.my_function({'a' : 'b'}) }}
```
Также вы можете использовать обертку `void`, если нет необходимости сохранять результат:
```twig
{{ void(my_function({'a' : 'b'})) }}
{{ void(myObject.my_function({'a' : 'b'})) }}
```
## Установка свойств объекта
Специальная функция `set` позволяет устанавливать свойства объекта. Например, следующий фрагмент кода изменяет
title страницы:
```twig
{{ set(this, 'title', 'New title') }}
```
## Импортирование виджетов, пространств имен и классов
Вы можете импортировать в шаблон классы и пространства имен следующим образом:
```twig
Импортирование пространства имен:
{{ use('/app/widgets') }}
Импортирование класса:
{{ use('/yii/widgets/ActiveForm') }}
Импортирование класса с использованием псевдонима:
{{ use({'alias' : '/app/widgets/MyWidget'}) }}
```
Подробная информация находится в разделе [Шаблоны и виджеты](layouts-and-widgets.md)
## Импортирование других классов
В большинстве случаев, кроме виджетов и ассетов, вам понадобится импортировать классы через секцию [globals](additional-configuration.md#globals).
Например, этот код ничего не выведет:
```twig
{{ use('yii/helpers/Url') }}
{{ Url.base(true) }}
```
и этот код тоже ничего не выведет:
```twig
{{ use ('app/models/MyClass') }}
{{ MyClass.helloWorld() }}
```
Вы должны указать эти классы в конфигурации, используя секцию [globals](additional-configuration.md#globals):
```php
// ....
'view' => [
'class' => 'yii\web\View',
'renderers' => [
'twig' => [
'class' => 'yii\twig\ViewRenderer',
'cachePath' => '@runtime/Twig/cache',
'options' => [
'auto_reload' => true,
],
'globals' => [
'Url' => ['class' => '\yii\helpers\Url'],
'MyClass' => ['class' => '\frontend\models\MyClass'],
],
],
],
],
// ....
```
Только после этого вы можете использовать классы таким образом:
```twig
{{ Url.base(true) }}
{{ MyClass.helloWorld() }}
```
## Интеграция шаблонов
Интегрировать другие шаблоны в текущий шаблон можно с помощью двух операторов `include` и `extends`:
```twig
{% include "comment.twig" %}
{% extends "post.twig" %}
{% include "@app/views/snippets/avatar.twig" %}
{% extends "@app/views/layouts/2columns.twig" %}
```
В первом случае файл вида будет искаться относительно текущего пути. Это значит что файлы `comment.twig` и `post.twig`
будут искаться в той же директории, что и текущий отображаемый шаблон.
Во втором случае мы используем псевдонимы путей. Все псевдонимы Yii, такие как `@app`, доступны по умолчанию.
Вы также можете использовать метод `render` внутри вида:
```
{{ this.render('comment.twig', {'data1' : data1, 'data2' : data2}) | raw }}
```
## Ассеты
Ассеты могут быть зарегистрированы следующим способом (начиная с версии 2.0.4):
```twig
{{ register_asset_bundle('yii/web/JqueryAsset') }}
```
Более подробный синтаксис:
```twig
{{ use('yii/web/JqueryAsset') }}
{{ register_jquery_asset() }}
```
В коде, указанном выше, `register` определяет, что мы работаем с ассетами, а `jquery_asset` переводится в класс
`JqueryAsset`, который уже импортирован с помощью `use`.
## URLs
Для построения URL-ов вы можете использовать следующие функции:
```php
{{ post.title }}
{{ post.title }}
```
Функция `path` генерирует относительный URL, `url` - абсолютный. Внутри себя обе функции используют [[\yii\helpers\Url::to]].
## Дополнительные переменные
Следующие переменные всегда определены в шаблонах Twig:
- `app`, которая соответствует `\Yii::$app`
- `this`, которая соответствует текущему объекту `View`
## Блоки
Вы можете определять блоки следующим образом:
```twig
{{ void(this.beginBlock('block1')) }}
now, block1 is set
{{ void(this.endBlock()) }}
```
Затем отображать блоки в основном шаблоне (layout):
```twig
{{ this.blocks['block1'] }}
```