modifier

ひさしぶりに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プラグインを探すときに使うpathを指定する
  • (*2) はEthnaregister modifierする関数名(callback)を指定する

というモノであって、これらはほとんど関係のない設定であることになります。

(*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)を登録するんだな」と、誤解してしまうんじゃないかと思いました。