[РЕШЕНО костылём] pdoResources + tvFilters + multiple select (или) tvFilters и массив

У документа есть tv с множественным выбором, например, Пользователи. При заполненном tv и выборе юзеров с ID 1, 2, 3 и 4 [[+tvUsers]] логично выводит 1,2,3,4

Каким образом можно вызвать pdoResources, указав в tvFilters одно из этих значений, но точное? Оборачивать в % не получится, потому что при фильтрации по ID = 1 сюда же попадут и 10 и 11 и 21 и так далее.

Похожий топик из сети.
koozoo
19 июля 2018, 21:14
modx.pro
1
4 186
0

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

Баха Волков
19 июля 2018, 21:35
0
Нууу… Для вывода юзеров логичнее было бы использовать pdoUsers и от всей души любить читать документации, если таковая есть) Благо у pdoTools отличная документация за что Василию спасибо.

Если задача стоит выводить именно юзеров то есть параметр &users
    koozoo
    19 июля 2018, 21:57
    0
    Неважно ведь Users там или Colors. Ну, будут цвета blue и darkblue, а я хочу отфильтровать blue, а не получится, потому что tv выведет blue,darkblue. А если добавлять %blue%, то может быть цвет blueblue, что тоже не является корректным. Юзеров я привёл для наглядности. Вопрос в том как отфильтровать ресурсы, у которых есть точное значение в массиве, то есть списке с использованием delimiter.
      Баха Волков
      19 июля 2018, 22:02
      0
      цвет blueblue
      Вот это вот в голове произносить нормально не могу ?
        Баха Волков
        19 июля 2018, 22:37
        0
        [[pdoResources?
            &parents=`0`
            &includeTVs=`color`
            &where=`{
                "color:IN": ["синий","желтый"]
            }`
            &tpl=`@INLINE [[+pagetitle]]`
        ]]
        
        {'pdoResources' | snippet : [
            'parents' => 0,
            'includeTVs' => 'color',
            'where' => [
                'color:IN' => ["синий","желтый"]
            ],
            'tpl' => '@INLINE {$pagetitle}'
        ]}
        Ну а если вас мучает вопрос про delimiter сделать сниппет-модификатор который вот это:
        синий,желтый
        вернет как:
        "синий","желтый"
        Ну или же пойти на хитрость и delimiter указать "," (с кавычками), и тогда будет приходить
        синий","желтый
        останется сделать так:
        [[pdoResources?
            &parents=`0`
            &includeTVs=`color`
            &where=`{
                "color:IN": ["[[*color]]"]
            }`
            &tpl=`@INLINE [[+pagetitle]]`
        ]]
        Не проверял, но должно работать

        Надеюсь, что я вас правильно понял и что объяснил доходчиво.
          koozoo
          19 июля 2018, 22:52
          0
          Спасибо за ответ. Объясню своим кодом:

          $profile = $modx->user->getOne('Profile');
          $uid = $profile->get('id'); // = 21
          
          $resources = 
          	$modx->runSnippet('pdoResources',array(
          		'includeTVs'=>'OwnedBy', // = 21,22,23,24
          		'processTVs'=>'1',
          		'tvFilters'=>'OwnedBy==' . $uid, // вот эту строчку надо заменить
          		'tpl'=>'@INLINE {{+id}}'',
                          'outputSeparator'=>','));

          $resources должен быть списком разрешённых ресурсов или тех ресурсов (если не брать мой пример), в котором в множественном списке TV OwnedBy один из вариантов был бы $uid.

          Я пытаюсь сообразить можно ли сделать как-то конструкцию по типу where, превратить вашу строчку

          &where=`{
                  "color:IN": ["синий","желтый"]
              }`
          во что-то грубо говоря типа
          &where=`{
                  "$uid:IN": [OwnedBy]
              }`
      Баха Волков
      19 июля 2018, 21:51
      0
      А если вопрос был задан именно про то как бы запихнуть список через запятую, то:

      {'pdoResources' | snippet : [
          'parents' => 0,
          'where' => [
              'id:IN' => [1,8]
          ],
          'tpl' => '@INLINE {$pagetitle}',
          'showLog' => 0
      ]}
        koozoo
        20 июля 2018, 02:38
        0
        Решилось добавлением кастомного TV Output с примерно следующим кодом:

        $multiples = explode("||", $value);
        
        foreach ($multiples as $multiple) {
            $o .= 'u' . $multiple . 'u';
        }
        
        return $o;
        Он добавляет 'u' в начало и в конец значения, поэтому можно вызывать через %u____u%
          koozoo
          20 июля 2018, 14:47
          0
          А, нет, не решилось, pdoResources ведь ищет по значениям базы, а не Output. Пока идея только написать плагин, который бы при сохранении документа переписывал значения в нужном формате в отдельный TV и использовать его.
            koozoo
            20 июля 2018, 15:31
            0
            Способ помог:
            — новый TV, который хранит инфу для pdoResources
            — плагин, который срабатывает на OnDocFormSave и конвертит данные в этот TV
            — pdoResources с tvFilter %u____u%
              Dmitry St.
              08 сентября 2018, 08:02
              0
              Решаю похожий вопрос,
              напишите пожалуйста код плагина, который конвертирует данные в ТВ
                Dmitry St.
                08 сентября 2018, 09:06
                0
                Разобрался сам. не актуально.
                не так сложны оказались эти плагины.
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            11