アインシュタインの電話番号
2011.05.21
PHPでSmartyを使う

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.tplfooter.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テンプレートみたいな感じっぽいかな。


早わかりSmarty3~PHP次世代テンプレートエンジンの予習とSmarty入門 - 遥か彼方の彼方から