cakephp元素的回调函数?

时间:2013-03-22 16:30:50

标签: cakephp element

这可能是一个天真的问题,因为我是cakephp的新手。

我正在开发一个有很多布局,辅助工具和元素的项目。因为这是一个多语言网站,我拦截最终渲染输出以进行一些语言转换(因此每个访问者只能在网站上看到他的母语,包括用户输入)。

我通过在两个地方添加代码来设法转换大部分布局和帮助:AppController&afterFilter()和AppHeler的afterRender()函数。但是我无法找到一种集中处理元素的方法,而且有很多元素。

所以这是我的问题:cakephp中的所有元素都有共同的祖先类吗?如果是这样,这个祖先类是否有回调函数,如afterRender()?

非常感谢!

1 个答案:

答案 0 :(得分:1)

我不确定这些回调是否存在特定于'元素',但是查看source codeView::element()使用相同的 _render()呈现元素}方法作为视图本身,应该触发beforeRender()afterRender()

创建自定义视图类和自定义回调

您可以使用自定义“查看”类并覆盖element()方法,例如让自己的“自定义”回调在助手中触发

像这样;

应用程序/视图/ app_view.php

class AppViewView extends View {
    /**
     * custom 'element()' method, triggers custom
     * before/aferRenderElement callbacks on all loaded helpers
     */
    public function element($name, $params = array(), $loadHelpers = false)
    {
        $this->_triggerHelpers('beforeRenderElement');
        $output = parent::element($name, $params, $loadHelpers);
        $this->_triggerHelpers('afterRenderElement');
    }

    /**
     * Names of custom callbacks
     */
    protected $_customCallBacks = array(
        'beforeRenderElement',
        'afterRenderElement',
    );

    function _triggerHelpers($callback)
    {
         if (!in_array($callback, $this->_customCallbacks)) {
             // it's a standard callback, let the parent class handle it
             return parent::_triggerHelpers($callback);
         }

         if (empty($this->loaded)) {
             return false;
         }
         $helpers = array_keys($this->loaded);
         foreach ($helpers as $helperName) {
             $helper =& $this->loaded[$helperName];
             if (is_object($helper)) {
                 if (
                      is_subclass_of($helper, 'Helper') 
                      && method_exists($helper, $callback)
                 ) {
                     $helper->{$callback}();
                 }
             }
         }
    }
}

然后,在AppController中指定要使用的“view”类;

class AppController extends Controller {
    public $view = 'AppView';
}