ZendのSmartyで文字コード変換

( diary )

分け合ってUTF-8のデータをンプレート出力時にはデータをSJISに設定する必要がでたのでそのメモ。

■動作 HTTP(INPUT):SJIS 内部(データ、ファイルもろもろ):UTF-8 HTTP(OUTPUT):SJIS

// My_View_Smarty 内の関数
    public function __construct($tmplPath = null, $extraParams = array())
    {
        // オブジェクト生成
        $this->_smarty = new Smarty();

        // テンプレートパス設定
        if (null !== $tmplPath) {
            $this->setScriptPath($tmplPath);
        }

        // 設定情報をメンバ変数へ
        foreach ($extraParams as $key => $value) {

            // define function
            if (is_array($value)) {
                foreach ($value as $key2 => $value2) {
                    // 出力時の関数指定
                    if ($key === "outputfilter") {
                        $this->_smarty->autoload_filters['output'][] = $value2;
                    }
                    else {
                        $this->_smarty->{$key}[] = $value2;
                    }
                }
            }
            else {
                $this->_smarty->$key = $value;
            }
        }

その次は関数の設定


function smarty_outputfilter_convertSjis($output, &$smarty)
{
    return mb_convert_encoding($output, 'SJIS-win', 'UTF-8');
}

あとはブートストラップ使ってPHPの設定情報を変更する。

phpSettings.mbstring.internal_encoding = "UTF-8"
phpSettings.http_input                 = "UTF-8"
phpSettings.http_output                = "pass"

; smarty のアウトプットフィルターに関数を登録する
; 番号指定で複数可能
resources.viewsmarty.outputfilter.0    = "convertSjis"

こんな感じで変換してみた。

もとにもどすときはapp.iniの設定抜くだけで全部UTF-8になるっすね。

これでよし。