Smartyの内容と働き
Smartyを専門用語で言えば、テンプレートエンジンです。要するに、開発者が標準的なサイトレイアウトを維持しながらプレゼンテーションからロジックを切り離すことを簡単にできるようにするフレームワークです。多くのオンラインディスカッションフォーラムで、SmartyはMVCパラダイムの最小限の有効な実装かどうかという議論が繰り広げられていますが、私自身の考えでは、Smartyは経験の浅い開発者がコードとプレゼンテーションの分離を実現するための抜け道です。
Smarty自体は基本的な構文を持つプログラミング言語です。前述のフォーラムで議論されているように、プレゼンテーションロジックを持つプレゼンテーションエンジンが必要だと考える人もいるようです。個人的には、ビジネスロジックとプレゼンテーションロジックの両方が存在すると考えます。つまり、プレゼンテーションロジックの乱用はよくないと思う場合でも、両方のロジックを受け入れることは可能です。実際、PHPコードによって、最終的な変数の代入をできる限り多く処理する必要があり、結局のところ、SmartyテンプレートはHTMLファイルを保たなければなりません。
Smartyをインストールするには、2つのディレクトリ(templatesとconfigs)を作成する必要があります。一般に、これらの2つのディレクトリはWebサーバードキュメントルートの外に置く必要がありますが、この例ではアプリケーションルートの下に入れました(smarty/templatesとsmarty/configs)。smarty/templatesディレクトリには、拡張子が.tplであるすべてのSmartyファイルを入れます。結局、Smartyファイルは、PHPコードによってコンテンツの割り当てと受け渡しが行われる単なるHTMLファイルです。
すでに説明したように、Smartyには、プレゼンテーションロジックの簡単な管理に役立つ基本的な構文が用意されています。{include ...}という便利な構成体を使うと、複数のテンプレートの共通部分を1つのマスタテンプレートに埋め込むことができます。私は、PHPファイルと同じ命名スキーマを採用し、HTMLページの部分的なパーツを表すファイルに「inc」という接尾辞を使いました。このモジュール式メカニズムでは、Smarty/HTMLテンプレートの作成を始める前に、ページレイアウトを作成する必要があります。たとえば図3のスキーマは、この例で「files.all.tpl」ページと「files.tag.tpl」ページに使用しているスキーマです。Smartyファイルの編成と命名規則はこのスキーマを反映しています。

Smartyが実際に動作するかを確認するため、複数の連想配列から成るインデックス付き配列をPHPからSmartyに渡す処理を分析しましょう。特に、「inc.util.php」内の関数ファイルが、データベースに格納されているファイルのリスト作成を処理します。行$file_array=db_query($dsn,$sql)の$file_arrayが、SQLクエリから返されたインデックス付き配列です。各要素は行を表しますが、これはクエリフィールドに等しいキーを持つ連想配列です。コードをもう少し進むと、Smarty構造に割り当てられる行があります。これらの行の例を次に示します。
$smarty->assign('file_array', $file_array);
最後に、次の行があります。
$smarty->display('files.all.tpl');
これらの命令は、ファイル「files.all.tpl」内の規則に従ってHTMLページをレンダリングする制御をSmartyに送ります。このファイルには「inc.file_list.tpl」が埋め込まれ、そこに次の行があります。
<ol class="core">
{foreach item=file from=$file_array name=file_loop}
<li class="core_left">
{if isset($file.protection)}
...
<input class="core" type="checkbox" name="select-{$file.id}"
value="yes" disabled="disabled"/>
...
いくつかの構文構成体が記述されていることがすぐにわかるでしょう。たとえば{foreach ... }は、インデックス付き配列に対して繰り返し処理を行います。また、この例から、連想配列内の要素を参照する方法もわかります。{$file.protection}は$file['protection']に対応し、{$file.id}は$file['id']に対応します。
