Smartyを2系列から3系列に移行するにあたって困ったこと

1. 始めに

自分が運用しているいろいろなwebサイトでテンプレートエンジンであるSmartyを利用している。エスケープとかを全部オマカセにできてMVCが分離できるっていうのでなかなかの優れものだ。

で、最近、ひょんなことからwebサーバを構築し直すことになった。従来のサーバではSmartyのバージョンが2系列を利用したのだけれど、どうやら3系列が最新版らしかったのでこっちを入れてみた。

動作が高速になるだとかいろいろと恩恵があるそうで、それならば、ということで。何より最新版があるならばそっちを利用しよう、というのがモットーなので今回も多分に漏れず移行してしまったみました。

Smarty2.0からSmarty3.0への変更点 | suinasia

2. 問題その1

さて、インストールなどは簡単に終わり早速移行したのだけれどいきなり問題が発生した。

smartyでappendしている変数がどうにも表示されない。{debug}を埋め込んでみても変数が渡されている形跡が無い。不審に思ってappend(assign)している箇所にて渡される変数を見てみるとこちらはちゃんと内容が入っている。うーん、これは困ったなぁ、と思いながら眺めているとすべての変数が渡されていないわけじゃないことに気がついた。一部変数はちゃんと渡されているのだ。ということはappend(assign)が絶対的に悪いわけじゃ無いらしい。

で、どんな値なら渡されてどんな値は渡されていないのか、そこが気になった。で、一目瞭然、日本語データが渡されていないのだ。

mb_convert_stringなどでテキトウに変換して渡してやると変な状態になった。出力がUTF-8の時のみ、データが表示されたのだ。

今回対象となっているwebサイトは作られた時期が古く、SJISでやりくりしていた。smartyの出力もSJISだったんだ。というわけでどうやらそこが原因らしい。

で、smarty3とutf-8あたりでググるとさっそく情報が出てきた。というか前述のページにもしっかり書かれてました。

SMARTY_RESOURCE_CHAR_SETという変数がUTF-8で宣言されるのですが、コレをsmartyより先にSJISとかでdefineしないとダメぽです。

UTF-8 以外でテンプレートを作成する – smarty3

define('SMARTY_RESOURCE_CHAR_SET', 'SJIS');
require_once('Smarty.class.php');

コメントを残す