Контроллеров я уже касался в первой своей статье о MODX . В то время я был счастлив что все сразу заработало и не особо вдаваясь в детали. Согласно "родному" руководству в "Действиях" для пункта меню достаточно поставить "index" для action, создать файл в каталоге /core/components/myComp/controllers/index.class.php, в нем класс MyNameSpaseIndexManagerController с необходимым содержанием и все. Все прекрасно работало. Проблемы начались когда я стал распределять права разным пользователям. Поле "Привилегии" в редакторе кнопки меню. Порывшись в исходниках я обнаружил, что для поиска атрибута "привилегии"(permission) система ищет нужный пункт меню по полю "Действие"(action). И если есть несколько компонентов с одинаковыми action, то берется строка с первым попавшимся и с него считывается привилегия. Вывод: "Действие"(action) должно иметь уникальное значение.
Очерендной раз обрадовавшись, что проблема ясна, я тупо переименовал action в "my_comp_index", соответсвенно и имя файла и сам класс. В итоге компонент просто перестал работать. Можно было, конечно,вернуть все на место и просто переопределить CheckPermissions. Но это, как говорят гуру кодирования, костыли. Пришлось снова лезть в исходники. Разбирая как все устроено в Quip, я обнаружил что у него в редакторе меню в action вообще стоит цифра '2'. А пространство имен - 'core'. Хотя все файлы в своих каталогах(.../core/components/quip/.....); Это меня вообще озадачило. Пережив уж не знаю какой по счету шок, полез в таблицы базы. И обнаружил таблицу modx_actions в которой и была запись с id=2, namespase=quip, controller='index'
Опять обрадовавшись, я добавил в эту таблицу свою запись(id=4), поменял все в редакторе меню, вернул назад имя файла и имя класса контроллера. Запустил. И ничего не работает. Опять залез в исходники, навсталял отладочной инфы и выяснил, что система не видит моей строки в modx_actions. В конце-концов выяснил, что эта таблица кэшируется. Сбросил кэш("Управление"->"Обновить сайт"). Система нашла таки мою запись. Но что-то было не так. Оказалось, что если в редакторе меню, в пространстве имен указано 'core', имя класса будет уже без пространства имен. Т.е. имя класса при таком варинте подключения всегда будет - 'IndexManagerController'. Имя файла - 'index.class.php'.
Вообще имя класса определяется системой след. образом (getControllerClassName($action,$namespace = '',$postFix = 'ManagerController')):
В итоге при $action=my_comp_index,$namespace='rygyki' получим RygykiMyCompIndexManagerController.
Вообще можно перекрыть функцию getControllerClassName(написать в своем классе), тогда можно именовать как угодно.
И вот теперь можно было вернуться к первому варианту и больше не париться. Но как-то хотелось разобраться.... Да и привязка контроллера к id в mod_actions более надежная вещь.
Очередной раз погрузившись в дебри исходников, я выяснил, что при вызове контроллера через индексы, вызываются не рекомендованные фукции(deprecated). Стало ясно, что такой метод применялся в предыдущих версиях. Так что придется возращаться к "Попытке 1".
Короче все получилось, чему я не особо удивился))). Суммируем все это:
Мораль из всего этого такая:
Комментарии 0