0

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

我正在做一个有许多布局、助手和元素的项目。因为这是一个多语言站点,所以我截取最终呈现的输出以进行一些语言转换(因此每个访问者在站点上只能看到他的母语,包括用户输入)。

通过在两个地方添加代码,我设法转换了大部分布局和帮助程序:AppController 的 afterFilter() 和 AppHeler 的 afterRender() 函数。但是我想不出一种集中的方式来处理这些元素,并且有几十个。

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

非常感谢!

4

1 回答 1

1

我不确定这样的回调是否存在特定于“元素”,但查看源代码,使用与视图本身相同View::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 中指定要使用的“视图”类;

class AppController extends Controller {
    public $view = 'AppView';
}
于 2013-03-22T22:46:02.200 回答