Ethna_Controllerの謎

Ethna-2.31、Ethna_Controller.phpでのお話。

クラスのメソッドをSmartyFunctionとして登録する方法

えーと、自分で勝手に取りこんでしまいました。以下のように配列で指定することでクラスのメソッドをsmarty_functionとして登録することが可能です。


smarty関数などを登録する

ということなんだが、modifierだけうまくいかない。なぜだ!と思ってソースを見たよ。

<?php
    /**
     *  テンプレートエンジン取得する
     *
     *  @access public
     *  @return object  Ethna_Renderer  レンダラオブジェクト
     *  @obsolete
     */
    function &getTemplateEngine()
    {
        if (is_object($this->renderer)) {
            return $this->renderer;
        }
        
        $this->renderer =& $this->class_factory->getObject('renderer');
       
        // {{{ for B.C.
        if (strtolower(get_class($this->renderer)) == "ethna_renderer_smarty") {
            // user defined modifiers
            foreach ($this->smarty_modifier_plugin as $modifier) {
                $name = str_replace('smarty_modifier_', '', $modifier);
                $this->renderer->setPlugin($name,'modifier', $modifier);
            }

            // user defined functions
            foreach ($this->smarty_function_plugin as $function) {
                if (!is_array($function)) {
                    $name = str_replace('smarty_function_', '', $function);
                    $this->renderer->setPlugin($name, 'function', $function);
                } else {
                    $this->renderer->setPlugin($function[1], 'function', $function);
                }
            }

            // user defined blocks
            foreach ($this->smarty_block_plugin as $block) {
                if (!is_array($block)) {
                    $name = str_replace('smarty_block_', '', $block);
                    $this->renderer->setPlugin($name,'block', $block);
                } else {
                    $this->renderer->setPlugin($block[1],'block', $block);
                }
            }

            // user defined prefilters
            foreach ($this->smarty_prefilter_plugin as $prefilter) {
                if (!is_array($prefilter)) {
                    $name = str_replace('smarty_prefilter_', '', $prefilter);
                    $this->renderer->setPlugin($name,'prefilter', $prefilter);
                } else {
                    $this->renderer->setPlugin($prefilter[1],'prefilter', $prefilter);
                }
            }

            // user defined postfilters
            foreach ($this->smarty_postfilter_plugin as $postfilter) {
                if (!is_array($postfilter)) {
                    $name = str_replace('smarty_postfilter_', '', $postfilter);
                    $this->renderer->setPlugin($name,'postfilter', $postfilter);
                } else {
                    $this->renderer->setPlugin($postfilter[1],'postfilter', $postfilter);
                }
            }

            // user defined outputfilters
            foreach ($this->smarty_outputfilter_plugin as $outputfilter) {
                if (!is_array($outputfilter)) {
                    $name = str_replace('smarty_outputfilter_', '', $outputfilter);
                    $this->renderer->setPlugin($name,'outputfilter', $outputfilter);
                } else {
                    $this->renderer->setPlugin($outputfilter[1],'outputfilter', $outputfilter);
                }
            }
        }

        //テンプレートエンジンのデフォルトの設定
        $this->_setDefaultTemplateEngine($this->renderer);
        // }}}

        return $this->renderer;
    }
?>

んー?あれー? なぜ、modifierだけが。。。 他のところと同様に、とりあえず、こうすれば普通にいけました。

やり忘れって感じか、ものすごい政治的な理由か。

<?php
            foreach ($this->smarty_modifier_plugin as $modifier) {
                if (!is_array($modifier)) {
                    $name = str_replace('smarty_modifier_', '', $modifier);
                    $this->renderer->setPlugin($name,'modifier', $modifier);
                } else {
                    $this->renderer->setPlugin($modifier[1], 'modifier', $modifier);
                }
            }
?>

これは、まあ、そのうちアップデートされるんだろう。