Template Toolkitによるビュー作成
以下のモジュールを追加
- Catalyst::View::TT
- Catalyst::Plugin::Charsets::Japanese
- Catalyst::Helper::View::TT ( or Catalyst::Helper::View::TTSite )
Template Toolkit 本体が入ってなければ、それも入れる。たぶん一緒に入るはず(覚えてないw)
ヘルパースクリプトでTemplate Toolkit用でビューを処理するクラス作成
$ ./script/hoge_creator view TT TT
最初のTTはクラス名、後ろのTTはテンプレートツールキットを使うよ、の意味
$ ./script/hoge_creator view TT TTSite
とすると、WRAPPERなどの設定が入ったTTクラスを作ってくれる。詳しくはググってちょうだい。
テンプレートファイル置き場をアプリケーションディレクトリに作成
$ mkdir ${APP_ROOT}/root/tmpl
${APP_ROOT}/Hoge.yml
にテンプレートツールキット用の設定を追加
Charsets::Japanese: charsets: 'UTF-8' View::TT: INCLUDE_PATH: - 'root/tmpl' TEMPLATE_EXTENSION: '.tt'
テンプレート${APP_ROOT}/root/tmpl/test/hello.tt
を作成
<body> [% hogehoge %] </body>
コントローラ ${APP_ROOT}/lib/Hoge/Controller/Test.pm
を修正
sub hello : Local { my ($self, $c) = @_; $c->stash->{hogehoge} = "ホゲホゲ" } sub end : Private { my ($self, $c) = @_; # レスポンスボディが無い時にテンプレートツールキット(さっき作ったTTクラス)に処理を委譲する $c->forward($c->view('TT')) unless $c->response->body; }
サーバを起動してhttp://localhost:3000/test/helloへアクセス。ホゲホゲと表示されたらおめでとう。コントローラとビューまで出来ました。
リダイレクトする場合の処理
コントローラで
sub hello : Local { my ($self, $c) = @_; $c->res->redirect($c->uri_for("/hoge/index")); }
とやるとリダイレクトできるが、Catalystがテンプレートを呼ぼうとしておかしくなるのでendに小細工する。
sub end : Private { my ($self, $c) = @_; $c->forward($c->view('TT')) unless ($c->response->body || $c->response->redirect); }
参考:hide-k.net#blog: Catalyst::Response->redirect()のメモ
このendを Root.pm に書いて、全コントローラで共有するのが良いかも。
まとめて404ページへ
いろいろディスパッチメソッドで404を返すケースがあり、404エラーで共通のテンプレートを使いたい場合フォワード処理をRoot.pmのend辺りにまとめてしまう
sub hello : Local { my ($self, $c) = @_; ... if ( ... ) { $c->res->status(404); return; } ... } sub end : Private { my ($self, $c) = @_; if ($c->stash->status eq '404') { $c->stash->{template} = "何か404のテンプレート"; $c->forward($c->view("View::TT")); return; } }
ヴァーチャルメソッドの追加
Template Toolkit上で使えるVirtual Methodは簡単に追加出来る。
以下のようなモジュールを作成し、catalystを起動するpmファイルか、Root.pm辺りでuse。
package Hoge::Util::TT::VMethod; use strict; use warnings; use Template::Stash; # 数字を3桁でカンマ区切りする $Template::Stash::SCALAR_OPS->{ comma } = sub { my $price = shift; while ( ($price =~ s/([0-9]+)([0-9]{3})/$1,$2/) ){ ; } return $price; };
とりあえず動かすだけならこれで充分だが、Catalystプラグインとして組み込む方法があると思われ。
UTF8で文字化け
FillInFormなどが入ると文字化けすることがある。Hoge::View::TTの親クラスをCatalyst::View::TT::ForceUTF8にすると治るかも。
文字化けの原因がよくわからんので要調査。
ラッパー
Template Toolkitにはラッパーというテンプレート部品化機能がある。INCLUDEとの違いは
- INCLUDE = 自分に、他のテンプレートを埋め込む
- WRAPPER = 自分を、他のテンプレートに埋め込む
という違いがある。
こんな感じでWrapperテンプレを作る
<!-- root/tmpl/wrapper/hoge.tt --> <html> <head> <title>[% title %]</title> </head> <body> [% content %] </body> </html>
Catalystが呼び出すテンプレートは、こう書く
<!-- fuga/piyo.tt 例えば Fuga.pm の piyo:Local から呼ばれるやつ --> [% WRAPPER wrapper/hoge title = "呼び出し側から変数を設定出来るよ" -%] <p>ここは普通にテンプレートを書く</p> [% END -%]
出力結果は
<html> <head> <title>呼び出し側から変数を設定出来るよ</title> </head> <body> <p>ここは普通にテンプレートを書く</p> </body> </html>
Auto Wrapperを使うと、[% WRAPPER %]とか書かなくてもWrapperテンプレートを呼び出してくれる。