HTML_Template_PHPLIB

HTML_Template_PHPLIB は、 かつてとても有名だったテンプレートクラス PHPLIB を PEAR 化したものです。変数や繰り返しブロックの機能を提供します。 元の PHPLIB のコードは phplib.sf.net にあります。

考え方

HTML_Template_PHPLIB を用いて HTML やその他のコードをテンプレートから作成するには、 次の手順に従います。

  1. テンプレートクラスのインスタンスを作成する

  2. テンプレートファイルを読み込む

  3. ブロックを定義する

  4. 変数を設定し、ブロックをパースする

  5. 処理を終え、出力する

変数 は HTML コード内のプレースホルダとなり、 データベースから取得した値やコード中で計算した値などで動的に置き換えられます。 変数は、例えば {CODE_AUTHOR} のように、 変数名を波括弧で囲んだ形式になります。 変数名には任意の文字を使用できますが、 空白やタブ、改行は使用できません。

ブロック は、その内部に HTML のコード片を保持するもので、 再利用することができます。例えば、テーブルの行を表す <tr> などです。 ブロックの定義には HTML のコメントを使用し、その中に BEGIN あるいは END とブロック名を含めます。例えば次のようになります。
<table>
 <caption>作者</caption>
 <thead>
  <tr><th>名前</th><th>Email</th></tr>
 </thead>
 <tbody>
<!-- BEGIN authorline -->
  <tr><td>{AUTHOR_NAME}</td><td>{AUTHOR_EMAIL}</td></tr>
<!-- END authorline -->
 </tbody>
</table>

シンプルな例

例 47-143テンプレートファイル: authors.tpl

<html>
 <head><title>{PAGE_TITLE}</title></head>
 <body>
  <table>
   <caption>作者</caption>
   <thead>
    <tr><th>名前</th><th>Email</th></tr>
   </thead>
   <tfoot>
    <tr><td colspan="2">{NUM_AUTHORS}</td></tr>
   </tfoot>
   <tbody>
<!-- BEGIN authorline -->
    <tr><td>{AUTHOR_NAME}</td><td>{AUTHOR_EMAIL}</td></tr>
<!-- END authorline -->
   </tbody>
  </table>
 </body>
</html>

例 47-144PHP のコード: authors.php


<?php
// この作者一覧を表示します
$authors = array(
    'Christian Weiske'  => 'cweiske@php.net',
    'Bjoern Schotte'     => 'schotte@mayflower.de'
);

require_once 'HTML/Template/PHPLIB.php';
// テンプレートオブジェクトを作成します
$t =& new HTML_Template_PHPLIB(dirname(__FILE__), 'keep');
// ファイルを読み込みます
$t->setFile('authors''authors.tpl');
// ブロックを設定します
$t->setBlock('authors''authorline''authorline_ref');

// 変数の値を設定します
$t->setVar('NUM_AUTHORS'count($authors));
$t->setVar('PAGE_TITLE''Code authors as of ' date('Y-m-d'));

// 作者を表示します
foreach ($authors as $name => $email) {
    $t->setVar('AUTHOR_NAME'$name);
    $t->setVar('AUTHOR_EMAIL'$email);
    $t->parse('authorline_ref''authorline'true);
}

// 終了処理を行い、出力します
echo $t->finish($t->parse('OUT''authors'));
?>

ファイルの読み込み

テンプレートファイルの場所は、定義されている ルートディレクトリからの相対パスとなります。 ルートディレクトリを指定するには、コンストラクタ (の最初のパラメータ、デフォルトは .) あるいは setRoot() を使用します。

ファイルは、その ハンドル 名で参照します。 そこで、setFile() をコールする際には 最初のパラメータにハンドル名、二番目のパラメータにファイル名を指定することになります。 より手軽に使用するために、 ハンドルとファイル名の配列をこのメソッドに渡すこともできます。

例 47-145テンプレートファイルの読み込み


<?php
$t =& new HTML_Template_PHPLIB(dirname(__FILE__), 'keep');
$t->setFile('authors''authors.tpl');
?>

ブロックの定義

HTML コードの一部 (例えばテーブルの行など) を再利用したい場合は、 先ほどの例で示したようにブロックを定義することができます。

ブロックは自動的に検出されるわけではなく、明示的に setBlock() メソッドで定義する必要があります。 このメソッドの最初のパラメータはブロックが存在するファイルのハンドル、 二番目のパラメータはファイル中のブロック名、 そして三番目のパラメータが新しい ブロックハンドル となります。

例 47-146ブロックの定義


<?php
$t->setBlock('authors''authorline''authorline_ref');
?>

サンプルのテンプレート (authors というハンドルのもの) では authorline というブロックが定義されています。 ブロックのハンドルが、これによって authorline_ref となります。

変数の設定

これは最も簡単な作業です。単に、setVar() に変数名とその値を指定するだけです。オプションの三番目のパラメータに boolean 値を指定すると、新しい値を既存の値に追記するかどうかが設定できます (デフォルトは false です)。

例 47-147変数の設定


<?php
$t->setVar('AUTHOR_NAME''Christian Weiske');
?>

これは、変数がブロック内で定義されているか否かにかかわらず、 テンプレート内のすべての変数に影響を及ぼします。

ブロックのパース

ブロック内のすべての変数を設定し終えたら、それらを「保存」 して別の場所でブロックを再利用したくなることでしょう。 メソッド parse() は、そんなときに便利です。 最初のパラメータはブロックの内容を保存する変数/ハンドル、 二番目のパラメータがブロックのハンドル名となります。 オプションの三番目のパラメータは、 ブロックの内容ををハンドルの値に追記するかどうかを指定します。 デフォルトは false ですが、おそらくは有効にしたくなるでしょう。

例 47-148ブロックのパース


<?php
foreach ($authors as $name => $email) {
    $t->setVar('AUTHOR_NAME'$name);
    $t->setVar('AUTHOR_EMAIL'$email);
    $t->parse('authorline_ref''authorline'true);
}
?>

この例では、ハンドル authorline_ref の中にブロック authorline の内容が投入されます。 三番目のパラメータを true ではなく false にすると、最後の行だけが投入されることになります。

最終処理 & 出力

変数の設定とブロックのパースが完了したら、 いよいよ結果をクライアントに出力するときです。 まず必要なことは、ファイルハンドルの内容を parse() して新しいハンドルを作成することです。

未使用の変数やブロックを削除するために、 finish() をコールすることになるでしょう。 unknowns に設定した値 (コンストラクタの二番目の引数か、あるいは setUnknowns() を使用します) に応じて、未使用の変数の扱いが 削除 (remove)、 そのまま保持 (keep) あるいはコメントアウト (comment) のいずれかとなります。

HTML を出力するには、finish() の返り値を直接使用するか、あるいは get() を使用して内容を取得します。

例 47-149ファイルの終了と、その書き出し


<?php
$t->parse('OUT''authors');
$htmlcode $t->finish(
    $tpl->get('OUT')
);
echo $htmlcode;
?>

例 47-150ファイルの終了とその書き出し、簡単な方法


<?php
echo $tpl->finish($t->parse('OUT''authors'));
?>