テンプレートエンジン(Smarty)_PHP
テンプレートエンジン(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 [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; charset=EUC-JP"> </head> <body> Name = {$name}<br> Message = {$mes}<br> </body> </html>
ぱっと見、単なるHTMLっぽいですよね。普通のHTMLと異なる部分だけ説明します。
- コメントの記述
- 「{* ... *}」の部分はコメントになります。最終的に出力されたHTMLには出力されない部分になります。
- 変数値の代入
- 「{$ ... }」で変数をそのまま代入しています。最終的に出力されたHTMLにこの変数内容が表示されます。変数値に対する内容の代入は、PHPプログラムの方で行います。
PHPファイルの記述
次に、作成・配置したテンプレート「test.tpl」を呼び出す側のPHPファイルを記述します。「test_smarty.php」とします。
<?php // Samrtyクラスを参照する require('Smarty.class.php'); // Smartyクラスの生成 $smarty = new Smarty; // 作業用ディレクトリの指定 $smarty->template_dir = './templates/'; $smarty->compile_dir = './templates_c/'; $smarty->config_dir = './configs/'; $smarty->cache_dir = './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 = './templates/'; $smarty->compile_dir = './templates_c/'; $smarty->config_dir = './configs/'; $smarty->cache_dir = './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のテストです。'」と入れていることになりますね。
簡単な変数への代入は「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; charset=EUC-JP"> </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> {/foreach} </table> </body> </html>
[test2.php]
<?php // Samrtyクラスを参照する require('Smarty.class.php'); // Smartyクラスの生成 $smarty = new Smarty; // 作業用ディレクトリの指定 $smarty->template_dir = './smarty/templates/'; $smarty->compile_dir = './smarty/templates_c/'; $smarty->config_dir = './smarty/configs/'; $smarty->cache_dir = './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 |
これを応用すると、掲示板を作ったりデータベースのテーブル項目を表示したり、といろんなことに使えそうですね。
Future's Laboratory 技術格納庫 2004-2013 Yutaka Yoshisaka.