以上の作業で、次のようなディレクトリやファイルが作成されます。
sample8
┣━ cache/ ←キャッシュ機能を有効にした場合に使用
┣━ config/ ←設定ファイルを保存
┣━ icon.jpg
┣━ icon_mini.jpg
┣━ smarty1.php
┣━ smarty2.php
┣━ smarty3.php
┣━ smarty4.php
┣━ smarty5.php
┣━ smarty6.php
┣━ templates/ ←テンプレートファイルを保存
┃┣━ template1.tpl
┃┣━ template2.tpl
┃┣━ template3.tpl
┃┣━ template4.tpl
┃┣━ template5.tpl
┃┣━ template6_etc.tpl
┃┣━ template6_mobile.tpl
┃┗━ template6_pc.tpl
┗━ templates_c/ ←コンパイル済みPHPコードを保存 |
■sample8のファイル・ディレクトリ構成
インストール後、Webブラウザで「http://HTTPDサーバ/sample8/smarty1.php」にアクセスし、動作を確認します。
画面1 smarty1.phpの動作確認
「smarty1.php」に対し、「templates/template1.tpl」をテンプレートとして利用します。ここではtemplatesディレクトリ下の「○○.tpl」として保存されたものをテンプレートとして使用します。
1 <?php
2 //Smartyライブラリ読み込み
3 define('SMARTY_DIR', '/usr/local/lib/smarty/');
4 require_once(SMARTY_DIR . 'Smarty.class.php');
5
6 //Smartyのインスタンスを作成
7 $smarty = new Smarty();
8
9 //各ディレクトリの指定
10 $smarty->template_dir = './templates/';
11 $smarty->compile_dir = './templates_c/';
12 $smarty->config_dir = './configs/';
13 $smarty->cache_dir = './cache/';
14
15 //キャッシュ機能の有効化
16 //$smarty->caching = true;
17
18 //テンプレートの変数に値を割り当てる
19 $smarty->assign("title", "Smartyサンプル1");
20 $smarty->assign("value1", "1つ目の値");
21 $smarty->assign("value2", "2つ目の値");
22
...省略...
31 //テンプレートを指定し表示
32 $smarty->display("template1.tpl");
33 ?>
|
リスト1-1 smarty1.php
テンプレートディレクトリの指定やキャッシュディレクトリの指定などSmartyの動作に必要なディレクトリの指定は、smarty1.phpの10〜13行目のように行います。
なお、Smartyのキャッシュ機能を利用する場合は、16行目のように「$smarty->caching = true」とする必要があります。しかし製作過程ではキャッシュデータが更新されず、スクリプトの修正が即座に反映されない恐れがあるため、本稿ではこれらをコメントアウトし、キャッシュ機能を無効にしています。
そのほか、Smartyの基本的な処理は以下のとおりです。
1)Smartyライブラリの読み込み
require_once('/..pathto../Smarty.class.php');
↓
2)Smartyインスタンスの作成
$smarty = new Smarty();
↓
3)テンプレートの変数に値を割り当てる
$smarty- >assign("変数名", "値");
↓
4)テンプレートを指定し表示
$smarty- >display("テンプレートファイル");
テンプレートの変数に値を割り当てる際には、連想配列「$ref」を使って一気に指定することができます。連想配列を使用する場合、テンプレートは必要な変数を$refから適宜取り出すようになっています。
23 //テンプレートに値を割り当てる(連想配列で一気に値を引き渡す場合)
24 //$ref = array(
25 // "title"=>"Smartyサンプル1",
26 // "value1"=>"1つ目の値",
27 // "value2"=>"2つ目の値"
28 // );
29 //$smarty->assign($ref);
|
リスト1-2 smarty1.php
以上の処理で、テンプレートファイル中の「{$変数名}」が「値」に置き換わって表示されます。
なお本稿のテンプレートでは、ロジックの値で置き換わる個所(プレースホルダーと呼びます)には「{$変数名|escape}」を用います。引き渡された値に対し、「&」「"」「'」「<」「>」といったHTMLで特殊な意味を持つ文字について、escapeを用いてエスケープ処理を実施しています。
また、テンプレート中でのコメントには「{* 〜 *}」を利用します。HTMLコメント「<!-- 〜 -->」も使用できますが、「{* 〜 *}」を使ったコメントはコンパイル後のコードに出力されません。
1 <HTML lang="ja">
2 <HEAD>
3 <META http-equiv="content-type" content="text/html; charset=UTF-8">
4 <TITLE>{$title|escape}</TITLE>
5 </HEAD>
6 <BODY TEXT="black" BGCOLOR="white">
7 {* テンプレート中のコメント *}
8
9 <!-- タイトル -->
10 <div align="center"><font size="5"><b>{$title|escape}</b></font></div>
11 <hr width="600" align="center">
12
13 <!-- テンプレートへの埋め込み -->
14 <div align="center">
15 取得した値1:{$value1|escape}<br>
16 取得した値2:{$value2|escape}
17 </div>
18
19 <!-- フッター -->
20 <hr width="600" align="center">
21 <table width="600" border="0" align="center">
22 <tr>
23 <td align="right"><font size="2">@IT LinuxSquare「今から始める MySQL入門」<br>
24 2007/09/17作成</font></td>
25 </tr>
26 </table>
27
28 </BODY>
29 </HTML>
|
リスト2 templates/template1.tpl
配列のようなデータを一覧表示させる場合には、foreachを使ったループ処理が重宝します。foreachでは、引き渡された配列の要素の数だけ、繰り返しを実行します。またforeachelseには、「from=[配列]」で指定された配列が空の場合の処理を指定することができます。
{foreach from=[配列] item=[アイテム] name=[このループブロックの名前]}
// 処理
{foreachelse}
// [配列]が空だった場合の処理
{/foreach}
foreachの基本構文
|
smarty2.phpでは、19行目のように4つの要素を持つ配列を作成し、template2.tplに引き渡しています。template2.tplでは引き渡された配列をforeachで展開し、「item=[アイテム]」で指定されたアイテム名(ここでは「value」)で配列の要素にアクセスしています。
18 //配列の作成
19 $data = array("a","b","c","d");
20
21 //テンプレートの変数に値を割り当てる
22 $smarty->assign("title", "Smartyサンプル2");
23 $smarty->assign("data", $data);
24
25 //テンプレートを指定し表示
26 $smarty->display("template2.tpl");
|
リスト3 smarty2.php
14 {* 配列の利用 *}
15 {foreach from=$data item=value name=loop01}
16 <li>値は「{$value|escape}」</li>
17 {foreachelse}
18 表示させるデータがありません。
19 {/foreach}
|
リスト4 templates/template2.tpl
画面2 smarty2.phpの動作画面