<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress/2.3.3" -->
<rss version="0.92">
<channel>
	<title>MT312 &#187; テンプレートエンジンについて</title>
	<link>http://www.mt312.com</link>
	<description></description>
	<lastBuildDate>Sun, 07 Sep 2008 15:33:23 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>ja</language>
	
	<item>
		<title>テンプレートエンジンについて</title>
		<description>PHPにテンプレートエンジンは必要か？
この話題はPHP users-mlでも取り上げられました。

PHPはSSIの様にHTML内に埋め込んで使う事ができます。では、テンプレートエンジンが使われているのは何故でしょうか。いずれにせよ、他人のスクリプトを使う場合、デザイン部分だけ独立している方が使いやすいですね。

Smarty
HTML_Template_IT
テンプレートエンジンの魅力
それは、ロジックとデザインの完全な分離です。PHPを知らなくても容易にデザインを変更できるようになります。高機能なテンプレートエンジンでは、表組みや日付のフォーマット変更、文章の要約処理、文字コードの変更まで行う事ができます。

	以下に該当する場合、テンプレートエンジンは特に威力を発揮します。

	デザイン担当者がスクリプトを全く知らない場合。
	ロジックよりデザインを先行して作成する場合。
	複雑なデザインの場合。



PHPタグを上手に使おう
テンプレートエンジンは必要ないと判断した場合でも、作り方次第で上手くデザインを分離させられます。まず、PHPを含むデザインファイルは.phpとせず.htmとしておき、PHPでincludeして使うようにします。これでブラウザでデザインを確認しやすくなります。そして、どこでもPHPが書けてしまう事に甘えずに、スクリプトのみのファイルで極力データを加工しておきます。

※.htmとして良いのは画面への出力部分を極力抽出した場合に限ります。と言うのは、直接アクセスされた場合に中身が丸見えになってしまうからです。関数定義を含めるのも避けましょう。

結果データは &#60;h1&#62;&#60;?echo $arr["title"] ?&#62;&#60;/h1&#62; の様にHTMLに埋め込みます。ところが直接ブラウザで見るとデータが消えてしまっているのが分かります。これはテンプレートエンジンを使わない場合は仕方がありません。PHPタグ&#60;??&#62;はブラウザには表示されません。これが気に入らない場合はテンプレートエンジンを導入しましょう。
デザインを崩してしまう書き方

属性内のクォーテーション
&#60;a href=&#34;&#60;?echo $arr[&#34;url&#34;] ?&#62;&#34;&#62;url&#60;/a&#62; → &#34;&#62;url
これは「'」を使えば回避できます。
&#60;a href=&#34;&#60;?echo $arr['url'] ?&#62;&#34;&#62;url&#60;/a&#62; → url

比較やオブジェクトで使う &#34;&#62;&#34;
&#60;? if($n&#62;=10){ ?&#62; → =10){ ?&#62;
&#60;?echo $obj-&#62;value ?&#62; → value ?&#62;
これらは最近のWEB作成ソフトでは上手く解釈してくれますが、ブラウザでも確認できた方がより便利です。そこで、属性内のクォーテーションと&#34;&#62;&#34;は使わないようにします。テンプレート内で使う変数は予め連想配列にしておき、ループが必要な場合はそれを配列に溜めます。ループにはforeachを活用します。連想配列はクォーテーションを使うので、extract($hash);でキー文字列の変数に変換します。
[php]
< ? foreach($hashes as $hash){extract($hash); ?>
< ?echo $title ?>
written by < ?echo $name ?> on < ?echo date('m/d H:i', $timestamp) ?>
< ?echo $message ?>
 </description>
		<link>http://www.mt312.com/php/38/</link>
			</item>
</channel>
</rss>
