テンプレートの構文
==================
Twig の基礎を学ぶための最善のリソースは、[twig.sensiolabs.org](http://twig.sensiolabs.org/documentation)
にある公式ドキュメントです。
それに追加して、下記に説明する Yii 固有の拡張構文があります。
## メソッドとファンクションの呼び出し
結果が必要な場合は、次の構文を使ってメソッドや関数を呼び出すことが出来ます。
```twig
{% set result = my_function({'a' : 'b'}) %}
{% set result = myObject.my_function({'a' : 'b'}) %}
```
結果を変数に代入する代りに echo したい場合は、こうします。
```twig
{{ my_function({'a' : 'b'}) }}
{{ myObject.my_function({'a' : 'b'}) }}
```
結果を必要としない場合は、`void` ラッパーを使わなければなりません。
```twig
{{ void(my_function({'a' : 'b'})) }}
{{ void(myObject.my_function({'a' : 'b'})) }}
```
## オブジェクトのプロパティを設定する
`set` と呼ばれる特別な関数を使って、オブジェクトのプロパティを設定することが出来ます。
例えば、テンプレート中の下記のコードはページ・タイトルを変更します。
```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) によってクラスをインポートしなければなりません。
例えば、次のコードは何も表示しません。
```
{{ use('yii/helpers/Url') }}
{{ Url.base(true) }}
```
次のコードも何も表示しません。
```
{{ use ('app/models/MyClass') }}
{{ MyClass.helloWorld() }}
```
これらのクラスは、[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'],
],
],
],
],
// ....
```
こうして、はじめて、クラスをそのように使うことが出来ます。
```
{{ 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` は、現在レンダリングされているテンプレートと同じディレクトリで探されるということを意味します。
第二の場合では、パス・エイリアスを使っています。`@app` のような Yii のエイリアスの全てがデフォルトで利用できます。
また、ビューの中で `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` は、
既に `use` でインポート済みの `JqueryAsset` クラスに翻訳されます。
## URL
URL を構築するのに使える二つの関数があります。
```php
{{ post.title }}
{{ post.title }}
```
`path` は相対的な URL を生成し、`url` は絶対的な URL を生成します。内部的には、両者とも、[[\yii\helpers\Url::to]] を使っています。
## 追加の変数
Twig のテンプレート内では、次の変数が常に定義されています。
- `app` - `\Yii::$app` オブジェクト
- `this` - 現在の `View` オブジェクト
## ブロック
次のようにしてブロックを設定することが出来ます。
```twig
{{ void(this.beginBlock('block1')) }}
これで block1 が設定されました
{{ void(this.endBlock()) }}
```
そして、レイアウト・ビューで、ブロックをレンダリングします。
```twig
{{ this.blocks['block1'] }}
```