テンプレートエンジンについて

PHPにテンプレートエンジンは必要か?

この話題はPHP users-mlでも取り上げられました。

PHPはSSIの様にHTML内に埋め込んで使う事ができます。では、テンプレートエンジンが使われているのは何故でしょうか。いずれにせよ、他人のスクリプトを使う場合、デザイン部分だけ独立している方が使いやすいですね。

Smarty
HTML_Template_IT

テンプレートエンジンの魅力

それは、ロジックとデザインの完全な分離です。PHPを知らなくても容易にデザインを変更できるようになります。高機能なテンプレートエンジンでは、表組みや日付のフォーマット変更、文章の要約処理、文字コードの変更まで行う事ができます。

  • 以下に該当する場合、テンプレートエンジンは特に威力を発揮します。
    • デザイン担当者がスクリプトを全く知らない場合。
    • ロジックよりデザインを先行して作成する場合。
    • 複雑なデザインの場合。

PHPタグを上手に使おう

テンプレートエンジンは必要ないと判断した場合でも、作り方次第で上手くデザインを分離させられます。まず、PHPを含むデザインファイルは.phpとせず.htmとしておき、PHPでincludeして使うようにします。これでブラウザでデザインを確認しやすくなります。そして、どこでもPHPが書けてしまう事に甘えずに、スクリプトのみのファイルで極力データを加工しておきます。

※.htmとして良いのは画面への出力部分を極力抽出した場合に限ります。と言うのは、直接アクセスされた場合に中身が丸見えになってしまうからです。関数定義を含めるのも避けましょう。

結果データは <h1><?echo $arr["title"] ?></h1> の様にHTMLに埋め込みます。ところが直接ブラウザで見るとデータが消えてしまっているのが分かります。これはテンプレートエンジンを使わない場合は仕方がありません。PHPタグ<??>はブラウザには表示されません。これが気に入らない場合はテンプレートエンジンを導入しましょう。

デザインを崩してしまう書き方

属性内のクォーテーション
<a href="<?echo $arr["url"] ?>">url</a> → ">url
これは「'」を使えば回避できます。
<a href="<?echo $arr['url'] ?>">url</a> → url
比較やオブジェクトで使う ">"
<? if($n>=10){ ?> → =10){ ?>
<?echo $obj->value ?> → value ?>

これらは最近のWEB作成ソフトでは上手く解釈してくれますが、ブラウザでも確認できた方がより便利です。そこで、属性内のクォーテーションと">"は使わないようにします。テンプレート内で使う変数は予め連想配列にしておき、ループが必要な場合はそれを配列に溜めます。ループにはforeachを活用します。連想配列はクォーテーションを使うので、extract($hash);でキー文字列の変数に変換します。

PHP

  1. <?php foreach ($arr_list as $arr) {extract($arr); ?>
  2. <h2><?php echo $title; ?></h2>
  3. <p>written by <?php echo $name; ?> on <?php echo date('m/d H:i', $timestamp); ?></p>
  4. <p><?php echo $message; ?></p>
  5. <p><a href="./bbs.php?reply=<?php echo $id; ?>">返信する</a></p>
  6. <hr />
  7. <?php } ?>

こうして少し気を使うだけで、きれいなデザインを保持できます。
自分だけで使う場合は、これで十分かもしれません。

追記

とは言ってもクラスを多用する場合には必然的にオブジェクトの->を使わざるを得ません。連想配列しか使えないのは不便です。そんな場合はテンプレート内専用の変換関数をクラスに属させずに集めておくと便利になり、見通しも効きます。例えばオブジェクトの変数を取り出すだけの関数や表組み生成などの1行では書けない様な処理も該当します。ここで使っているWordPressもテンプレート用の関数を充実させて使いやすい様に設計されています。

コメントは受け付けていません。