Template Syntax
===============
The best resource to learn Twig basics is its official documentation you can find at
[twig.sensiolabs.org](http://twig.sensiolabs.org/documentation). Additionally there are Yii-specific syntax extensions
described below.
## Method and function calls
If you need result you can call a method or a function using the following syntax:
```twig
{% set result = my_function({'a' : 'b'}) %}
{% set result = myObject.my_function({'a' : 'b'}) %}
```
If you need to echo result instead of assigning it to a variable:
```twig
{{ my_function({'a' : 'b'}) }}
{{ myObject.my_function({'a' : 'b'}) }}
```
In case you don't need result you should use `void` wrapper:
```twig
{{ void(my_function({'a' : 'b'})) }}
{{ void(myObject.my_function({'a' : 'b'})) }}
```
## Setting object properties
There's a special function called `set` that allows you to set property of an object. For example, the following
in the template will change page title:
```twig
{{ set(this, 'title', 'New title') }}
```
## Importing widgets namespaces and classes
You can import additional classes and namespaces right in the template:
```twig
Namespace import:
{{ use('/app/widgets') }}
Class import:
{{ use('/yii/widgets/ActiveForm') }}
Aliased class import:
{{ use({'alias' : '/app/widgets/MyWidget'}) }}
```
Please refer to [Layouts and Widgets](layouts-and-widgets.md) for additional information.
## Importing other classes
In most cases, except widgets and assets, you have to import classes via [globals](additional-configuration.md#globals).
For example this code prints nothing:
```
{{ use('yii/helpers/Url') }}
{{ Url.base(true) }}
```
and this code also prints nothing:
```
{{ use ('app/models/MyClass') }}
{{ MyClass.helloWorld() }}
```
You have add these classes to [globals](additional-configuration.md#globals):
```
// ....
'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'],
],
],
],
],
// ....
```
Only then you can use classes such way:
```
{{ Url.base(true) }}
{{ MyClass.helloWorld() }}
```
## Referencing other templates
There are two ways of referencing templates in `include` and `extends` statements:
```twig
{% include "comment.twig" %}
{% extends "post.twig" %}
{% include "@app/views/snippets/avatar.twig" %}
{% extends "@app/views/layouts/2columns.twig" %}
```
In the first case the view will be searched relatively to the current template path. For `comment.twig` and `post.twig`
that means these will be searched in the same directory as the currently rendered template.
In the second case we're using path aliases. All the Yii aliases such as `@app` are available by default.
You can also use `render` method inside a view:
```
{{ this.render('comment.twig', {'data1' : data1, 'data2' : data2}) | raw }}
```
## Assets
Assets could be registered the following way (since 2.0.4):
```twig
{{ register_asset_bundle('yii/web/JqueryAsset') }}
```
There's a bit more verbose syntax used previously:
```twig
{{ use('yii/web/JqueryAsset') }}
{{ register_jquery_asset() }}
```
In the call above `register` identifies that we're working with assets while `jquery_asset` translates to `JqueryAsset`
class that we've already imported with `use`.
## URLs
There are two functions you can use for building URLs:
```php
{{ post.title }}
{{ post.title }}
```
`path` generates relative URL while `url` generates absolute one. Internally both are using [[\yii\helpers\Url::to]].
## Additional variables
Within Twig templates the following variables are always defined:
- `app`, which equates to `\Yii::$app`
- `this`, which equates to the current `View` object
## Blocks
You can set blocks the following way:
```twig
{{ void(this.beginBlock('block1')) }}
now, block1 is set
{{ void(this.endBlock()) }}
```
Then, in the layout view, render the blocks:
```twig
{{ this.blocks['block1'] }}
```