WEBシステム開発・ディレクション
プログラムとデザインを分離するのに役立つモジュール。
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種類です。
これ以外にも、
などがあります。
単純なデータの差込に使います。 HTMLタグの中にも含めることができます。
<img src="<TMPL_VAR NAME="FILE">"
alt="<TMPL_VAR NAME="NAME" ESCAPE=HTML DEFAULT=Image>">
ESCAPE
差し込む内容をエスケープします。
DEFAULT
値が差し込まれなかった場合のデフォルト値を指定できます。 指定しなかった場合は、何も出力しません。
囲まれた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>
別のテンプレートファイルを差し込みます。 差し込まれたテンプレートファイルの内容が、そのままその場所に書かれているのと、全く同じように動作します。
無限再帰を回避するため、差込の差込はmax_includesオプションで制限できます。デフォルトは10。
パラメータの値が「真」であれば、ブロック内を出力。
TMPL_IF のパラメータ名が、TMPL_LOOP のループ名と同じ場合、そのループが1つでも行を持っていれば「真(出力)」、1行もなければ「偽(スキップ)」。
※注意!:TMPL_IF を考えなしに使うと、このモジュールの利点(PerlとHTMLを分離できること)を損なうかもしれない。
TMPL_IF ブロック内で、パラメータが「偽」だったときに出力する内容を指定。
<TMPL_IF NAME="BOOL">
BOOLが真なら、この部分が出力される
<TMPL_ELSE>
BOOLが偽なら、この部分が出力される
</TMPL_IF>
TMPL_IF の逆で、パラメータの値が「偽」であれば、ブロック内を出力する。
TMPL_LOOP との関係もちょうど逆で、ループに1行もないときに出力される。
また、TMPL_ELSE も使用可能。
最終更新日:2010/10/02