Twig の基礎を学ぶための最善のリソースは、twig.symfony.com にある公式ドキュメントです。 それに追加して、下記に説明する Yii 固有の拡張構文があります。
結果が必要な場合は、次の構文を使ってメソッドや関数を呼び出すことが出来ます。
{% set result = my_function({'a' : 'b'}) %}
{% set result = myObject.my_function({'a' : 'b'}) %}
結果を変数に代入する代りに echo したい場合は、こうします。
{{ my_function({'a' : 'b'}) }}
{{ myObject.my_function({'a' : 'b'}) }}
結果を必要としない場合は、void
ラッパーを使わなければなりません。
{{ void(my_function({'a' : 'b'})) }}
{{ void(myObject.my_function({'a' : 'b'})) }}
set
と呼ばれる特別な関数を使って、オブジェクトのプロパティを設定することが出来ます。
例えば、テンプレート中の下記のコードはページ・タイトルを変更します。
{{ set(this, 'title', 'New title') }}
追加のクラスと名前空間をテンプレートの中でインポートすることが出来ます。
名前空間のインポート:
{{ use('/app/widgets') }}
クラスのインポート:
{{ use('/yii/widgets/ActiveForm') }}
エイリアス化してクラスをインポート:
{{ use({'alias' : '/app/widgets/MyWidget'}) }}
追加の情報を レイアウトとウィジェット で参照してください。
たいていの場合、ウィジェットとアセットを除くと、globals によってクラスをインポートしなければなりません。
例えば、次のコードは何も表示しません。
{{ use('yii/helpers/Url') }}
<h1>{{ Url.base(true) }}</h1>
次のコードも何も表示しません。
{{ use ('app/models/MyClass') }}
{{ MyClass.helloWorld() }}
これらのクラスは、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'],
],
],
],
],
// ....
こうして、はじめて、クラスをそのように使うことが出来ます。
<h1>{{ Url.base(true) }}</h1>
{{ MyClass.helloWorld() }}
include
と extends
文によるテンプレートの参照には二つの方法があります。
{% 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 以降)。
{{ register_asset_bundle('yii/web/JqueryAsset') }}
以前は、もう少し饒舌な文法が使われていました。
{{ use('yii/web/JqueryAsset') }}
{{ register_jquery_asset() }}
上記のコードで、register
は、アセットを扱うことを指定し、jquery_asset
は、
既に use
でインポート済みの JqueryAsset
クラスに翻訳されます。
URL を構築するのに使える二つの関数があります。
<a href="{{ path(['blog/view'], {'alias' : post.alias}) }}">{{ post.title }}</a>
<a href="{{ url(['blog/view'], {'alias' : post.alias}) }}">{{ post.title }}</a>
path
は相対的な URL を生成し、url
は絶対的な URL を生成します。内部的には、両者とも、\yii\helpers\Url::to を使っています。
Twig のテンプレート内では、次の変数が常に定義されています。
app
- \Yii::$app
オブジェクトthis
- 現在の View
オブジェクト次のようにしてブロックを設定することが出来ます。
{{ void(this.beginBlock('block1')) }}
これで block1 が設定されました
{{ void(this.endBlock()) }}
そして、レイアウト・ビューで、ブロックをレンダリングします。
{{ this.blocks['block1'] }}
次の文法を使ってメッセージを翻訳することが出来ます。
{{ t('app', 'Hello, world!') }}
./yii message
がメッセージを抽出できるようにするために、@runtime/Twig/cache
がスキャン対象から除外されないように気をつけて下さい。