1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

load_class_controller срабатывает только один раз

Тема в разделе "Основные вопросы по XenForo", создана пользователем magog, 08.08.2013.

Загрузка
  1. magog

    magog Новичок

    Регистрация:
    20.06.13
    Сообщения:
    6
    Симпатии:
    0
    Версия XF:
    1.1.5
    Всем привет!
    Я написал несколько аддонов, и в нескольких из них навешен листенер load_class_controller.
    Но почему то метод (например actionIndex) вызывается только для одного extend-класса у одного аддона. Если выключаю листенер у этого аддона, то только тогда срабатывает другой. Вместе не срабатывают (((
    Что то мне подсказывает что так быть не должно.

    Никто не сталкивался с подобным и как это лечится?
    Моя версия 1.1.5

    Заранее спасибо!
     
  2. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    magog, А вы parent::actionIndex() вызываете?
    Т.е. надо понимать что это просто наследование классов и если происходит наследование и надо чтобы вызывался основной функционал, то обязательно нужен parent
     
  3. magog

    magog Новичок

    Регистрация:
    20.06.13
    Сообщения:
    6
    Симпатии:
    0
    Версия XF:
    1.1.5
    Да, конечно.
    PHP:
        public function actionIndex(){
            
    $response parent::actionIndex();
            
    $threadId $this->_input->filterSingle('thread_id'XenForo_Input::UINT);
           
            
    $userId XenForo_Visitor::getInstance()->getUserId();// )
            
    $votes $this->_getVotesModel()->getUserVotesByThreadId$userId$threadId );       
           
            foreach( 
    $response->params['posts'] as &$post ){
                
    $this->_processPost($post$votes$userId);
            }
       
            return 
    $response;
        }
     
  4. magog

    magog Новичок

    Регистрация:
    20.06.13
    Сообщения:
    6
    Симпатии:
    0
    Версия XF:
    1.1.5
    Ребята, посмотрел тут, все так и есть, зараза.
    В методе FrontController::_getValidatedController
    PHP:
        protected function _getValidatedController($controllerName$actionXenForo_RouteMatch $routeMatch)
        {
            
    $controllerName XenForo_Application::resolveDynamicClass($controllerName'controller');
            if (
    $controllerName)
            {
                
    $controller = new $controllerName($this->_request$this->_response$routeMatch);
                if (
    method_exists($controller'action' $action) && $this->_dependencies->allowControllerDispatch($controller$action))
                {
                    return 
    $controller;
                }
            }
     
            return 
    null;
        }
    определяется последний хендлер (XenForo_Application::resolveDynamicClass) , его и пускает.
    В общем на контроллер только один хук можно повесить, что весьма печально.
    Правда вроде как пускает конструктора ввсех extend, что наверное можно как то использовать.
    Ну или один общий писать.

    Всем спасибо!
     
  5. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Если честно, так и не понял в чем у Вас проблема, но лично у меня никаких проблем с наследованием не возникало...
     
  6. magog

    magog Новичок

    Регистрация:
    20.06.13
    Сообщения:
    6
    Симпатии:
    0
    Версия XF:
    1.1.5
    Дело не в наследовании.
    Вот посмотрите
    Кто-то написал аддон и перегрузил там какой-то контроллер.
    Кто-то другой тоже написал аддон и перегрузил тот же контроллер.
    Работать будет только одна перегрузка.
     
  7. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    да изначально будет запускаться метод последнего в цепочке наследования класса, но тут как раз задача разработчика вызвать родительский метод и так далее по цепочке.
    Т.е. поломать цепочку вызовов очень легко просто не вызвав родительский метод. Кстати многие разработчики хаков так и делают, а потом куча жалоб что ломают стандартный функционал или несовместимость с другими хаками.

    P.S. покажите пример где у Вас не работает - проще будет сказать что написать чтобы заработало.
     
  8. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Должно срабатывать последнее (с учетом указанного номера в списке обработчиков). Если в нем есть вызов родительского (parent), то вызывается предыдущее по списку и т.д. Таким образом обходятся все обработчики, включая оригинальный класс.
    Кстати, покажите заодно, как Вы обрабатываете load_class_controller.
     
  9. magog

    magog Новичок

    Регистрация:
    20.06.13
    Сообщения:
    6
    Симпатии:
    0
    Версия XF:
    1.1.5
    Хм, странно, должно быть я не доконца отдебажил.
    Но я решил проблему по другому, с помощью front_controller_preview.
    Просто в респонс добавляю что нужно.
    Но факт остается фактом. У меня было два аддона.
    Последний actionIndex шел на ура, а предыдущий не вызывался.
    Начинал каждый акшн так:
    PHP:
    $response parent::actionIndex();
    var_dump($response); die();
    Во втором с конца аддоне die() не срабатывал, если комментил в первом.
     
  10. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Помимо вызова parent нужно еще и возвращать правильно. Возможно, возвращали не то, что нужно. В любом случае это не глюк и не баг движка. Ошибка явно в Вашем коде. У меня во всех плагинах вся цепочка всегда работала правильно.
     
  11. magog

    magog Новичок

    Регистрация:
    20.06.13
    Сообщения:
    6
    Симпатии:
    0
    Версия XF:
    1.1.5
    ТОт же респонс и возвращал. Дополнял только $response->params нужными переменными.
    Я б код прислал, только переделал уже (((
     

Поделиться этой страницей