【メモ】Smarty2 → 3のハマリどころ


Smarty3の最新β(β8)が出たのが3/5。
今後どうなっていくのか、正式版はいつ頃リリースなのかその辺気になるところですが、
使ってみている限りで特に不具合はない(このサイトはMobavleType+PHP5+Smarty3で構築されています)ので、
それほど大きな影響がない、あってもなんとかなるくらいの環境であれば移行してみても良いかも知れません。
(今から脆弱性が発見される可能性も無くはないですけど)


Smarty3になると何が変わるかはSmarty3に同梱の「SMARTY2_BC_NOTES」ファイルに記載されています。
日本語訳はこちらにあります。

Smarty2.0からSmarty3.0への変更点 | スイナシア

大きな変更は、PHP5以上で動作というところだと思いますが、他にもメソッドチェーンをサポートしていたり、色々と地味に便利になっているような気がします。



で、Smartyのインストールと言っても基本的にはコピーするだけなので簡単なのですが、
実際に移行してみるといくつかテンプレートのハマリ点があったのでメモしておきます。
参考にしていただければ。

「}」の前後で改行しているとエラーになる

例えばこんなコードはエラーになります。

{if
is_male ||
is_female
}
hogehoge
{/if}


これは先ほどの「変更点」の中のこれですね。

デリミタとホワイトスペース

ホワイトスペースに囲まれたデリミタは今後、Smartyのタグとして扱われません。したがって、{ foo }はタグとしてコンパイルされません。この場合、コンパイルするには{foo}とする必要があります。この変更により、{literal}が必要とならないので、Javascript/CSSが扱いやすくなります。なお、$smarty->auto_literal = false;でこの設定を無効化できます。

ホワイトスペースは半角スペースとタブと改行を含むとのことなので、こういう書き方は出来ません。
設定を無効化しても良かったんですが、JavaScriptが書きやすくなることを考えてテンプレートの方を変更しました。




「`」を使って変数を割り当ている個所でエラーが出る

例えばこんな感じ。

{if is_male}
{assign var="count" value=value=`$count+1`}
{/if}

これはループの中で使用して、条件付きでインクリメントしている処理です。
(えらくバッドノウハウな気がしますが、過去のアレってことで…)


はたまたこんな感じ。

{function
permalink="http://`$smarty.server.HTTP_HOST``$smarty.server.REQUEST_URI'"}

permalinkという引数を与えて関数を呼び出してる部分です。


これは、以下の基準に照らしてダメってことなんだろうと。

クォートされなかった文字列

Smarty2は、パラメータにクォートしていない文字列が現れたとき、大雑把で曖昧な面がありました。一方、Smarty3はより厳密です。といっても、特別な文字(A-Za-z0-9_以外)を含まない限り、今でもクォーテーションなしの文字列を使うことはできます。


前者はmathを使って回避できます。

{if is_male}
{math assign="count" equation="x+1" x=$count}
{/if}

後者はcatを使って回避。

{function
permalink="http://"|cat:$smarty.server.HTTP_HOST|cat:$smarty.server.REQUEST_URI}




自分用クラスでのコンストラクタ

Smartyクラスを継承してMySmartyクラスを作り、その中で設定を行うのは常套手段ですが、
Smartyクラスのコンストラクタを明示的に動かす必要があります。
つまり以下はエラーが出ます。

class MySmarty extends Smarty {
function __construct() {
$this->Smarty();
}
}


以下のようにすることで回避できます。

class MySmarty extends Smarty {
function __construct() {
parent::__construct();
}
}



その他にも内部処理などにおいて細かな変更点があり、細かな対応が必要なので誰にでもお勧めするようなものではありませんが、もしSmartyをヘヴィに使っている人がいるとしたら、一度試してみても良いのではと思います。個人的には色々と便利になっているなぁと思いますです。はい。


参考

Smarty :: View Forum – Smarty 3
Smarty3のオフィシャルフォーラム。

[PHP]Smarty3を使ってみる
Smarty3のレビュー。機能が記述例付きで一通り紹介されています。

第13回 次世代のSmarty – Smarty3の紹介 – Smarty講座
同じく、Smarty3のレビュー。




追記(2010/04/28 0:41)

「内部処理などにおける細かな変更点」についていくつか。

内部エンコードがUTF-8に統一されている影響で文字化けする可能性がある

今どき大体はUTF-8で書いていると思うんですが、稀にそう期待しない場合があります。
どうしてもISO-2022-JPでメールを出したいとか。
最近はメールも全てUTF-8でOKだと思いますが、そうじゃない時代もあったので。

escapeを使ってHTMLとして書き出している場所でなぜか文字化けした(一応UTF-8で出力したはずなんだけど)ので、
プログラム処理に変更を加えました。


Smarty変数のスコープ

あんまりテンプレートを越えてスコープを共有するとかしないと思いますが、Smarty変数のスコープがグローバルから
ローカルに変更になった影響で、書き直しになる可能性があります。

僕の範囲ではたまたま無かったので大丈夫ですがもしあったら面倒なことになっていそうです。