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 ... ひとつのデータを差し込む
- TMPL_LOOP ... リストなど、同じ書式で複数のデータを差し込むとき
- TMPL_IF ... 条件によって、ページ内の一部を出力する/しない
これ以外にも、
- TMPL_UNLESS ... TMPL_IFの逆。
- TMPL_ELSE ... TMPL_IFやTMPL_UNLESSの中で使える。
- TMPL_INCLUDE ... 別のテンプレートを読み込む
などがあります。
テンプレートタグは小文字でもかまいません。
[ ページ先頭へ ]
各タグの説明
<TMPL_VAR NAME="変数名">
単純なデータの差込に使います。 HTMLタグの中にも含めることができます。
<img src="<TMPL_VAR NAME="FILE">" alt="<TMPL_VAR NAME="NAME" ESCAPE=HTML DEFAULT=Image>">
- ESCAPE
- 差し込む内容をエスケープします。「HTML」を指定すると、「<」⇒「<」などのHTMLエスケープを行います。 「URL」を指定すると、スペース⇒「+」など、URLとして使えるようにエスケープを行います。
- DEFAULT
- 値が差し込まれなかった場合のデフォルト値を指定できます。 指定しなかった場合は、何も出力しません。
- NAMEを指定する時、ダブルクオートを省略してもかまいません。
- NAME自体も省略しても構いません。
<!-- 以下の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
[ ページ先頭へ ]