PHP 5.1.xでSmarty(テンプレートエンジン)を使う必要が出てきたので、使い方を調べてみた。Smartyの最新版であるバージョン3はPHP 5.2以上が必要なので、今回は必然的にSmarty 2になった。バージョン2系の最新版であるSmarty 2.6.26を使う。
とりあえず設置
Smarty公式サイトからSmarty 2.6.26をダウンロードしてきて解凍、中にあるlibs
フォルダーーをSmarty2というフォルダーーにしておく。それと同じ階層にindex.php
を用意して、以下のコードを記述して、Smartyの読み込みが正常に行われていることを確認する。
<?php
require_once("./Smarty2/Smarty.class.php");
$smarty = new Smarty();
var_dump($smarty);
?>
Hello world
同梱されているdemo
フォルダーーが参考になる。けど、構造がちょっと複雑なので、単純化して最低限の構造でHello worldしてみる。まず、先ほど確認したindex.php
をベースに、以下のように内容を書き換える。
<?php
require_once("./Smarty2/Smarty.class.php");
$smarty = new Smarty();
$smarty->assign("name", "Smarty2");
$smarty->display("index.tpl");
?>
index.php
と同じ階層に、templates
フォルダーとtemplates_c
フォルダーを作成する。両方必須。
templates
フォルダーの方にindex.tpl
を作成し、内容を以下のように記述する。
<h1>Hello {$name}!</h1>
templates_c
フォルダーの方はコンパイル用のフォルダーなので、中身は空っぽのままでおk これでindex.php
にアクセスすると、h1のHello Smarty2!が表示される。
tplからtplを読み込む
RailsやSinatraで言うパーシャルに相当するのかな? demo
フォルダーのtplまんまの構造だけど、index.tpl
からヘッダーとフッターを分離して、header.tpl
、footer.tpl
を作成し、index.tpl
からはinclude
を使って以下のように読み込む。
{include file="header.tpl"}
<h1>Hello {$name}!</h1>
{include file="footer.tpl"}
基本的に波括弧で囲んだところはPHPコードとして実行されるっぽい。
CSSやJavaScriptの波括弧をtplに含むには
最初にハマったのはこれ。例えば、テンプレート化したHTMLを含むindex.tpl
に、以下のようなCSSが書かれていたとする。
<style type="text/css">
<!--
p * {
margin: 0;
}
- >
</style>
これをこのまま実行すると、前述のとおり本来波括弧はテンプレート内ではPHPコードを埋め込むために使われるので、エラーとなる。
Fatal error: Smarty error: [in index.tpl line 16]: syntax error: unrecognized tag: margin: 0;
これを回避するための専用のタグが用意されていて、それが{literal}{/literal}
とのこと。このリテラルタグで囲ったゾーンは、PHPコード用の波括弧とは認識しなくなる。
<style type="text/css">
<!--
{literal}
p * {
margin: 0;
}
{/literal}
- >
</style>
Smarty 3以降なら通常これは考えなくて良いみたいで、良しなに解釈してくれるっぽい。でも今回使っているのはSmarty 2なので、上記のように専用の対策が必要。ちょっと面倒。Smartyの基本操作はこんな感じで、あとはどんな便利機能があるのかわからないけど、自分が普段個人でWebアプリを作っているときに使っているSinatra+Slimの組み合わせのSlimテンプレートみたいな感じっぽいかな。