"サンプル株式会社の商品一覧ページです。$template->display($page);まあ既に説明した内容である。displayメソッドに持たせる引数が標準で配列であるため、テンプレート側からそのままラベルのみでアクセスしていることに注意。あと、この例だとキャッシュを有効化しているので、いじってテストなどする際には、結果確認の前にキャッシュディレクトリの中身を廃棄しておこう(これをわざわざやらなくて良いためにデバッグモードがあるらしい。SmartyとTwigはどちらが良いのか以上、Twigについても見てきた。仕組みはそれほどSmartyと変わらないので、乗り換えは楽だろう。乗り換え後過去資産を活用しようとすると変換は面倒臭いので、そこはあまり期待しない方が良い。良く言われるSmarty3.xとTwigの速度面の差だが、確かに体感などTwigの方がキビキビ動いている印象がある(Smarty2.xには劣るけど)。速度比較については厳密度は分からないけれど、こんなデータもある。あとはマニュアルのオシャレさなんかを基準にどちらを使うか決めれば良いだろう。adminSmartyのforeachを使って商品一覧ページテンプレートなどを実現コメントをどうぞSmartyユーザでもない人間が思い出しながらSmartyとテンプレートの良さについて解説するシリーズ(前回Smarty3.x編・前々回Smarty2.x編)。前回までの例だと、いまいちテンプレートエンジンの必要性が伝わりにくい。そこで、今回はテンプレートエンジンが輝く例として、ありきたりではあるが商品の一覧ページを作る場合などについて解説していこう。Smartyのforeachで、配列の要素数だけ繰り返し出力オンラインショップを運営していて、商品の削除や追加があった場合、商品一覧ページから商品を消したり既存のリスト項目のhtmlをコピーして内容だけ変えて追記したりと、静的な仕組みの場合には都度の手間がかかってしまう。そこで、商品をデータベースに追加したら自動的に商品一覧ページに追加、表示してくれるような仕組みがあると有り難い。した仕組みを実現するには、データベースの知識などが必要である。WHERE〜”とかなんとかSQLで取得したとして)、次に手元に出来た配列の要素数だけリスト項目を作ろうという段階になるわけだ。データベースから帰ってくる結果の数については、もちろんテンプレートを用意する段階では知るよしもない。そこで、配列の要素数を読み取ってその回数だけループさせるための言語構造、foreachを使う。//{foreach}から{/foreach}までの部分を、$arrayの要素数だけ繰り返す。//配列のキー名はkey=で取り出す。//値はitem=で取り出す。//いずれも与えた文字列と同じ名前の変数({$key}、{$value}など)で取り出す。item="value"}<li>キー値{$key}の値は{$value}。</li>{/foreach}</ul>//{foreach}から{/foreach}までの部分を、$arrayの要素数だけ繰り返す。//配列のキー名はkey=で取り出す。//値はitem=で取り出す。//いずれも与えた文字列と同じ名前の変数({$key}、{$value}など)で取り出す。<li>キー値{$key}の値は{$value}。array(“山”,”川”,”谷”);という宣言の後に上のforeach部分が解釈されると、出力htmlは以下のようになる。<ul><li>キー値1の値は山。</li><li>キー値2の値は川。</li><li>キー値3の値は谷。<li>キー値1の値は山。<li>キー値2の値は川。<li>キー値3の値は谷。</ul>このように、配列の要素数だけのリスト項目を出力してくれる。Smartyではテンプレート自体に条件分岐を埋められるただ、上の例は実は要素数が0の場合に対応できていない。要素数が0だと、リスト項目をもたないただのulタグのみが出力されてしまい、htmlの文法エラーとなってしまう。そこで、配列の要素数が0の場合ulタグも出力しないといったような条件分岐もつけたくなる。Smartyのテンプレート側でその対応は可能で、{if}内でPHP関数empty()を用いて出力の調整が出来る。empty($array)}<p>項目がありません。item="value"}<li>項目名{$key}の値は{$value}。<p>項目がありません。<li>項目名{$key}の値は{$value}。{/if}このようにロジックを埋め込める。テンプレート側にロジックを埋め込むのはMVCの観点上あまりよろしいことではないのだが、こういった対応も可能ということで。実際に商品一覧ページをテンプレートにしてみるそれでは、実際に例として商品一覧ページを作ってみよう。今回例に使うのはSmarty3.xなので、そこのところご注意を。name=main}<article><h1>デフォルト文章</h1><p>mainのブロックに指定が無い場合のデフォルト文章です。empty($page.items)}<p>現在取り扱っている商品はありません</p>{else}<p>当社が取り扱う商品の一覧です。<p>mainのブロックに指定が無い場合のデフォルト文章です。<p>当社が取り扱う商品の一覧です。{/block}base.tplはどのページにも共通するベースのテンプレート。item.tplが商品情報と個別ページへと飛ぶリンクをのせる枠組みで、itemlist.tplというのは商品一覧ページitemlist.phpが呼ばれた時に読み込むテンプレート。このitemlist.tplがbase.tplの子テンプレートになっているわけだ。いうわけで、呼び出し側のPHP。Smartyのパス等はdefinesmarty.phpという別ファイルにまとめたという設定で。//本来$itemsにデータベースから取ってきた商品情報を入れる処理が入る。//ここでは以下の情報がかえってきたものとする。