Perl HTML::Template 系テンプレートエンジンの使用方法。
HTML::Template::Pro を使用するのがベスト。
[root]# cpan HTML::Template
[root]# cpan HTML::Template::Expr
[root]# cpan HTML::Template::Pro
テンプレートを表示するには、HTTP ヘッダが必要。
use CGI;
my $cgi_obj = CGI->new();
print $cgi_obj->header( -type =>'text/html', -charset =>'utf-8' );
use HTML::Template;
my $tmpl_obj = HTML::Template->new(
filename => 'テンプレートファイル名',
# オプション
default_escape => 'HTML', # " < > &を " < > & に変換
cache => 1, # mod_perl 使用時、テンプレートをキャッシュ
associate => $session, # 他のオブジェクトからパラメータを継承
);
・TMPL_VAR
<!-- tmpl_var escape=html escape=url default=value name=PARAMETER_NAME -->
$tmpl_obj->param( PARAMETER_NAME => '値' );
テンプレート出力時に、値 の文字列に置き換えられる。
オプション
escape=html " < > &を " < &g;, & に変換
escape=url URL エスケープ
default=value デフォルト値を設定
・TMPL_LOOP
<table>
<tr><th>氏名</th><th>NO</th></tr>
<!-- tmpl_loop name=LOOP_NAME -->
<tr><td><!-- tmpl_var name=name --></td><td><!-- tmpl_var name=no --></td></tr>
<!-- /tmpl_loop -->
</table>
my @loop_data = (
{ name => matsui, no => 55 },
{ name => ichiro, no => 51 },
{ name => otani, no => 11 },
);
$tmpl_obj->param( LOOP_NAME => \@loop_data ); # 配列リファレンスを渡す
TMPL_LOOP 内の TMPL_LOOP は問題なく機能する。
・TMPL_IF, TMPL_ELSE
<!-- tmpl_if name=PARAMETER_NAME -->
真の時の処理
<!-- tmpl_else -->
偽の時の処理
<!-- /tmpl_if -->
$tmpl_obj->param( PARAMETER_NAME => 1 );
TMPL_IF と TMPL_LOOP で同じ名前を使用した場合、
ループデータが存在すれば、TMPL_IF ブロックは表示される。
<!-- tmpl_if name=LOOP_NAME -->
ループデータが存在する時、表示される
<!-- /tmpl_if -->
<!-- tmpl_loop name=LOOP_NAME -->
.
.
<!-- /tmpl_loop -->
・TMPL_UNLESS, TEMP_ELSE
<!-- tmpl_unless name=PARAMETER_NAME -->
偽の時の処理
<!-- tmpl_else -->
真の時の処理
<!-- /tmpl_unless -->
$tmpl_obj->param( PARAMETER_NAME => 0 );
TMPL_UNLESS と TMPL_LOOP で同じ名前を使用した場合、
ループデータが存在しなければ、TMPL_UNLESS ブロックは表示される。
<!-- tmpl_unless name=LOOP_NAME -->
ループデータが存在しない時、表示される
<!-- /tmpl_unless -->
<!-- tmpl_loop name=LOOP_NAME -->
.
.
<!-- /tmpl_loop -->
・出力
print を記述しないと、プログラム内の HTTP ヘッダが出力されない。
malformed header from script. Bad header=<!DOCTYPE html>:
print $tmpl_obj->output();
exit;
HTML::Template に関数の機能を追加したもの。
・利用可能な関数| 数の比較 | <, >, ==, !=, <=, >=, <=> |
| 文字列の比較 | gt, lt, eq, ne, ge, le, cmp |
| 算術演算子 | +, -, *, /, % |
| 論理演算子 | &&, || |
| 関数 | sprintf, substr, lc, lcfirst, uc, ucfirst, length, defined, abs, atan2, cos, exp, hex, int, log, oct, rand, sin, sqrt, srand |
use HTML::Template::Expr;
my $tmpl_obj = HTML::Template::Expr->new(
filename => 'テンプレートファイル名',
default_escape => 'HTML',
# オプションは HTML::Template と同様
);
<!-- tmpl_if expr="defined(id)" -->
<!-- tmpl_var name="id" -->
<!-- tmpl_else -->
undefined
<!-- /tmpl_if -->
$tmpl_obj->param( id => '値' );
<!-- tmpl_if expr="weather eq '晴れ'" -->
晴れ
<!-- /tmpl_if -->
<!-- tmpl_if expr="weather eq '曇り'" -->
曇り
<!-- /tmpl_if -->
<!-- tmpl_if expr="weather eq '雨'" -->
雨
<!-- /tmpl_if -->
$tmpl_obj->param( weather => '値' );
HTML::Template(::Expr)と互換性を持つように C/Perl+XS で記述されたもの。
use HTML::Template を use HTML::Template::Pro に変えるだけで、5倍高速になる。
use HTML::Template::Pro;
my $tmpl_obj = HTML::Template->new(
filename => 'テンプレートファイル名',
default_escape => 'HTML',
# オプションは HTML::Template と同様
);