Ограничиваем доступ в pdoMenu и Tickets через группы ресурсов

Через группы ресурсов MODX у меня сделано ограничение к разделам сайта. Но так как pdoMenu, по умолчанию, не смотрит в эти группы, то на сайте в меню были видны все разделы. Только в них зайти нельзя было. Наконец-то добрался это поправить. pdoMenu поддерживает добавление своих параметров запросов в SQL. После нескольких попыток, получилось убрать лишнее добавив в вызов pdoMenu:
Upd 21.03.2020 как оказалось в pdoMenu команда &checkPermissions=`list` выполняет нужные функции:
{'!pdoMenu' | snippet : [
    'checkPermissions'='list',
]}
Так же она работает для getTickets. Из нужного такой команды нет только для TicketLatest.
Под катом ограничение для TicketLatest и небольшой пример добавления редактирования групп ресурсов тикета в TicketForm.


Ограничения для TicketLatest :
{'!TicketLatest' | snippet : [
	'leftJoin'=>[
		'modResourceGroupResource'=>[
			'class'=>'modResourceGroupResource',
			'on'=>'modResourceGroupResource.document = Ticket.id',
		],
		'modUserGroupMember'=>[
			'class'=>'modUserGroupMember',
			'on'=>'modUserGroupMember.member = '~$_modx->user.id ~ ' AND modResourceGroupResource.document_group IS NOT NULL',
		],
		'modAccessResourceGroup'=>[
			'class'=>'modAccessResourceGroup',
			'on'=>'modResourceGroupResource.document_group = modAccessResourceGroup.target',
		],
	],
	'where'=>[
		'(modAccessResourceGroup.principal IS NULL OR modUserGroupMember.user_group = modAccessResourceGroup.principal)',
	],
]}
Через тикеты я думаю вести Базу знаний компании. Справку, задачи и проекты программистов. Справка предназначена для разных групп пользователей и какая-то страница должна быть видна всем, а какая-то только одной или двум группам. Писать справку и пользоваться ей удобней через фронт. И назначать группы ресурсов, наверно, лучше через фронт, чтоб не лазить в админку.
Правка групп ресурсов через TicketForm.
Для этого нужено:
1) Cниппет вывода групп ресурсов. ticketResourceGroup
2) Чанк ticketResourceGroup
3) Плагин на OnDocFormSave TicketsResGroup
4) На страницу создания-редактирования тикета выводим:
{'!TicketForm' | snippet : ['allowedFields'=>'res_groups']}
5) в чанки tpl.Tickets.form.create и tpl.Tickets.form.update добавляем:
<div class="form-group">
        <label for="ticket-res_groups">Доступ</label>
        {'!ticketResourceGroup' | snippet : []}
        <span class="error"></span>
    </div>
Сниппет выводит селект с мульти-выбором групп ресурсов и с name=«res_groups». Плагин перехватывает этот параметр и этот тикет добавляет к группам ресурсов и удаляет из них.
Получилось вот так:

(У меня еще прикручен davidstutz.de/bootstrap-multiselect/)

Мучают меня смутные подозрения, что можно было бы эту задачу решить по другому. Но сейчас ничего такого не приходит в голову :-(.
Upd 21.03.2020 Спасибо @Василий Наумкин подсказал про &checkPermissions=`list`. Но вообще у меня до сих пор сомнения, что вообще задачу надо решать распределяя тикеты по группам ресурсов. Может стоило ввести кучу разделов справка для менеджеров, справка для цеха, но дублировать совпадающие статьи не охота :-(. Интересно есть ли еще решение получше…

Наверно, решение мало кому пригодиться, но, надеюсь, кому-нибудь все-таки пригодиться :-).
Александр Туниеков
21 марта 2020, 04:40
modx.pro
1 146
0
Поблагодарить автора Отправить деньги

Комментарии: 6

Василий Наумкин
21 марта 2020, 04:42
+1
Мучают меня смутные подозрения, что можно было бы эту задачу решить по другому. Но сейчас ничего такого не приходит в голову :-(.
[[!pdoMenu?
    &checkPermissions=`list`
]]
    Александр Туниеков
    21 марта 2020, 05:29
    0
    Мда… Как то не подумал что list прокатит. Думал надо заводить какие-то отдельные права :-(. Вообщем не сообразил.
    Для getTickets тоже прокатило. А с TicketLatest уже не срабатывает.
      iWatchYouFromAfar
      21 марта 2020, 14:35
      0
      Странно, сниппеты Tickets расширяются общими параметрами pdoTools, куда входит параметр checkPermissions. Должен работать и с TicketLatest.
        Александр Туниеков
        21 марта 2020, 14:58
        0
        {'!TicketLatest' | snippet : [
              'checkPermissions'=>'list',
        ]}

        Тест лишнее. Не работает. Наверно основной класс запроса не Ticket, поэтому не срабатыват. Извиняюсь, лезть в код не стал и точно сказать не могу. Только проверил.
      Александр Туниеков
      21 марта 2020, 05:33
      0
      Блин фиг пойми как заметку переписывать :-(. Сразу логические связки теряются :-). Ладно, надеюсь, комментарии читать будут.
      Николай Савин
      21 марта 2020, 21:04
      0
      как оказалось в pdoMenu команда &checkPermissions=`list` выполняет нужные функции:
      Не в pdoMenu. Ты немного в заблуждение вводишь, или сам не разобрался еще. Это единый общий параметр всего семейства pdoTools. Работает во всех сниппетах и, по идее, должен работать во всех компонентах, которые используют в своем ядре класс pdoTools
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        6