ユーザ用ツール

サイト用ツール


catalyst:tt

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テンプレートを呼び出してくれる。

catalyst/tt.txt · 最終更新: 2008/01/24 16:00 by 127.0.0.1