ひさしぶりにsmartyをさわった。modifierを登録しようとしたのにうまくいかなくてはまったのでメモ。
Hoge_Controllerの設定
Ethnaではadd-projectとかで作られたHoge_Controllerの中に、smartyのプラグイン関連の設定を書く場所があります。
/** * @var array アプリケーションディレクトリ */ var $directory = array( 'action' => 'app/action', 'action_cli' => 'app/action_cli', 'action_xmlrpc' => 'app/action_xmlrpc', 'app' => 'app', 'bin' => 'bin', 'etc' => 'etc', 'filter' => 'app/filter', 'locale' => 'locale', 'log' => 'log', 'plugins' => array('lib/smarty'), // (*1) 'template' => 'template', 'template_c' => 'tmp', 'tmp' => 'tmp', 'view' => 'app/view', );
/** * @var array smarty modifier定義 */ var $smarty_modifier_plugin = array( /* * TODO: ここにユーザ定義のsmarty modifier一覧を記述してください * * 記述例: * * 'smarty_modifier_foo_bar', */ 'smarty_modifier_hoge_fuga', // (*2) );
なんだか紛らわしい感じがするのだけど、
というモノであって、これらはほとんど関係のない設定であることになります。
(*1)の設定をするのならば、Smartyのプラグインの流儀に従って、 "lib/plugin/modifier.hoge_fuga.php" というファイル名で、 "function smarty_modifier_hoge_fuga()" という関数を用意してあげます。
(*2)の設定をするのならば、Ethnaがregister_modifierを代行してくれるだけなので、指定した関数(callback)は別のところで定義するか、定義されているファイルを自分でinclude_onceしてあげなければいけません。
はまりどころ
はまったのは、(*1)と(*2)の設定を両方書いていた場合です。
この場合、Smartyは「わざわざregister_modifierしてるんだから、自分で探さなくても用意しておいてくれるんでしょ?」と考える(smarty/libs/internals/core.load_plugins.php)らしく、(*1)で設定した場所を探すどころか、探そうともしてくれません。
なので、(*2)の設定は、ふつうにSmartyのプラグインを指示する感じではなく、
- Ethnaのアプリケーション中のどっかで定義された関数を、Smartyでも使いたくなったとき
- include_onceは自分でやるぜ! というとき
- 最初から定義されているSmartyプラグインの挙動を上書きしたいとき
なんかに書くものだ、ってことになります。
(*2)に書いてある設定例は、Smartyの挙動をよく分かっていれば「こんな指定を明示する必要はないはずだ」と気づくのでしょうが、慣れていない人にとっては、「プラグインの場所(*1)と名前(*2)を登録するんだな」と、誤解してしまうんじゃないかと思いました。