テンプレートの構文

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() }}

他のテンプレートを参照する

includeextends 文によるテンプレートの参照には二つの方法があります。

{% include "comment.twig" %}
{% extends "post.twig" %}

{% include "@app/views/snippets/avatar.twig" %}
{% extends "@app/views/layouts/2columns.twig" %}

最初の場合では、現在のテンプレートのパスからの相対的なパスでビューを探しています。 すなわち、comment.twigpost.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

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 がスキャン対象から除外されないように気をつけて下さい。