konekto Inc with PHP , MySQL コネクト株式会社 技術情報コンテンツ


[[コーディング指針]]

Smarty

Smartyは、PHPで最も普及しているテンプレートエンジンである。
ここでは、Smartyを使ったコーディングについて触れる。

表示処理の隔離

PHPは、HTMLの中に動的な要素を埋め込むのに適した言語である。 この特徴は、SSI(Server Side Include)と共通している。 しかし、アプリケーションの規模がある程度に達すると、このコーディングスタイルのままでは、処理がバラバラに分離されてしまい、収集がつかなくなる事が容易に想像できる。

このような問題を回避するには、まず機能毎にコードを分類し、(特に)表示処理を隔離する必要がある。
コードとHTMLデザインは密接に絡む必要はなく、むしろテンプレートエンジンを用いて自動的にレイアウトさせるべきである。
これにより、デザインの変更があっても、コードに手を入れる必要は無くなるか最小限の修正だけで済むようになる。

この考え方を突き詰めるとMVCモデルに到達するのだが、ここではテンプレートエンジンについて解説する。

Smartyの使い方

下記は、Smartyを使った初歩的なコーディング例である。
assign()メソッドで値をSmartyに割り当て、display()メソッドでテンプレートを展開している。

<?php
$smarty =& new Smarty;
$smarty->assign('name', 'Zeev & Andi');
$smarty->display('sample.tpl');
?>

下記はテンプレートの例である。

<html><head>
<title>{$name|escape}</title>
</head><body>
Zend Engine: programmed by {$name|escape}.
</body></html>

前述のスクリプトと組み合わせると、{$name|escape}の部分にassign()メソッドで割り当てた“Zeev & Andi”の文字列が挿入される。
また、"|escape"と記述しているのは、文字列にHTMLエンティティが含まれていた場合は、それを無害化している。 この例であれば“&amp;”は“&amp;”に置換される。

よりセキュアにする方法

Smartyを使う場合、次の事に気をつけてコーディングすると、よりセキュアなサイトになる。

  • テンプレートに割り当てる前にサニタイズを行わないこと
  • 割り当てた変数を埋め込む時は、必ず"escape"修正子をつけること
  • HTMLとして表示する変数は、事前に整合性を確認すること

Smartyの拡張

Smartyに標準搭載されているプラグインは、マルチバイト(日本語など)に対応していない。 そのため、文字列を分断する動作を持つプラグイン(truncate, wordwrap など)は、マルチバイトに対応した代替プラグインを作成する必要がある。

静的な拡張

Smartyがインストールされているディレクトリの下に、pluginsというディレクトリがある。ここに、標準搭載されているプラグインが配置されている。

動的な拡張

Smartyには、register_function()など、動的にプラグインを追加するメソッドが用意されている。 このメソッドを使うことで、プラグインを追加する事ができる。 特定のプロジェクトだけで使用するプラグインは、動的に拡張する事が望ましい。

$smarty =& new Smarty();
$smarty->register_modifier("mb_wordwrap");
$smarty->register_modifier("mb_truncate");
$smarty->register_block("zps_cache");

Smartyのプラグイン追加メソッドは次の通り。

メソッド名機能
register_blockブロック関数プラグインの追加
register_compiler_functionコンパイラ関数プラグインの追加
register_functionテンプレート関数プラグインの追加
register_modifier修正しプラグインの追加

最終更新のRSS