トップページ >  perl >  Catalystでテンプレートを利用する
初版2012/05/13: 最終更新日2012/05/13
Catalystでテンプレートを利用する
目次
ビューの種類
Template Toolkit の説明
Catalyst で TTを利用してみる
テンプレートへ変数をセットする
まとめ
ビューの種類
Catalystでは、HTMLなどを直接コントローラーに記載して出力する事も出来ますが、
一般的にはビューのコンポーネントを使い、
ロジックとビューを切り分けて開発を行います。

Catalystは、MVCモデルに沿って実装されているため、
今回は、この「V」にあたるビューについてのお話となります。

先ほどもお話した通り、
下記のようなさまざまなビューコンポーネントを利用する事が可能です。

Catalytは、CPAN(Perlのモジュールが公開されているサイト)のモジュールを組み合わせて構成されているフレームワークです。

CPANで、テンプレートに使えるビューのコンポーネント(Catalyst::View で検索)を検索してみると、
100以上のモジュールが出てきます。
下記に、代表的なCatalyst::Viewで利用出来るモジュールを紹介します。


コンポーネント 概要
Catalyst::View::TT Template Toolkit を利用できる
Catalyst::View::HTML::Template HTML::Template を利用できる
Catalyst::View::JSON JSONデータ形式で吐き出す時に利用

その他にも、ファイrのダウンロードを扱うものや、
CSVデータを扱うものなど、さまざまなモジュールがオープンソースとして提供されています。

Template Toolkit の説明

今回は、Perlのウェブアプリケーション開発にて、
もっとも利用されているテンプレートエンジン「Template Toolkit」をご説明していきます。

通称「TT」と呼ばれています。
もともと、単なるテンプレートエンジンではなく、
テンプレートエンジンをつくるためのツール群をまとめたものとなっています。


テンプレートの記載方法は下記のようになります。
<html> <head><title>[%- title -%]</title></head> <body> <h1>[%- message.text1 -%]</h1> <h2>[%- message.text2 -%]</ht2> [%- IF test -%] テストOK<br /> [%- END -%] [%- FOREACH item = items -%] [%- item -%]<br /> [%- END -%] </body> </html>

■変数の展開
プログラムの中で、
title という変数にスカラー値を入れておくと、

[%- title -%]

という形で展開出来ます。

また、Perlでいうハッシュ( key と value の組み合わせの構造 )で値をセットした場合、
message に text1 と text2 という key を持つハッシュをセットした場合は、

[%- message.text1 -%]
[%- message.text2 -%]

という形で、ハッシュの値にアクセスできます。

■条件分岐
プログラムと同じように IF文 が利用できます。


■ループ処理
こちらも WHILE や FOREACH が利用できます。

[% FOREACH item = items -%]

items にリストの値をセットする事により、順番に処理されます。


Catalyst で TTを利用してみる
Catalyst にて、Template Toolkit (通称TT)を利用してみます。

Catalystにはヘルパースクリプトというものがいくつか用意されており、
今回は、こちらを利用して Template Toolki を利用する準備をしたいと思います。

サンプルでよく出てくるような「Hello World」アプリケーションを作成している場合。

下記のようなファイル構成でプロジェクトが作成されていると思います。

HelloWorld
|-- Changes
|-- Makefile.PL                -- 作成したアプリケーションのパッケージや
|                                 配布に使用するためのスクリプトファイル
|-- README
|-- lib
|   |-- HelloWorld
|   |   |-- Controller         -- Controllerディレクトリ
|   |   |   `-- Root.pm        -- ルートControllerスクリプトファイル
|   |   |-- Model              -- アプリケーションのModelを作成するモジュール置き場
|   |   `-- View               -- アプリケーションのViewを作成するモジュール置き場
|   `-- HelloWorld.pm            -- モジュール本体
|-- HelloWorld.conf              -- 設定ファイル
|-- root       
|   |-- favicon.ico
|   `-- static                 -- 静的コンテンツを置くディレクトリ
|-- script                     -- ヘルパースクリプト用ディレクトリ
|   |-- HelloWorld_cgi.pl
|   |-- HelloWorld_create.pl
|   |-- HelloWorld_fastcgi.pl
|   |-- HelloWorld_server.pl
|   `-- HelloWorld_test.pl
`-- t                          -- テスト用スクリプトディレクトリ
    |-- 01app.t
    |-- 02pod.t
    `-- 03podcoverage.t

(※Catalystのバージョンにより多少の差異があります)


上記のヘルパースクリプトが入っている
script ディレクトリ内にある、
プロジェクト名_create.pl を利用します。


shell> perl script/HelloWorld_create.pl view TT TT

※ ここでエラーが出る場合は、
CPAN よりこちらのモジュールをインストールしてください。
Catalyst::Helper::View::TT


上記を実行する事により、TT.pm という Template Toolkit を利用するためのクラスが、
lib/HelloWorld/View/TT.pm
として作成されます。

テンプレートを設置するディレクトリを作成します。

shell> mkdir HelloWorld/tmpl (任意の場所でかまいません)

テンプレートの設置場所を作成したら、設定ファイルに書き込みます。
設定ファイルが無い場合は、作成してください。

HelloWorld という名前でプロジェクトを作成しているため、
HelloWorld/HelloWorld.yml という設定ファイルになります。

HelloWorld/HelloWorld.yml
name : HelloWorld

View::TT:
    INCLUDE_PATH:
      - '/path/to/HelloWorld/tmpl' (先ほど作成したテンプレート設置ののパス)
    TEMPLATE_EXTENSION:'.tt'
先ほど準備したテンプレート用ディレクトリに、テンプレートとなるファイルを置きます。
拡張子は、上記の YAMLで設定した「TEMPLATE_EXTENSION」となります。

HelloWorld/tmpl/hello.tt
こちらを準備しましょう。

テンプレートは、ネームスペースとメソッド名に対応しています。

ネームスペース メソッド 対応ディレクトリ
HelloWorld/Root.pm の helloメソッド HelloWorld/tmpl/hello.tt
HelloWorld/Test.pm の messageメソッド HelloWorld/tmpl/test/message.tt
HelloWorld/Test/Sample.pm の executeメソッド HelloWorld/tmpl/test/sample/exeucte.tt

上記のように、テンプレートを置くことにより、フレームワークが自動的にテンプレートを取得し
プログラムが実行されます。


テンプレートへ変数をセットする
利用するテンプレートに変数をセットする場合は、
下記のように利用します。

テンプレート内での変数の記述の仕方は上記で説明しましたが、
その名前に対応するものを、プログラム内では stash という場所に保存します。

この「stash」へ保存する事により、Catalystが自動でテンプレートに値をセットしてくれます。


■[%- message -%] に値を展開したい場合
    $c->stash->{message} = 'ハロー';

■ハッシュ値を出力する場合

    my %hash = ( text1 => 'テスト1',
                 text2 => 'テスト2' );

	$c->stash->{message} = \%hash; # ハッシュや配列の場合はリファレンスでセットする

このようにセットすると、
[%- message.text1 -%] で テスト1へアクセス出来ます。

■配列を出力する場合

    my @array = ( 'test1', 'test2', 'test3' );

	$c->stash->{message} = \@array; # ハッシュや配列の場合はリファレンスでセットする

このようにセットすると、

[%- FOREACH item= message -%] [%- item -%]<br /> [%- END -%]
テンプレートで上記のように記載する事で、配列の値が順番に出力できます。

これらのように、テンプレートに値を出力する事が可能です。
まとめ
このように、テンプレートエンジンを利用し、
Catalyst では MVC構造でウェブアプリケーションを構築する事が可能です。

また、テンプレートの利用も比較的簡単に導入できるため、
ぜひ利用していてください。