nihimotoの日記

https://mapsengine.google.com/map/edit?mid=zhpqXW1XM-zc.kmD-c8p1GAWI

SmartyのテンプレートをShift_JISで記述するには

Smartyのテンプレートは実はEUC-JPが基本になっています。
そもそもデザインとプログラムを分離するという目的がありながら、デザイナーが普段使わないEUC-JPでのコーディングを求めるとはいかがなものでしょうか。

と、思いましたが、仕方ないのでShift_JISで動かす方法を探してみました。


参考http://www.bmedianode.com/hiki/Smarty/?%A5%C6%A5%F3%A5%D7%A5%EC%A1%BC%A5%C8%A4%F2Shift_JIS%A4%C7%B5%AD%BD%D2

Smarty は、特にマルチバイト処理を考慮して開発されているわけではないので、テンプレートファイルをEUC-JP以外の文字コードエンコーディングで記述してしまうと上手く動作してくれません。携帯電話向けのサイトなどで、ページをどうしてもShift_JISで出力したい場合は「プリフィルタ」および「ポストフィルタ」という機能を使用してエンコーディング変換を行います

プリフィルタ

プリフィルタ(pre-filter)は、テンプレートがコンパイルされる前に呼び出されるユーザ定義関数です。関数をプリフィルタとして登録するには、関数名を引数としてSmartyインスタンスのregister_prefilter()メソッドを呼び出します。

$smarty->register_prefilter("convert_encoding_to_eucjp");

上記の場合は、テンプレートのコンパイルに先立ってconvert_encoding()関数が呼び出されます。関数には第一引数としてテンプレートのソースコードが、第二引数として Smartyインスタンスのリファレンスが渡されるので、ソースコードに対して必要な処理を行った結果を戻り値として返すようにします。

function convert_encoding_to_eucjp($template_source, &$smart) {
if (function_exists("mb_convert_encoding")) {
// mbstringモジュールが利用可能でテンプレートがEUC-JPでない場合は
// 文字コードを変換する
$enc = mb_detect_encoding($template_source, "auto");
if ($enc != "EUC-JP") {
return mb_convert_encoding($template_source, "EUC-JP", $enc);
}
}
return $template_source;
}

ポストフィルタ

ポストフィルタ(post-filter)は、テンプレートがコンパイルされた後に呼び出されるユーザ定義関数です。関数をポストフィルタとして登録するには、関数名を引数としてSmartyインスタンスのregister_postfilter()メソッドを呼び出します。

$smarty->register_postfilter("convert_encoding_to_sjis");

上記の場合は、テンプレートのコンパイルが完了した後に convert_encoding_to_sjis()関数が呼び出されます。 関数には第一引数としてテンプレートのコンパイル済みのソースコードが、第二引数としてSmartyインスタンスのリファレンスが渡されるので、ソースコードに対して必要な処理を行った結果を戻り値として返すようにします。

function convert_encoding_to_sjis($template_source, &$smart) {
if (function_exists("mb_convert_encoding")) {
return mb_convert_encoding($template_source, "SJIS", "EUC-JP");
}
return $template_source;
}