これまでずっとSmarty2を使っていたんですが、いいかげんそろそろSmarty3に乗り換えてみます。
執筆時点での最新版は3.1.5でした。
ダウンロード・解凍後、libsフォルダを適当なところに突っ込みます。
中にはSmarty.phpおよびSmartyBC.phpがありますが、どうも中身を見るかぎりSmartyBC.phpは後方互換のために用意されたクラスみたいです。
Smarty2ではメソッド名などがスネークケースでしたが、Smarty3ではキャメルケースに改められています。
その橋渡しをするためのラッパクラスのようで、中身は大体こんなかんじです。
public function assign_by_ref($tpl_var, &$value){
$this->assignByRef($tpl_var, $value);
}
なのでSmarty2から3にバージョンアップする際はとりあえずSmartyBCにしておいて、徐々にメソッドなどをSmarty3仕様に差し替えていくといいんじゃないかな。
ということでひとまずSmartyBCを使ってみます。
しかしびっくりするほど検索にひっかからんね、SmartyBC。
テンプレート側には大きな変更が加えられています。
変数のネストや複雑な構文などが色々できるようになっているみたいですが、とりあえずSmarty2のテンプレートを移植するにあたって気をつけるところはスペースです。
Smarty2では{ $hoge }とか書いても有効だったんですが、3では{$hoge }と前を詰めないといけなくなっているようです。
後ろはいくら開いていても大丈夫みたいです。
どこか設定があるのかもしれませんがよくわかりませんでした。
とりあえずSmarty2形式でサンプルを作成。
index.php
試してないんですがSmarty2の機能しか使ってないのでSmarty2でも動くと思います。
普通にSmarty2の使い方でほぼ問題無く使えてしまった。
執筆時点での最新版は3.1.5でした。
ダウンロード・解凍後、libsフォルダを適当なところに突っ込みます。
中にはSmarty.phpおよびSmartyBC.phpがありますが、どうも中身を見るかぎりSmartyBC.phpは後方互換のために用意されたクラスみたいです。
Smarty2ではメソッド名などがスネークケースでしたが、Smarty3ではキャメルケースに改められています。
その橋渡しをするためのラッパクラスのようで、中身は大体こんなかんじです。
public function assign_by_ref($tpl_var, &$value){
$this->assignByRef($tpl_var, $value);
}
なのでSmarty2から3にバージョンアップする際はとりあえずSmartyBCにしておいて、徐々にメソッドなどをSmarty3仕様に差し替えていくといいんじゃないかな。
ということでひとまずSmartyBCを使ってみます。
しかしびっくりするほど検索にひっかからんね、SmartyBC。
テンプレート側には大きな変更が加えられています。
変数のネストや複雑な構文などが色々できるようになっているみたいですが、とりあえずSmarty2のテンプレートを移植するにあたって気をつけるところはスペースです。
Smarty2では{ $hoge }とか書いても有効だったんですが、3では{$hoge }と前を詰めないといけなくなっているようです。
後ろはいくら開いていても大丈夫みたいです。
どこか設定があるのかもしれませんがよくわかりませんでした。
とりあえずSmarty2形式でサンプルを作成。
index.php
<?php
//Smartyパス
$smartyDir = dirname(__FILE__) . '/../../fw/smarty/';
$smartyFile = $smartyDir . 'SmartyBC.class.php';
$smartyTemplateDir = $smartyDir . 'templates/';
$smartyCompileDir = $smartyDir . 'templates_c/';
//Smarty
require_once($smartyFile);
$smarty = new SmartyBC();
$smarty->template_dir = $smartyTemplateDir;
$smarty->compile_dir = $smartyCompileDir;
//フィルタ
$smarty->register_prefilter('smartyPreFilter');
$smarty->register_postfilter('smartyPostFilter');
$smarty->register_outputfilter('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->register_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');
index.html
{include file='header.html'}
<body>
$hogeを表示<br />
{foreach from=$hoge key=key item=item name=loop}
KEY:{$key} - ITEM:{$item}<br />
{if $smarty.foreach.loop.last}最後のループ<br />{/if}
{/foreach}
<br />
修正子を実行<br />
{'XSS!!<script>alert("xss");</script>XSS!!'|testModifier:"aaa":"bbb"}
XSSの部分は$name、"aaa"が$param1、"bbb"が$param2というふうに割り当てられる
</body>
</html>
header.html
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv=" Content-Type" content="text/html; charset=UTF-8">
<title>{$title|escape|default:''}</title>
<meta name="description" content="{$meta.description|escape|default:''}">
<meta name="keywords" content="{$meta.keywords|escape|default:''}">
</head>
register_prefilterとか普段は使わないんですが、今回はサンプルなのでとりあえず置いてます。試してないんですがSmarty2の機能しか使ってないのでSmarty2でも動くと思います。
普通にSmarty2の使い方でほぼ問題無く使えてしまった。
PR