Smartyで解決!
あるサイトを構築するにあたって、その内容を多言語対応(日本語/英語)とPC/iPhoneの切り替えを行いたいと考えていた。
しかし、どうやったらスマートに構築出来るか分からず、いろいろと調べたり試したりして(その調査の一環がTomatoCMSを入れてみた経緯でもあるのですが)、ようやく「Smarty」という「テンプレートエンジン」による解決策にたどり着きました。

ある問題の解決方法を探るとき、その問題か解決方法の名前をわかっていないと、Google全盛の今の世の中でもちょっと調べるのが大変です。
考えてみると、作りたいサイトは簡単なHTMLであり、更新もそれほど無いし、自分で更新するサイトだし、且つ、今後そのサイトの機能は自分で拡張していきたい、という条件が揃っていたので、わざわざ自分ですべてを理解するのが難しいCMSを使いたくない、ということがわかってきたのでした。
「それでも、すべてをPHPで作るのはちょっと難しい。HTMLにif文とか変数とかあればいいのになぁ〜」と考えて、ウェブをあれこれ見ていたら「Smarty」というキーワードが目に止まった。その近くにある言葉は「テンプレートエンジン」。ちょっと調べてみたら、これだこれ!かなりいいぞ!とちょっと感動すら覚えた。
早速ダウンロードして試してみたらバッチリで、結局そのサイトは、Smartyを使って作り上げました。
そのSmartyについて概要をメモしておきます。
これはもうHTML++だ
HTMLでif文や変数を使いたいと考えたとき、Smartyならこう解決出来る、というサンプルをいくつか紹介してみます。
サンプル1: phpからのテンプレート読み込み例
まずは、ある条件でtrueなら index_true.tplに書いたHTML、falseならindex_false.tplに書いたHTMLを表示する、という例です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| <?php
// index.php
require_once './Smarty/Smarty.class.php';
$smarty = new Smarty();
template_dir = './templates/';
$smarty->compile_dir = './templates_c/';
if( true ){
$smarty->display('index_true.tpl');
}
else{
$smarty->display('index_false.tpl');
}
?> |
1
2
3
4
| <!-- templates/index_true.tpl -->
<html><head><title>TRUE</title></head>
<body>true, true, true</body>
</html> |
1
2
3
4
| <!-- templates/index_false.tpl -->
<html><head><title>FALSE</title></head>
<body>false, false, false</body>
</html> |
サンプル2: 変数をテンプレートに渡す
次は、php側で定義した変数をテンプレート(.tpl)側で呼び出して使用する方法です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| <?php
// index.php
require_once './Smarty/Smarty.class.php';
$smarty = new Smarty();
$smarty->template_dir = './templates/';
$smarty->compile_dir = './templates_c/';
// 定義.
$message = "Hello!! Smarty!!!";
// 左側がtpl内で使う変数名.
$smarty->assign('message', $message);
$smarty->display('index.tpl');
?> |
1
2
3
4
5
6
| <!-- templates/index.tpl -->
<html><head><title>TEST Smarty</title></head>
<body>
<p>I said "{$message}".</p>
</body>
</html> |
サンプル3: 変数をテンプレートに渡す
次は、php側で定義した変数をテンプレート(.tpl)側でphpを使って処理する方法です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| <?php
// index.php
require_once './Smarty/Smarty.class.php';
$smarty = new Smarty();
$smarty->template_dir = './templates/';
$smarty->compile_dir = './templates_c/';
// 定義.
$value1 = 1;
$value2 = 2;
// 左側がtpl内で使う変数名.
$smarty->assign('v1', $value1);
$smarty->assign('v2', $value2);
$smarty->display('index.tpl');
?> |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| <!-- templates/index.tpl -->
<html><head><title>TEST Smarty</title></head>
<body>
<!-- v1 -->
{if $v1 == 1}
<p>value1 is One.</p>
{else}
<p>value1 is not One.</p>
{/if}
<!-- v2 -->
<p>value2 is {$v2}</p>
</body>
</html> |
その他の使い方
その他にもいろいろな使い方はありますが、とりあえずここまでのサンプルだけで大概のことは解決するような気がします。
あと下記の項目だけはよく使いそうなのでメモしておきます。
- テンプレートに渡す変数が多くなったときには連想配列を使ったほうが良い。
- テンプレート内に JavaScriptとか書いて問題が発生したときには、{literal}{/literal}で括ると良いです。
チートシートでざっくり見渡す
いろいろな言語やライブラリの特徴的なコード、リファレンス、クラス一覧などをまとめたチートシートというのが有志によって配布されていたりします。
Smartyについても作成されている方がおられました。
Smartyをよく使うならこれを印刷してて元に置いておくと良さそうですね。
[AD]
↓Smartyの本はこれがいいのかな?ウェブだけでは得られない周辺知識も得られるかも。
↓このSmarty本は5年前に出ている!知らないって怖いですね。そして、そんなに枯れた技術だと安心して使えるな〜。
↓SmartyもPHPも関係ないけど、去年末に買ったNikonクリーニングキット。デジタル一眼レフのイメージセンサーやレンズを綺麗にする道具が一通り揃っています。付属のCD-ROMで映像が見れるのが良いです!あとは薬局で無水エタノールを買うだけ!