DB と PHP を UTF-8 で動かしているので、Smarty テンプレートも UTF-8 で構築したいところ。
しかしクライアント様から「ページはSJISで表示して欲しい」との要望が。

DB と PHP の設定を変えずに、Smarty 側だけで文字コードを変更する方法があったのでメモ。


はじめに、全てのページから共通で呼び出されているPHP「common.inc.php」が存在するとしよう。

common.inc.php
----------------------------------------------------------------------
略...

function sjis_encoding($tpl_output, &$smarty){
  $tpl_output = mb_convert_encoding($tpl_output,'SJIS', 'UTF8');
  return $tpl_output;
}
----------------------------------------------------------------------
このような関数を準備しておく。
これはマルチバイト関数を使用して UTF-8 から SJIS に変換するというモノだけど、これを Smarty から呼び出すんだ。



hogehoge.php
----------------------------------------------------------------------
略...

$smarty->assign('hoge', $hoge);
$smarty->register_outputfilter('sjis_encoding');
$smarty->display('page.tpl');
----------------------------------------------------------------------

全変数の assign が終わり、display を呼び出す直前で register_outputfilter('sjis_encoding') を実行するのだ。

この register_outputfilter メソッドは Smarty で標準提供されているもので、テンプレート出力が表示される前に指定されたコールバック関数が実行されるというもの。
http://www.phppro.jp/phpmanual/smarty/advanced.features.outputfilters.html

Smarty は完成度高いね。