Ethna_Controllerの謎
Ethna-2.31、Ethna_Controller.phpでのお話。
クラスのメソッドをSmartyFunctionとして登録する方法
えーと、自分で勝手に取りこんでしまいました。以下のように配列で指定することでクラスのメソッドをsmarty_functionとして登録することが可能です。
ということなんだが、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); } } ?>
これは、まあ、そのうちアップデートされるんだろう。