はじめに
私がSmarty3を使っていたのが数年前で
古いからもう使われてる事ないだろな・・・と思いましたが
qiitaに記事を書いてる人を見つけて
誰かの役に立てばと自分で便利だったfilterの使い方をご紹介
Smarty3ドキュメントのフィルター
https://www.smarty.net/docs/ja/
15. 拡張機能 にある
- プリフィルタ(prefilter)
- ポストフィルタ(postfilter)
- アウトプットフィルタ(outputfilter)
です。
改めて見返して見たら分かりやすいので説明を引用しておきます。
プリフィルタ(prefilter)
プリフィルタは、テンプレートがコンパイルされる前に 実行されるPHPユーザ定義関数です。テンプレートに含まれた不必要なコメントを除いたり、 第三者にテンプレートの更新を任せている時に テンプレート内にど のようなものが含まれているかを監視する等といった前処理を行います。
テンプレートには開発のドメイン等環境ごとに異なる事は記述せずに動的に切り替えるプログラムを入れていましたが、大人数で修正が入るとhttp://dev.service.jp/ みたいに書かれてしまう事があり
プリフイルタで消すということをやりました。
またURLを記述する際に相対パスから絶対パスに変更するなどもプリフィルタで行いました。
例
// 参考用です
function smarty_prefilter_cut_dev($source, &$smarty) {
$patterns []= 'http://dev.service.jp/';
$replacements []= '';
$newSource = str_replace($patterns, $replacements, $source);
return $newSource;
}
ポストフィルタ(postfilter)
テンプレートが display() 又は fetch() を経由して呼び出された時、出力は1つ又は複数のアウトプットフィルタを通して送られます。 これは ポストフィルタ とは異なります。 コンパイルされたテンプレートがポストフィルタによって、 テンプレートがディスクに保存される前に処理されるのに対し、 アウトプットフィルタはテンプレートが実行される時にその出力を処理します。
テンプレートがコンパイルされて保存する前に実行されるので
そのテンプレートの出力全体に影響があるものはここで処理できます。
当時、あまり使ってませんでした・・・
例
function smarty_postfilter_dev($compiled, &$smarty) {
return $compiled.'_postfilter-dev_';
}
アウトプットフィルタ(outputfilter)
テンプレートが display() 又は fetch() を経由して呼び出された時、出力は1つ又は複数のアウトプットフィルタを通して送られます。 これは ポストフィルタ とは異なります。 コンパイルされたテンプレートがポストフィルタによって、 テンプレートがディスクに保存される前に処理されるのに対し、 アウトプットフィルタはテンプレートが実行される時にその出力を処理します。
アクセスしてきた側(例えばユーザ)の環境により出力する文字をSJIS, UTF8などに変更する
ポストフィルタで変換すると、ファイルがエンコードされたファイルが保存されるのでアウトプットフィルタでやりました。
例
function smarty_outputfilter_enc_sjis($output, &$smarty) {
$result = mb_convert_encoding($output, 'SJIS-win', 'UTF-8');
}
まとめ
Smarty3のフィルタは結構簡単に追加したり外したりできたので便利でした。
まだ使ったことなくて全てPHPでやってる人には是非検討して見てください。