pdoResources. Учет прав доступа на ресурс
Здравствуйте.
Пытаюсь заменить getResources на pdoResources. Использую pdoTools 2.1.3, MODx Revolution 2.2.14-pl traditional.
Но pdoResources выводит список ресурсов без учета прав пользователя на эти ресурсы.
Вызов pdoResources
[[!pdoResources?
&parents=`3672`
&limit=`0`
&depth=`0`
&sortby=`{«publishedon»:«DESC»}`
&sortdir=`DESC`
&hideContainers=`1`
&includeTVs=`1`
&processTVs=`1`
&tpl=`newsGRTest_tpl`
]]
Нашла только статью 2013 года о том, что не реализован функционал, но там версия pdoTools 1.6.0-pl bezumkin.ru/sections/components/1775/
Подскажите, пожалуйста, в чем проблема.
Пытаюсь заменить getResources на pdoResources. Использую pdoTools 2.1.3, MODx Revolution 2.2.14-pl traditional.
Но pdoResources выводит список ресурсов без учета прав пользователя на эти ресурсы.
Вызов pdoResources
[[!pdoResources?
&parents=`3672`
&limit=`0`
&depth=`0`
&sortby=`{«publishedon»:«DESC»}`
&sortdir=`DESC`
&hideContainers=`1`
&includeTVs=`1`
&processTVs=`1`
&tpl=`newsGRTest_tpl`
]]
Нашла только статью 2013 года о том, что не реализован функционал, но там версия pdoTools 1.6.0-pl bezumkin.ru/sections/components/1775/
Подскажите, пожалуйста, в чем проблема.
Комментарии: 16
Вся проблема в том, что нужно открыть документацию docs.modx.pro/components/pdotools/general-settings
и найти параметр checkPermissions.
Далее вбить его в поиск на этом сайте, что бы увидеть примеры modx.pro/search?query=checkPermissions
в общем вам скорее всего нужно
и найти параметр checkPermissions.
Далее вбить его в поиск на этом сайте, что бы увидеть примеры modx.pro/search?query=checkPermissions
в общем вам скорее всего нужно
&checkPermissions=`list`
Безграничное спасибо за пинок в нужном направлении :) Это получилось. pdoResources выводит верный список ресурсов в соответствии с правами пользователя.
Еще спрошу.
Теперь все это хозяйство оборачиваю в pdoPage. И тут не все гладко проходит.
На первой странице выводится один документ; на след. странице три, но нумерация с 5 документа, на третьей 4 документа нумерация с 9-го… Почему?
Еще спрошу.
Теперь все это хозяйство оборачиваю в pdoPage. И тут не все гладко проходит.
[[!pdoPage?
&element=`pdoResources`
&parents=`3672`
&limit=`4`
&sortby=`{"publishedon":"DESC"}`
&hideContainers=`1`
&showUnpublished =`0`
&tpl=`news_tpl`
&idx=`[[+firstItem]]`
&pageLimit=`5`
&pageNavVar=`page.nav`
&checkPermissions=`list`
&cach=`0`
]]
Вывожу документы в чанке news_tpl. Пытаюсь сквозную нумерацию у документов на страницах сделать. [[+idx]]. [[+pagetitle]]
Получается кривота. Всего 8 документов.На первой странице выводится один документ; на след. странице три, но нумерация с 5 документа, на третьей 4 документа нумерация с 9-го… Почему?
Ну вот тут все сложнее.
Потому что сначала выбирается 4 ресурса из БД, а потом проверяются права. В итоге видим ту картину, что вы описали. А проверять права в момент выборки нельзя.
Не сделать корректную постраничную навигацию с pdoPage и pdoResources с проверкой прав таким образом…
Копался в этом же направлении сам как-то, в итоге забил.
Потому что сначала выбирается 4 ресурса из БД, а потом проверяются права. В итоге видим ту картину, что вы описали. А проверять права в момент выборки нельзя.
Не сделать корректную постраничную навигацию с pdoPage и pdoResources с проверкой прав таким образом…
Копался в этом же направлении сам как-то, в итоге забил.
Я так понимаю, getPage+getResources не справляются тоже с этим.
Алексей, а других вариантов реализации такой постраничной навигации нет?
Алексей, а других вариантов реализации такой постраничной навигации нет?
Почему?Потому, что система прав в MODX настолько гибкая, что до выборки исключить ресурсы не получается.
Поэтому они исключаются после. И никак этого не избежать, разве что самостоятельно выбирать ресурсы по каким-то другим параметрам, типа родителя или шаблона, а не фильтровать по разрешению.
Ну так не должно быть.
Есть новости. Каждая входит в разные группы ресурсов.
Вызываем pdoResources с limit=10. Администратор увидит все 10, Менеджер- 2, Гость — 1. Хотя в БД есть и другие новости предназначенные для Менеджера и Гостя. Но за счет того, что выбираются они без учета прав, страдают все кроме Администратора :)
Есть новости. Каждая входит в разные группы ресурсов.
Вызываем pdoResources с limit=10. Администратор увидит все 10, Менеджер- 2, Гость — 1. Хотя в БД есть и другие новости предназначенные для Менеджера и Гостя. Но за счет того, что выбираются они без учета прав, страдают все кроме Администратора :)
Ну так не должно быть.Предложите своё решение, как выбрать ресурсы с учётом системы прав MODX.
Я с удовольствием освою этот трюк и даже включу в функционал pdoTools.
Если вы точно знаете, какие группы ресурсов удовлетворяют, отключите проверку прав и добавьте в выборку условия по привязке и проверке групп ресурсов через innerJoin/leftJoin. Как именно сделать — не подскажу, надо экспериментировать. Не настолько хорошо знаю SQL, чтобы сходу написать условия.
Есть идея: можно попробовать решить этот вопрос двойным вызовом pdoResources:
Не проверял, но должно работать.
[[!pdoPage ?
&parents=`0`
&limit=`4`
&resources=`[[!pdoResources?&parents=`3672`&limit=`0`&depth=`0`&return=`ids`&checkPermissions=`list`]]`
&sortby=`{"publishedon":"DESC"}`
&sortdir=`DESC`
&hideContainers=`1`
&includeTVs=`tvname1,tvname2`
&processTVs=`1`
&tpl=`news_tpl `
]]
Вложенный вызов в &resources вернёт список всех подходящих ресурсов, которые прошли проверку для юзера. А второй вызов будет работать уже с этими ресурсами без проверок — и выведет их разбитыми на страницы как положено.Не проверял, но должно работать.
Да, по идее сработает.
Правда, наверное, будут проблемы с производительностью, если количество дочерних ресурсов будет большим, ведь для каждого из них будет производится проверка прав.
Правда, наверное, будут проблемы с производительностью, если количество дочерних ресурсов будет большим, ведь для каждого из них будет производится проверка прав.
Здесь уж надо выбирать, что есть меньшее из зол — корректная пагинация и низкая производительность или некорректная пагинация с хорошей производительностью.
Причем, смотреть в условиях определенного проекта.
Причем, смотреть в условиях определенного проекта.
Согласен, да.
Можно написать свой сниппет, который будет вызывать pdoResources и кэшировать эти ids для конкретного юзера. Можно даже, наверное, сделать это и средствами самого pdoResources, используя параметры &cacheKey и &cacheTime, но мне сейчас некогда проверять.
Направление работы должно быть понятно.
Можно написать свой сниппет, который будет вызывать pdoResources и кэшировать эти ids для конкретного юзера. Можно даже, наверное, сделать это и средствами самого pdoResources, используя параметры &cacheKey и &cacheTime, но мне сейчас некогда проверять.
Направление работы должно быть понятно.
Производительность можно замерить, если выставить в шаблоне страницы вот такие плейсхолдеры внизу:
Общее время: [^t^] Время запросов: [^qt^] Количество запросов: [^q^]У нас, например, вы можете видеть такие цифры внизу каждой страницы.
getResources фильтрует выдачу на основе Resource ACL, т.е не показывает ресурсы, относящиеся к группе ресурсов, к которой текущий юзер не имеет доступа, у pdoResources такой функции к сожалению нет насколько я понимаю…
Плохо понимаешь.
В первом же комментарии дан правильный ответ.
В первом же комментарии дан правильный ответ.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.