HOME備忘帳

HTML::Template - CGIスクリプトからHTMLテンプレートを使う

プログラムとデザインを分離するのに役立つモジュール。

HTMLに<TMPL_VAR>のようなタグを埋め込んで、テンプレートファイルを作る。 プログラム側では、タグの場所にデータを差し込んで出力できる。

手を入れていたら長くなったので、メソッド関係は分離しました。 この記事は、テンプレートの作り方やテンプレートタグについてです。

# オブジェクトを作って、
use HTML::Template;
my $template = HTML::Template->new(filename => "テンプレートファイル");

# タグと値を置き換えて
$template->param(変数名 => "差し込む値");

# 出力
print "Content-Type: text/html\n\n";
print $template->output;

テンプレートの作り方

HTMLファイルの中の、データを差し込みたい部分に、 HTML::Templateが理解するタグを書き込みます。

HTML::Templateのタグは、HTMLのタグのように<と>にはさまれています。

<p>値= <TMPL_VAR NAME=var></p>

すべてのタグは、HTMLのコメント形式でもOKです。

<p>値=<!-- TMPL_VAR NAME=var --></p>

よく使うタグは、以下の3種類です。

これ以外にも、

などがあります。

テンプレートタグは小文字でもかまいません。

[ ページ先頭へ ]

各タグの説明

<TMPL_VAR NAME="変数名">

単純なデータの差込に使います。 HTMLタグの中にも含めることができます。

<img src="<TMPL_VAR NAME="FILE">"
    alt="<TMPL_VAR NAME="NAME" ESCAPE=HTML DEFAULT=Image>">
ESCAPE
差し込む内容をエスケープします。「HTML」を指定すると、「<」⇒「&lt;」などのHTMLエスケープを行います。 「URL」を指定すると、スペース⇒「+」など、URLとして使えるようにエスケープを行います。
DEFAULT
値が差し込まれなかった場合のデフォルト値を指定できます。 指定しなかった場合は、何も出力しません。
<!-- 以下の3つはどれも同じ -->
<TMPL_VAR NAME="VALUE">
<TMPL_VAR NAME=VALUE>
<TMPL_VAR VALUE>

<TMPL_LOOP NAME="ループ名"> ... </TMPL_LOOP>

囲まれたHTMLのブロックをループします。 ネストしたループも可能です。

データは、配列のリファレンスとして渡します。 配列の各要素は、各回のループで使用する変数と値のハッシュ(のリファレンス)。

TMPL_LOOPの内側では、渡された配列の変数だけを参照し、外側の変数は見えません。 (new時にglobal_varsオプションを指定すると、見えるようになります)

テンプレートを設定して

<table>
<TMPL_LOOP NAME="FRIENDS">
<tr>
<td><TMPL_VAR NAME=NAME></td>
<td><TMPL_VAR NAME=MAIL></td>
</tr>
</TMPL_LOOP>
</table>

プログラムで処理すると

my $friendlist = [
    { name => 'あきら', mail => 'akira@example.com' },
    { name => 'もっちー', mail => 'hitomi@example.com' }
];
$template->param( FRIENDS => $friendlist );
print $template->output();

出力結果はこんな感じ

<table>
<tr>
<td>あきら</td>
<td>akira@example.com</td>
</tr>
<tr>
<td>もっちー</td>
<td>hitomi@example.com</td>
</tr>
</table>

<TMPL_INCLUDE NAME="差込テンプレートファイル">

別のテンプレートファイルを差し込みます。 差し込まれたテンプレートファイルの内容が、そのままその場所に書かれているのと、全く同じように動作します。

無限再帰を回避するため、差込の差込はmax_includesオプションで制限できます。デフォルトは10。

<TMPL_IF NAME="パラメータ名"> ... </TMPL_IF>

パラメータの値が「真」であれば、ブロック内を出力。

TMPL_IF のパラメータ名が、TMPL_LOOP のループ名と同じ場合、そのループが1つでも行を持っていれば「真(出力)」、1行もなければ「偽(スキップ)」。

※注意!:TMPL_IF を考えなしに使うと、このモジュールの利点(PerlとHTMLを分離できること)を損なうかもしれない。

<TMPL_ELSE>

TMPL_IF ブロック内で、パラメータが「偽」だったときに出力する内容を指定。

<TMPL_IF NAME="BOOL">
BOOLが真なら、この部分が出力される
<TMPL_ELSE>
BOOLが偽なら、この部分が出力される
</TMPL_IF>

<TMPL_UNLESS NAME="パラメータ名"> ... </TMPL_UNLESS>

TMPL_IF の逆で、パラメータの値が「偽」であれば、ブロック内を出力する。

TMPL_LOOP との関係もちょうど逆で、ループに1行もないときに出力される。 また、TMPL_ELSE も使用可能。

最終更新日:2010/10/02

[ ページ先頭へ ]