функции обратного вызова для элементов cakephp?

Это может быть наивным вопросом, так как я новичок в cakephp.

Я работаю над проектом, в котором много макетов, помощников и элементов. Поскольку это многоязычный сайт, я перехватываю окончательный отрендеренный вывод, чтобы выполнить некоторое преобразование языка (поэтому каждый посетитель видит на сайте только свой родной язык, включая пользовательский ввод).

Мне удалось преобразовать большинство макетов и помощников, добавив код в двух местах: функцию afterFilter() AppController и функцию afterRender() AppHeler. Но я не могу придумать централизованный способ обработки элементов, а их десятки.

Итак, вот мои вопросы: все ли элементы в cakephp имеют общий класс-предок? Если да, то есть ли у этого класса-предка функции обратного вызова, такие как afterRender()?

Большое спасибо!


person user2200010    schedule 22.03.2013    source источник
comment
Забыл упомянуть, что я использую cakephp 1.3.   -  person user2200010    schedule 22.03.2013


Ответы (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';
}
person thaJeztah    schedule 22.03.2013
comment
Для Cake 2.x изменения: public $view = 'AppView' -> public $viewClass = 'App'; (ИЛИ 'plugin_name.App' и: $output -> return $output - person Laguna Web Design; 18.10.2016