MODX - контроллеры с разграничением прав

Контроллеров я уже касался в первой своей статье о 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 разбивается на куски по символу '/'
  • Из каждого куска удаляются символы '.','_','-'(поэтому у меня и не сработал первый вариант)
  • Каждый первый символ в каждом куске переводится в верхний регистр.
  • Первый символ пространства имен перводиться в врхний регистр
  • И все это склеиватся:(Пространство имен)+(все куски)+$postFix

В итоге при $action=my_comp_index,$namespace='rygyki' получим RygykiMyCompIndexManagerController.

Вообще можно перекрыть функцию getControllerClassName(написать в своем классе), тогда можно именовать как угодно.

И вот теперь можно было вернуться к первому варианту и больше не париться. Но как-то хотелось разобраться.... Да и привязка контроллера к id в mod_actions более надежная вещь.

Очередной раз погрузившись в дебри исходников, я выяснил, что при вызове контроллера через индексы, вызываются не рекомендованные фукции(deprecated). Стало ясно, что такой метод применялся в предыдущих версиях. Так что придется возращаться к "Попытке 1".

Короче все получилось, чему я не особо удивился))). Суммируем все это:

  1. "Система"->"Действия" - здесь создаем кнопку в меню. Action(Действия) делаем уникальным. Напр. 'imycomp'
  2. Создаем пространсво имен для своего компонента(напр. 'myNS'). В нем указываем путь к ядру нашего компонента. Напр. - '{core_path}components/myComponent/'.
  3. В этом каталоге создаем каталог 'controllers' и файл 'imycomp.class.php'('{core_path}components/myComponent/controllers/imycomp.class.php')
  4. В этом файле класс котроллера по имени 'MyNSImycompManagerController'
На самом деле файл контроллера ищется в нескольких местах, корне ядра компонента, в каталоге 'controllers', в каталоге 'controllers/default'. Относительно ядра компонента.

Мораль из всего этого такая:

  1. Не следует полностью полагаться на исходники установленных компонентов. Т.к. они могут быть написаны для устаревших версий.
  2. Все значения полей(строковые естественно) писать без символов '.','_','-'. Потому что MODX их не любит и старается избавится от них.
  3. Все action(действия) в редакторе меню должны быть уникальными. Странно, что про это нигде не написано. Хотя если вы не собираетесь разграничивать права, то это не обязательно.
  4. Избегать использование цифровых индексов для назначения action. Т.к. в этом случае придется класс писать как для старых версий.


Комментарии 0






Разрешённые теги: <b><i><br>Добавить новый комментарий: