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 と同様 );