2006/08/02
PHPとテンプレートエンジンSmarty
今日は、かなり久しぶりにPHPの話題。
Webのサーバーサイドスクリプト言語であるPHP。比較的取っつきやすくて動的なWebページを作成するにはうってつけ。今ではかなり幅広く普及した感があります。
ところで、Web上のスクリプト言語である以上、PHPで何らかのデータ処理を行った結果を、最終的にHTMLで吐き出すって作業を避けることができません。ロジカルな部分であるPHPと描画のためのHTMLの両方を扱わざるを得ず、その結果、両者がぐちゃぐちゃに入り交じった可視性の悪いファイルが出来上がることが必至です。
このような開発者泣かせの問題を解決する手段として、テンプレートエンジンSmartyがあります。
Smartyを使うとどのような利点があるかを示すために、日付及び時刻を表示するためのPHPスクリプトを作ってみました。
まずはベタなPHPのみのスクリプト。
サンプル1 (実行結果はここをクリック)
<?php// 現在のタイムスタンプ
$now = time();// 日付と時刻を文字列に変換
$dateStr = date('Y-m-d(D)', $now);
$timeStr = date('H:i:s', $now);// このファイルのパス
$myself = $_SERVER['PHP_SELF'];echo "<html>";
echo "<head><title>sample1</title></head>";
echo "<body>";
echo "<p>Date:$dateStr</p>";
echo "<p>Time:$timeStr</p>";
echo "<a href=\"$myself\">update</a>";
echo "</body>";
echo "</html>";?>
サンプル1は、変数$nowに現在のタイムスタンプを代入し、それを元に日付及び時刻を所定のフォーマットの文字列に変換し、それをブラウザ上に表示するというものです。ページをリロードするかupdateをクリックすることにより、表示が変化することが分かると思います。
この例では、PHPのecho文によってHTMLコードがWebブラウザに渡されています。HTMLコードがPHPスクリプトの中にどっぷりと埋め込まれ、PHPとHTMLがごちゃごちゃして非常に可視性が悪いです。
もう一つ例を挙げておきます。
サンプル2(実行結果はここをクリック)
<?php// 現在のタイムスタンプ
$now = time();// 日付と時刻を文字列に変換
$dateStr = date('Y-m-d(D)', $now);
$timeStr = date('H:i:s', $now);// このファイルのパス
$myself = $_SERVER['PHP_SELF'];?>
<html>
<head><title>sample2</title></head>
<body>
<?php echo "<p>Date:$dateStr</p>" ?>
<?php echo "<p>Time:$timeStr</p>" ?>
<a href="<?php echo $myself ?>">update</a>
</body>
</html>
サンプル1と全く同じ結果が得られるものですが、ソースファイルが若干違います。
前半部分はPHPによるロジカルな部分。後半部分はHTMLコードです。とはいえ、現在時刻等の動的な値を描画するために、PHPスクリプトが後半のHTMLの中に埋め込まれていて、やはりすっきりしません。
いよいよ、テンプレートエンジンSmartyの登場です。
Smartyを使うと、ロジカルなPHPと描画のHTMLを別々に分離することができます。
Smartyを使ったスクリプトを次に示します。
サンプル3(実行結果はここをクリック)
<?php// 現在のタイムスタンプ
$now = time();// 日付と時刻を文字列に変換
$dateStr = date('Y-m-d(D)', $now);
$timeStr = date('H:i:s', $now);// このファイルのパス
$myself = $_SERVER['PHP_SELF'];// Smarty
require_once 'Smarty/Smarty.class.php';
$smarty = new Smarty();$smarty->assign('dateStr', $dateStr);
$smarty->assign('timeStr', $timeStr);
$smarty->assign('myself', $myself);$smarty->display('sample3.tpl');
?>
後半がSmartyによる処理部分。
assignメソッドで動的に表示したい変数、$dateStrとか$timeStrとかをSmartyへ渡し、displayメソッドでWebブラウザへ出力します。
ここにある「$smarty->display('sample3.tpl');」が、ミソ。
sample3.tplがテンプレートです。Smartyは、assignメソッドで受け取った変数を、テンプレートファイルで展開し、その結果をWebブラウザに出力します。
テンプレートファイル sample3.tpl
<html>
<head><title>sample3</title></head>
<body>
<p>Date:{$dateStr}</p>
<p>Time:{$timeStr}</p>
<a href="{$myself}">update</a>
</body>
</html>
動的変数を表すために、{}で囲まれた特殊なタグを使いますが、それ以外は純粋にHTMLであることが分かるでしょう。サンプル1や2のようにecho文がありません。これでPHPとHTMLの分離がスッキリ。
Webページの表示を変更したければテンプレートをいじれば良し。逆にロジカルな部分を修正したければPHPをいじれば良い。開発者にとってメンテナンスが非常に楽ですね。
おすすめ度:

売り上げランキング:13616
発売日:2005/03/15


