SmartyのPOSTフィルターが適用されない

2008/01/20 | Smarty

SmartyはPHPで一番メジャーなテンプレートエンジンということもあり、各種フレームワークと組み合わせて使うことも多い。しかし時折、うまく動かないこともある。
今回遭遇した問題は「SmartyのPOSTフィルターが動作しない」ということ。

Smartyはその処理の前後で、フィルター処理をかけることができる。たとえば文字コードを変換するとか、特定の文字列を置換するとか・・・。便利な機能だ。
とあるフレームワークを使っていて、上記の問題が発生した。POSTフィルターは動作しないがPREフィルターは動作するのだ。なぜ???。

結論として、これはフレームワークを併用して使用していることが原因だった。では、その理由は何か?。

フレームワークでは、通常Smartyを、Smartyの正規の手順にそって呼び出す。つまりSmartyクラスからオブジェクトを生成して、そのオブジェクトを持ちまわって、変数の割り当て処理等をおこなうのだ。
正規の手順で変数割り当て処理までおこなうのだから、当然この時点で終了しているであろうはずのPREフィルター処理は完了しているはずだ。

しかし描画処理はというと、Smartyの機能で完結しているわけではない。たいていのフレームワークでは、変数等の割り当てられたHTMLをfetchし、それをフレームワークの機能を使って出力していることが多い。つまりSmartyの正規の手順を踏まずにHTMLを出力していることになる。であれば、Smartyで最後におこなわれる処理(POSTフィルター)は実行されないまま、出力がおこなわれると考えることができるわけだ。

本来ならフレームワーク側で、Smartyの処理を最後まで面倒を見ないといけないはずなのだが、フレームワークによっては省略していることも多いようだ。

本件、ソースコードをじっくりみたわけではないのだが、おそらく上記のような理由で間違いないだろう。かなりはまってしまったのでメモ。

ちょっとしたデバッグ

2007/05/22 | Smarty

Smartyにはデバッグコンソール機能がついていて、あらかじめ設定しておくだけで、どのような変数にどのような値が格納されているかポップアップでだしてくれる。これはこれでとても便利。
しかしわざわざ設定を書き換えたりする必要があるので面倒だ。URLのQueryString中に、一時的に「SMARTY_DEBUG」の文字列を加えるとコンソールが出るとのことだが、意外とそれも面倒。
で、今日たまたま思いついた。テンプレート内の変数に修飾子を以下のようにつけてみた。

{$variable|var_dump}

テンプレート内で思うような処理ができなくって困っていたりするわけだから、テンプレートファイルを編集するだけで、ささっ、と変数の中身を調べたいとかねてから思っていた。ちょっと思いつきでやってみただけだったけど、ちゃんとvar_dumpしてくれた。

すっきり。
ほんの少しだけ手間が減った。

演算にはmathがよさそう

2007/05/04 | Smarty

テンプレート内で、四則演算して変数に結果を割り当てるのは、カスタム関数{math}がよさそう。

{math equation=”val1 * val2″ val1=5 val2=3 assign=test}

こんな感じで変数$testに演算結果を割り当てられる。括弧とかも使えるらしい。
でもこれ、テンプレート内でevalして処理してるから、負荷がかかるらしい。あとループの中で演算したりするのはなおさらちょっと・・・(マニュアルにもそう書いてある)。

まぁ、それもこれも、相当アクセスがあるサイトの場合で、月間数万ページビュー程度なら、全然たいしたことないような気もする(とはいえ少し気が引ける)。

文字列を連結して変数に(その2)

2007/05/03 | Smarty

さっそく次のパターンが出てきた。数値の四則計算をしてその結果を変数に格納する。

変数と変数の計算
{assign var=sum value=`$price*$num`}

*の前後に空白が入るとだめなんだよね。あと変数が普通の数値になってもだめ。このあたりは一回どこかでまとめないといけない(毎回悩むから)。

文字列を連結して変数に(その1)

2007/05/02 | Smarty

普段Smartyを使うことが多いが、テンプレート内で文字列の演算をして、その結果を変数に格納したい、ということがよくある。
ある意味、テンプレート内にプログラミングのルーチンを入れるわけだからデザインとプログラムの分離という面から考えればよろしくないのだが、便利に使える機能だ。でも各種演算をして変数に格納する記述、いつも忘れてしまうので、ここにメモ。

文字列「title_」と変数$myTitleをくっつけて、smarty変数$hensuに格納。
{assign var=hensu value=”title_$myTitle”}

他のパターンは、またそういう記述が出てきたときにでも・・・。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net