HTML::Template 系テンプレートエンジン

概要

Perl HTML::Template 系テンプレートエンジンの使用方法。

HTML::Template::Pro を使用するのがベスト。

インストール

    [root]# cpan HTML::Template
    [root]# cpan HTML::Template::Expr
    [root]# cpan HTML::Template::Pro

HTTP ヘッダ

    テンプレートを表示するには、HTTP ヘッダが必要。

    use CGI;
    my $cgi_obj = CGI->new();

    print $cgi_obj->header( -type =>'text/html', -charset =>'utf-8' );

HTML::Template

・オブジェクト作成
    use HTML::Template;
    my $tmpl_obj = HTML::Template->new(
                          filename => 'テンプレートファイル名',
                          # オプション
                          default_escape => 'HTML',  # " < > &を &quot; &lt; &gt; &amp; に変換
                          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   " < > &を &quot; &lt; &g;, &amp; に変換
    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::Expr

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::Pro

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