Smartyを使おう

この例文のbeforeはまだ上品なほうです。
変数にタグをがっつり格納して、とか世間では枚挙に暇がないので、コードをさわりながら実際のHTMLコードを脳内でイメージすることが不可能になるなんてことは日常茶飯事です。
Smartyがすばらしいのは、とにかくタグが全てテンプレートにまとまっていることです。なんでもかんでもHTMLをPHPから分離したから偉い、というわけでなく、HTMLコードが分解分解されて細胞内でどろどろにほどけたゲノムのようになっているのが、おおまかにでも構造化されて1つの塊として存在できるのがすばらしい。
また、PHP上で最も有益なのは、DBからなにも加工せず抜いてきたデータをそのままなにも加工せずassignできる場合が多いことです。
テンプレートまでデータは元の形を保持します。
デザインが変更になる場合、往々にしてデータのフォーマットが変更されたり、カラムの順番が変わったりすることがあるものです。
そういうときにPHPでprocedualに書かれているプログラムの前後関係や逐次処理をいじるというのは、逝くところまで逝ってしまったスパゲッティソースにおいてはまさに進退窮まるものです。Smartyは、そういう腐ったプログラマを超かっこよくしてくれます。パフォーマンス? だいたい美しくないプログラムというのは往々にしてパフォーマンスが屑です。ネストした中で1行づつSQL発行したりしていますよね? 下記のサンプルコードでも、DBサーバ側で日付フォーマット処理をしています。しねばいいのに。そんなことはスケールさせたWEBサーバでやることです。 Smartyを使うことで数%処理時間が増えるかもしれませんが、同時に必要なインデックスを見直せば処理速度が数倍になったりするのではありませんか? すべてはセンスがないからなのです。それでも不満な人はCでcgiでも作ったらいかがでしょうか。

    • before
print "<h1>顧客企業一覧</h1>";
print "<table>"
print "<tr><th>会社名</th><th>住所</th><th>地図</th><th>ホームページ</th><th>紹介文</th><th>更新日</th></tr>";

$sql = ' 
	select
		id,
		name,
		address,
		to_char(update_date, 'yyyy年mm月dd日') AS update_date, --こういうSQLもきもい
		url,
		introduce
	from 
		company 
';
$rows = $db->query_rows($sql);

foreach ($rows as $row) {
	
	//こういう前処理とかきもいよね
	$name = str_replace(array('株式会社', '有限会社'), '', $row['name']);
	
	print "<tr>"
	print "<td>" . $name . "</td>";
	print "<td>" . $row['address'] . "</td>";
	
	//住所があるばあいは地図を出す
	if ($row['address']) {
		print "<td><a href="map.php">地図</a></td>
	}
	
	print "<td><a href=\"" . $row['url'] . "\">ホームページ</a></td>";
	print "<td>" . mb_substr($row['introduce'], 0, 100) . "...</td>";
	print "<td>" . $row['update_date'] . "</td>
	print "</tr>";
}

print "</table>"
$smarty = new Smarty();

$sql = ' select * from company ';
$companies = $db->query_rows($sql);
$smarty->assign('companies', $companies);
    • template
<h1>顧客企業一覧</h1>
<table>
	<tr>
		<th>会社名</th>
		<th>住所</th>
		<th>地図</th>
		<th>ホームページ</th>
		<th>紹介文</th>
		<th>更新日</th>
	</tr>
	{foreach from=$companies item=company}
	<tr>
		<td>{$company.name|regex_replace:"(株式会社|有限会社)":""}</td>
		<td>{$company.address}</td>
		{if $company.address}
		<td><a href="map.php"></td>
		{/if}
		<td>{$company.url|url2link}</td>
		<td>{$company.introduce|mb_substr:0:100}...</td>
		<td>{$company.update_date|date_format:"%Y年%m月%d日"}</td>
	</tr>
	{/foreach}
</table>