(注:記事は執筆時の情報に基づいており,現在では異なる場合があります)

リスト4
リスト5
リスト6
図4●リスト6の実行結果。デバッグ・コンソールも出力した
リスト7
リスト8
図5●リスト8を実行したところ
 ヘッダー部分のtestheader.tplはリスト4[拡大表示],フッター部分のtestfoote.tplはリスト5[拡大表示]の通りです。こうすることで,Webページを複数作る場合に,共通化できるところを再利用できるわけです。HTMLコードの部品化と考えてもいいでしょうね。

 リスト3の(2)では,HTMLの<select>タグ内で,html_options関数を使っています。これは<select>タグの<option>リストを生成する関数です。また,(3)のhtml_select_date,(4)のhtml_select_timeは,それぞれ年月日と時刻をHTMLフォームのドロップダウン・メニューに表示する関数です。デフォルトでは現在の日時を表示します。(3)ではstart_yearとend_yearを設定しているので,2003年から2010年までを表示します。(4)は12時間表記の設定です。

 では,リスト3に対応する処理ロジックを見てみましょう(リスト6)。(2)のテンプレート変数$opvalと$opoutに設定しているのは,先ほどのhtml_options関数に対応する値です。気になるのは,(1)のdebuggingメソッドですね。実はこれは,Smartyのデバッグ用コンソールを表示するためのメソッドなのです。と言ってもよくわからないと思うので,ブラウザでhttp://127.0.0.1/sample/testsmarty2.phpにアクセスしてリスト6[拡大表示]を実行してみましょう(図4[拡大表示])。

 左側のHTMLフォームを見れば,処理ロジックとテンプレート・ファイルが見事に連携していることがわかるでしょう。そして右側に表示されているのが,問題のデバッグ用コンソールです。関連するテンプレート・ファイル名,処理ロジックが扱うテンプレート変数とその値などがすべて一覧できますね。このコンソールの情報を使うことで,開発時のデバッグ作業を効率化できるわけです。実運用時には,debuggingをfalseにして表示しないようにすればいいでしょう。

ポイント4
データベース処理だって扱える

 最後に,Smartyを使ったデータベース処理のサンプルを紹介しましょう。ステップ5で解説したPEARによるデータベース処理のコード(ステップ5のリスト4)を,Smartyを使って書き直してみます。なおコードを簡略化するため,行ごとに色を変えたり,レコードを前後させるボタンを実装したりはしていません。

 リスト7[拡大表示]が,Smartyに対応するように書き直したテンプレート・ファイルです。ステップ5ではPHPスクリプトの中に埋もれてしまったHTMLタグがすっきりとしたことがわかると思います。

 一方リスト8[拡大表示]が処理ロジック部分です。(1)のデータベース処理についてはステップ5を見てください。ポイントは,SQLが抽出する不特定多数のレコードを,どうやってテンプレート変数に引き渡すかということです。たとえ配列を使ってassign( )したとしても,抽出するレコードが膨大だと配列では対応しきれません。

 そこでリスト8で採用しているのが,テンプレート変数に値を追加するappped( )メソッドです(2)。これによりリスト7のテンプレート変数にレコードの値が次々と格納されることになります。実行結果を見れば,データベース処理が問題なく実行できたことがわかるでしょう(図5[拡大表示])。

☆            ☆            ☆

 Smartyのようなテンプレート技術は,便利ですがけっして万能ではありません。複雑なアプリケーションでは取り扱うファイル数が増えて,かえって混乱する場合もあるでしょう。また,プログラマからすると,PHPだけでなく,Smartyという別の技術を学ぶ必要も出てきます。どこまでテンプレートを使うかは,メンテナンス性や開発者のスキルなど,総合的な視点で判断してください。

(真島 馨=日経ソフトウエア)