テンプレートファイルで使用可能なディレクティブ
Catalyst::View::TTで使用可能なディレクティブは、Template::Toolkitのディレクティブがそのまま使えます。テンプレートファイルで記述するディレクティブは[%と%]の間に記述します。
INSERT
INSERTディレクティブでは、指定したファイルの内容を、そのまま挿入します。
[% INSERT list.txt %]
上記のように記述した場合、list.txtファイルの中身がそのまま挿入されます。もしINSERTでテンプレートファイルを指定した場合には、テンプレート処理は行われず、ファイルの中身がそのまま挿入されます。
INCLUDE
INCLUDEディレクティブでは、指定したファイルに対してテンプレートの変換処理を実行した後で、指定した位置に挿入します。
[% INCLUDE header %]
上記のように記述した場合、headerファイルをテンプレートして処理し、その結果を指定した位置に挿入します。
PROCESS
PROCESSディレクティブもINCLUDEと同様に、指定したファイルに対してテンプレート処理を行います。それぞれの違いは、INCLUDEでは呼び出し先には変数をコピーして渡しますが、PROCESSではそのまま参照として渡すため、呼び出し先で変数の値を変更した場合には、呼び出し元でも変更された値が返ってきます。
呼び出し元のテンプレートファイルをtmpl1、呼び出し先のテンプレートファイルをtmpl2として、次のように定義します。
# tmpl1 [% value = 10 %] value is [% value %] before tmpl2 [% INCLUDE tmpl2 %] value is [% value %] after tmpl2 [% value = 10 %] value is [% value %] before tmpl2 [% PROCESS tmpl2 %] value is [% value %] after tmpl2 # tmpl2 value was [% value %] at tmpl2 [% value = 20 %] value is [% value %] at tmpl2
このテンプレートを実行した結果は、次のようになります。
value is 10 before tmpl2 value was 10 at tmpl2 value is 20 at tmpl2 value is 10 after tmpl2 value is 10 before tmpl2 value was 10 at tmpl2 value is 20 at tmpl2 value is 20 after tmpl2
BLOCK
同じテンプレートの中で、処理をメソッドのように切り分けたい場合などでは、BLOCKディレクティブを使うことができます。BLOCKを定義する場合、処理の終わりではENDを指定します。
[% BLOCK tabrow %] <tr> <td>[% name %]<td> <td>[% email %]</td> </tr> [% END %] <table> [% PROCESS tabrow name='Fred' email='fred@nowhere.com' %] [% PROCESS tabrow name='Alan' email='alan@nowhere.com' %] </table>
上記の例ではtabrowという名前のついたBLOCKをPROCESSから呼び出しています。PROCESS以外にもINCLUDEや、ここでは説明していませんがWRAPPERディレクティブから呼び出すことができます。また、上記のように引数を指定することもできます。
IF/UNLESS/ELSIF/ELSE
条件分岐を行う場合には、IF、UNLESSディレクティブを使用できます。IFでは条件式が真の場合に、UNLESSでは条件式が偽の場合にその後の実行文に処理が渡ります。複数の条件を扱う場合にはELSIF、ELSEを使用します。
[% IF gender == 'male' %] [% message = '男の子' %] [% ELSIF gender == 'female' %] [% message = '女の子' %] [% ELSE %] [% message = 'そうでない人' %] [% END %] [% message %]
条件式で使用可能なオペレータは「== != < <= > >= && || ! and or not」です。
また、条件分岐関連のディレクティブとしては、他にはSWITCH~CASEも使用可能です。
FOREACH
ループ処理を行うには、FOREACHディレクティブを使用できます。
[% items = ['foo', 'bar', 'baz' ] %] [% FOREACH i IN items %] [% i %] [% END %]
INの代わりに=を使い、次のように記述することもできます。
[% FOREACH i = items %]
ループ関連のディレクティブとしては、他にはWHILEも使用可能です。
META
METAディレクティブを使用すると、テンプレートにメタデータを記述できます。TTSiteヘルパクラスが作成したテンプレートファイルには、メタデータとして「title」が設定されています。
これはテンプレートファイルによって表示するタイトルを切り替えるために使用しています。
Template::Toolkitには他にもさまざまなディレクティブが用意されており、今回紹介したもの以外のディレクティブについては、Template::Manual::Directivesを参照ください。
