SmartyのPOSTフィルターが適用されない
SmartyはPHPで一番メジャーなテンプレートエンジンということもあり、各種フレームワークと組み合わせて使うことも多い。しかし時折、うまく動かないこともある。
今回遭遇した問題は「SmartyのPOSTフィルターが動作しない」ということ。
Smartyはその処理の前後で、フィルター処理をかけることができる。たとえば文字コードを変換するとか、特定の文字列を置換するとか・・・。便利な機能だ。
とあるフレームワークを使っていて、上記の問題が発生した。POSTフィルターは動作しないがPREフィルターは動作するのだ。なぜ???。
結論として、これはフレームワークを併用して使用していることが原因だった。では、その理由は何か?。
フレームワークでは、通常Smartyを、Smartyの正規の手順にそって呼び出す。つまりSmartyクラスからオブジェクトを生成して、そのオブジェクトを持ちまわって、変数の割り当て処理等をおこなうのだ。
正規の手順で変数割り当て処理までおこなうのだから、当然この時点で終了しているであろうはずのPREフィルター処理は完了しているはずだ。
しかし描画処理はというと、Smartyの機能で完結しているわけではない。たいていのフレームワークでは、変数等の割り当てられたHTMLをfetchし、それをフレームワークの機能を使って出力していることが多い。つまりSmartyの正規の手順を踏まずにHTMLを出力していることになる。であれば、Smartyで最後におこなわれる処理(POSTフィルター)は実行されないまま、出力がおこなわれると考えることができるわけだ。
本来ならフレームワーク側で、Smartyの処理を最後まで面倒を見ないといけないはずなのだが、フレームワークによっては省略していることも多いようだ。
本件、ソースコードをじっくりみたわけではないのだが、おそらく上記のような理由で間違いないだろう。かなりはまってしまったのでメモ。