テンプレートエンジン(Smarty)

テンプレートエンジン(Smarty)
Smarty とは PHP で使用できるテンプレートエンジンです。デザイン部分(表の HTML ページ)と
ロジック部(PHP で記述)を分離して管理することができるようになります。Java で言う、JSP と
Servlet みたいな感じですね。PHP 側で HTML に文字列を assign し、テンプレートファイルでレイ
アウトを指定することで、ページレイアウトの管理を可読性があるものにします。
少し大きめのシステムを作る場合は、この見通しの良さは(効率アップのためにも)重要になり
ますので覚えておいて損はないかと思います。ちなみにですが、Smarty 自身も PHP で作られてい
ます。いわば PHP を拡張するライブラリのような位置づけになります。
PHP 単体では Smarty は利用できませんので、以下の手順でインストールしてあげる必要がありま
す。
Smarty のインストール
2005 年 11 月現在で「Smarty Ver 2.6.9」を入れる例を示しています。Windows にインストールして
います。
・「http://smarty.php.net」より「Smarty-2.6.9.tar.gz」をダウンロード。
・「Smarty-2.6.9.tar.gz」を解凍し、解凍後の "libs" 内のファイルを PHP インストールディレ
クトリ下の "Smarty" にコピーする。
・php.ini ファイル(\windows ディレクトリ直下)の "include_path" に Smarty のフルパスを追
加
include_path = ".;C:¥Program Files¥php-4.3.10-Win32¥Smarty"
・Web サーバ(Apache など)を再起動
これで Smarty を利用できる環境が整います。なお、XOOPS ではすでに Smarty が組み込まれてい
ますので、Smarty 単体のインストールは不要です。
Smarty を使用する
■ディレクトリ構成
テンプレートを置くディレクトリ、コンパイル後のテンプレートを置くディレクトリ、設定ファ
イルを置くディレクトリ、キャッシュファイルを置くディレクトリを自前で用意する必要があり
ます。「どこに何のファイルを置いているか」というのは PHP のプログラム内で指示することに
なります。
「test_smarty.php」というファイルからテンプレート「test.tpl」
(テンプレートについての説明は後
述します)を呼び出す例を示します。
以下のような構成になります。
test_smarty.php
1
[templates]
test.tpl
xxxx.tpl
[templates_c]
[configs]
[cache]
「test_smarty.php」と同じディレクトリに、[templates][templates_c][configs][cache] という4つのディ
レクトリを作成しています。[templates] ディレクトリ内に、テンプレートファイルを配置します。
テンプレートファイルの拡張子は「tpl」となります。
[templates_c] は、コンパイル後のファイルが置かれる作業ディレクトリです。[configs] は設定ファ
イルを置くディレクトリです。[cache] はキャッシュファイルを置くディレクトリです。これら
のディレクトリには何も置かなくて OK です。
なお、ディレクトリ名は上記でなくても問題ありません。
■テンプレートファイルの記述
では、上記ディレクトリ上の「templates/test.tpl」の中身を見てみましょう。最終的な HTML ファ
イルを吐き出しは PHP と Smarty によって行われますが、
「どのようなレイアウトで出力するのか」
というのを指定してあげるのがテンプレートの役割となります。
テーブル(表)を表示したい場合、ひな形だけテンプレートに記述して、行の繰り返しと記載内
容は PHP で書き込む、ある条件のときは一部の情報を追加で出す、などの foreach/if 制御もテンプ
レートに記述することができます。
以下はもっとも簡単なテンプレート例です。
{* [test.tpl]
*}
{* Smarty でのテンプレートサンプル *}
<html>
<head>
<meta http-equiv=Content-Type content="text/html;
</head>
charset=EUC-JP">
<body>
Name = {$name}<br>
Message = {$mes}<br>
</body>
</html>
ぱっと見、単なる HTMLっぽいですよね。普通の HTML と異なる部分だけ説明します。
コメントの記述
「{* ... *}」の部分はコメントになります。最終的に出力された HTML には出力されない部分
になります。
変数値の代入
「{$ ... }」で変数をそのまま代入しています。最終的に出力された HTML にこの変数内容が表
示されます。変数値に対する内容の代入は、PHP プログラムの方で行います。
2
■ PHP ファイルの記述
次に、作成・配置したテンプレート「test.tpl」を呼び出す側の PHP ファイルを記述します。
「test_smarty.php」とします。
<?php
// Samrty クラスを参照する
require('Smarty.class.php');
// Smarty クラスの生成
$smarty = new Smarty;
//
$smarty->template_dir =
$smarty->compile_dir =
$smarty->config_dir
=
$smarty->cache_dir
=
作
業
'./templates/';
'./templates_c/';
'./configs/';
'./cache/';
用
ディ
レ
//
変
$smarty->assign('name',' 山田太郎 ');
$smarty->assign('mes',' これは PHP の Smarty のテストです。');
?>
//
使 用 す
$smarty->display('test.tpl');
る
テ
ン
プ
レー
ク
ト
数
ト
ファ
リ
の
の
イ
ル
指
代
名
の
定
入
指
定
「require('Smarty.class.php');」にて、Smarty のクラスを使用することを明示しています。
「$smarty = new Smarty;」にて、Smarty のクラスを生成し、以降の Smarty のテンプレートに対する
操作は「$smarty」オブジェクトにより行います。
作業ディレクトリとして、前述したディレクトリ構成を Smarty 側に教えてあげます。この部分は
Smarty クラスを作成後に常に指定する必要があるため、別 PHP ファイルに書いて呼び出すほうが
スマートかもしれませんね。
//
作
$smarty->template_dir =
$smarty->compile_dir =
$smarty->config_dir
=
$smarty->cache_dir
=
業
用
ディ
'./templates/';
'./templates_c/';
'./configs/';
'./cache/';
レ
ク
ト
リ
の
指
定
「$smarty->template_dir」に、テンプレートファイルである「*.tpl」が置いてあるディレクトリを指
定します。「$smarty->compile_dir」に、コンパイル後のファイルが置かれるディレクトリを指定し
ま す。「$smarty->config_dir」に、設 定 フ ァ イ ル を 置 く デ ィ レ ク ト リ を 指 定 し ま す。
「$smarty->cache_dir」に、キャッシュファイルが置かれるディレクトリを指定します。
各ディレクトリ名の最後には「/」をつけるようにしてください。
「$smarty->assign」にて、1つの変数に文字列を代入します。第一引数に、テンプレート内の「{$...}」
で指定した変数名を記述します(頭の「$」は不要です)。第二引数にその変数に入れる文字列を
指定します。
$smarty->assign('name',' 山田太郎 ');
$smarty->assign('mes',' これは PHP の Smarty のテストです。');
上記の場合、
「name = ' 山田太郎 '」
「mes = ' これは PHP の Smarty のテストです。'」と入れている
3
ことになりますね。
簡単な変数への代入は「assign」のみで OK ですが、テーブルを出す場合の繰り返しや配列要素を
入れる場合は「append」を使います。append については後述します。
一番最後の「$smarty->display('test.tpl');」にて、テンプレートファイル「test.tpl」を使って HTML を
出力します。この段階で HTML ファイルが書き出されクライアントのブラウザにページが表示
されますので、1 ページ表示の際に一番最後に1回呼び出すようにします。
以上の「test.tpl」「test_smarty.php」を記載・配置してブラウザより test_smarty.php を呼び出すと、
Name = 山田太郎
Message = これは PHP の Smarty のテストです。
のように表示されると成功です。
文字化けに関する注意事項
日本語を使用する場合、PHP が最終的に HTML に出力する文字コード(php.ini の [mbstring] で明
記)にあわせるようにしたほうが無難です。また、PHP のソースコードおよびテンプレートファ
イル自身でも php.ini で指定した文字コードで統一したほうが迷わなくていいと思います(うっか
り忘れていて、PHP 本体を EUC-JP で、ソースコードを SHIFT_JIS で保存していて深みにはまった
経験ありです)。
テンプレートにテーブルを使用する
M 列 x N 行のテーブルを表示したい場合、これもテンプレートを使うことですっきりとデザイン
部とプログラム部を分けることができます。
テンプレートファイルと PHP ファイルの例を示します。
[test2.tpl]
{* [test2.tpl]
*}
{* Smarty でのテンプレートサンプル *}
{* テーブルを表示する
*}
<html>
<head>
<meta http-equiv=Content-Type content="text/html;
</head>
<body>
<table border=1>
<tr>
<th> 番号 </th>
<th> 名称 </th>
<th> 個数 </th>
</tr>
{foreach item=result from=$data_list}
<tr>
<td>{$result[0]}</td>
<td>{$result[1]}</td>
<td>{$result[2]}</td>
</tr>
4
charset=EUC-JP">
{/foreach}
</table>
</body>
</html>
[test2.php]
<?php
// Samrty クラスを参照する
require('Smarty.class.php');
// Smarty クラスの生成
$smarty = new Smarty;
//
$smarty->template_dir
$smarty->compile_dir
$smarty->config_dir
$smarty->cache_dir
=
=
=
=
作
業
用
ディ
'./smarty/templates/';
'./smarty/templates_c/';
'./smarty/configs/';
'./smarty/cache/';
レ
ク
ト
リ
の
指
定
// テーブルの要素
$strA = array('Apple', 'Orange', 'Grape');
$strB = array('12', '8', '19');
// テンプレート上のテーブルに1行ずつ情報を渡す
for($i = 0; $i < 3; $i++) {
$smarty->append('data_list', array(strval($i), $strA[$i], $strB[$i]));
}
?>
$smarty->display('test2.tpl');
テンプレートの「 {foreach item=result from=$data_list}」にて変数「$data_list」より1行分の情報(一
次元配列になります)を取り出して、result に一時格納しています。foreach は、格納された行数分
の情報がなくなるまで繰り返されることになります。
<td>{$result[0]}</td>
<td>{$result[1]}</td>
<td>{$result[2]}</td>
にて、取り出した result 配列の要素を順に出力しています。
PHP ファイル内では、
for($i = 0; $i < 3; $i++) {
$smarty->append('data_list', array(strval($i), $strA[$i], $strB[$i]));
}
にて、テンプレート上の「data_list」変数に対して、3つの要素を持つ配列を「$smarty->append」に
て追加しています。3 要素を 3 行分で二次元配列のテーブルでの情報を渡していることになりま
す。
これを実行すると、
番号
名称
個数
0
Apple
12
1
Orange
8
2
Grape
19
5
のようなテーブルが表示されます。
これを応用すると、掲示板を作ったりデータベースのテーブル項目を表示したり、といろんなこ
とに使えそうですね。
6