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/

Подскажите, пожалуйста, в чем проблема.
Marina
25 августа 2015, 08:09
modx.pro
1 987
0

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

Наумов Алексей
25 августа 2015, 11:12
+1
Вся проблема в том, что нужно открыть документацию docs.modx.pro/components/pdotools/general-settings

и найти параметр checkPermissions.

Далее вбить его в поиск на этом сайте, что бы увидеть примеры modx.pro/search?query=checkPermissions

в общем вам скорее всего нужно

&checkPermissions=`list`
    Marina
    25 августа 2015, 16:32
    0
    Безграничное спасибо за пинок в нужном направлении :) Это получилось. pdoResources выводит верный список ресурсов в соответствии с правами пользователя.

    Еще спрошу.
    Теперь все это хозяйство оборачиваю в 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-го… Почему?
      Наумов Алексей
      25 августа 2015, 16:48
      0
      Ну вот тут все сложнее.

      Потому что сначала выбирается 4 ресурса из БД, а потом проверяются права. В итоге видим ту картину, что вы описали. А проверять права в момент выборки нельзя.

      Не сделать корректную постраничную навигацию с pdoPage и pdoResources с проверкой прав таким образом…

      Копался в этом же направлении сам как-то, в итоге забил.
        Marina
        25 августа 2015, 17:10
        0
        Я так понимаю, getPage+getResources не справляются тоже с этим.
        Алексей, а других вариантов реализации такой постраничной навигации нет?
        Василий Наумкин
        25 августа 2015, 17:10
        0
        Почему?
        Потому, что система прав в MODX настолько гибкая, что до выборки исключить ресурсы не получается.

        Поэтому они исключаются после. И никак этого не избежать, разве что самостоятельно выбирать ресурсы по каким-то другим параметрам, типа родителя или шаблона, а не фильтровать по разрешению.
        Marina
        25 августа 2015, 17:41
        0
        Ну так не должно быть.
        Есть новости. Каждая входит в разные группы ресурсов.
        Вызываем pdoResources с limit=10. Администратор увидит все 10, Менеджер- 2, Гость — 1. Хотя в БД есть и другие новости предназначенные для Менеджера и Гостя. Но за счет того, что выбираются они без учета прав, страдают все кроме Администратора :)
          Василий Наумкин
          25 августа 2015, 17:53
          0
          Ну так не должно быть.
          Предложите своё решение, как выбрать ресурсы с учётом системы прав MODX.

          Я с удовольствием освою этот трюк и даже включу в функционал pdoTools.
            Воеводский Михаил
            25 августа 2015, 19:27
            +1
            Если вы точно знаете, какие группы ресурсов удовлетворяют, отключите проверку прав и добавьте в выборку условия по привязке и проверке групп ресурсов через innerJoin/leftJoin. Как именно сделать — не подскажу, надо экспериментировать. Не настолько хорошо знаю SQL, чтобы сходу написать условия.
            Василий Наумкин
            25 августа 2015, 22:47
            +1
            Есть идея: можно попробовать решить этот вопрос двойным вызовом 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 вернёт список всех подходящих ресурсов, которые прошли проверку для юзера. А второй вызов будет работать уже с этими ресурсами без проверок — и выведет их разбитыми на страницы как положено.

            Не проверял, но должно работать.
              Наумов Алексей
              26 августа 2015, 08:43
              0
              Да, по идее сработает.

              Правда, наверное, будут проблемы с производительностью, если количество дочерних ресурсов будет большим, ведь для каждого из них будет производится проверка прав.
                Воеводский Михаил
                26 августа 2015, 08:48
                +1
                Здесь уж надо выбирать, что есть меньшее из зол — корректная пагинация и низкая производительность или некорректная пагинация с хорошей производительностью.
                Причем, смотреть в условиях определенного проекта.
                  Василий Наумкин
                  26 августа 2015, 09:08
                  0
                  Согласен, да.

                  Можно написать свой сниппет, который будет вызывать pdoResources и кэшировать эти ids для конкретного юзера. Можно даже, наверное, сделать это и средствами самого pdoResources, используя параметры &cacheKey и &cacheTime, но мне сейчас некогда проверять.

                  Направление работы должно быть понятно.
                  Marina
                  26 августа 2015, 12:16
                  0
                  Спасибо, Василий.
                  Дело мастера боится :)
                  Результат работы предложенного Вами способа.



                  Про производительность пока ничего сказать не могу. Но, конкретно с новостями, думаю, никакой трагедии наблюдаться на должно. Количество их невелико. Зато «дырок» и недодач не будет :)
                    Василий Наумкин
                    26 августа 2015, 12:30
                    0
                    Производительность можно замерить, если выставить в шаблоне страницы вот такие плейсхолдеры внизу:
                    Общее время: [^t^]
                    Время запросов: [^qt^]
                    Количество запросов: [^q^]
                    У нас, например, вы можете видеть такие цифры внизу каждой страницы.
                  Илья
                  02 сентября 2017, 12:06
                  0
                  getResources фильтрует выдачу на основе Resource ACL, т.е не показывает ресурсы, относящиеся к группе ресурсов, к которой текущий юзер не имеет доступа, у pdoResources такой функции к сожалению нет насколько я понимаю…
                    Василий Наумкин
                    02 сентября 2017, 13:15
                    0
                    Плохо понимаешь.

                    В первом же комментарии дан правильный ответ.
                    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                    16