前回Smarty3のSmartyBCクラスを利用して、Smarty2形式の書き方をしました。
今回は同じものをSmarty3形式で書いてみます。
はい、そのとおりです。
テンプレート側については何一つ変更の必要はありません。
これは、Smarty3のテンプレートは、ロジック側と違って後方互換性を残しているからです。
実際は{foreach}の推奨される使い方も変わっているのですが、Smarty2形式でも全く問題無く動作します。
ですが、せっかくなのでSmarty3形式にしてみましょう。
index.html
配列の要素に.でアクセスできるのはこれまでどおりですが、それとは別に@を繋ぐことで特殊な用途に使用できます。
@keyで配列のキーに、@firstで初回のループだけtrueにといった、これまで$smarty.foreachという遠回りな使い道だった要素も直接使用できるようになります。
.keyではきちんと$hoge['key']にアクセスしてくれるので、うっかりキーが被ったなどという事故もありません。
Smarty2と同じ使い方をするかぎり、使い勝手が微妙によくなったマイナーバージョンアップと考えても問題なさそうです。
今回は同じものをSmarty3形式で書いてみます。
<?php
//Smartyパス
$smartyDir = dirname(__FILE__) . '/../../fw/smarty/';
$smartyFile = $smartyDir . 'Smarty.class.php';
$smartyTemplateDir = $smartyDir . 'templates/';
$smartyCompileDir = $smartyDir . 'templates_c/';
//Smarty
require_once($smartyFile);
$smarty = new Smarty();
$smarty->template_dir = $smartyTemplateDir;
$smarty->compile_dir = $smartyCompileDir;
//フィルタ
$smarty->registerFilter('pre', 'smartyPreFilter');
$smarty->registerFilter('post', 'smartyPostFilter');
$smarty->registerFilter('output', 'smartyOutputFilter');
function smartyPreFilter($tpl_source, $smarty){
//テンプレートをコンパイルする前に行う処理
//{}等のテンプレートがそのまま渡される
return $tpl_source;
}
function smartyPostFilter($tpl_source, $smarty){
//テンプレートをコンパイルした後に行う処理
//{}等のSmarty関数、修正子等はパースされPHPに置換されている
return $tpl_source;
}
function smartyOutputFilter($tpl_source, $smarty){
//HTMLの出力直前に行う処理
//Smarty関数、PHP共に処理された後で、ただのHTMLの状態
return $tpl_source;
}
//修正子登録
$smarty->registerPlugin('modifier', 'testModifier', 'smartyTestModifier');
function smartyTestModifier($name, $param1, $param2, $param3 = NULL){
//修正子testModifierが使用されたときに呼び出される
return $param1 . strip_tags($name) . $param2;
}
//変数セット
$smarty->assign('title' , 'タイトル');
$smarty->assign('meta' , array('description'=>'description'));
$smarty->assign('hoge' , array('foo', 'bar', 'baz'));
//表示
$smarty->display('index.html');
メソッド名が変わっただけじゃないか。はい、そのとおりです。
テンプレート側については何一つ変更の必要はありません。
これは、Smarty3のテンプレートは、ロジック側と違って後方互換性を残しているからです。
実際は{foreach}の推奨される使い方も変わっているのですが、Smarty2形式でも全く問題無く動作します。
ですが、せっかくなのでSmarty3形式にしてみましょう。
index.html
{include file='header.html'}
<body>
$hogeを表示<br />
{foreach $hoge as $item}
KEY:{$item@key} - ITEM:{$item}<br />
{if $item@last}最後のループ<br />{/if}
{/foreach}
<br />
{'XSS!!<script>alert("xss");</script>XSS!!'|testModifier:"aaa":"bbb"}
</body>
</html>
foreachはPHPと同くasを使うようになっています。配列の要素に.でアクセスできるのはこれまでどおりですが、それとは別に@を繋ぐことで特殊な用途に使用できます。
@keyで配列のキーに、@firstで初回のループだけtrueにといった、これまで$smarty.foreachという遠回りな使い道だった要素も直接使用できるようになります。
.keyではきちんと$hoge['key']にアクセスしてくれるので、うっかりキーが被ったなどという事故もありません。
Smarty2と同じ使い方をするかぎり、使い勝手が微妙によくなったマイナーバージョンアップと考えても問題なさそうです。
PR