Фильтрация по числовому TV в mFilter2 (where)

Всем здравствуйте!

Не могу понять, в чем я туплю — перепробовал кучу разных вариантов, и ни один не срабатывает как нужно.

Есть товары, у которых бренд задан через TV, в который подгружается список ресурсов. Соответственно, значение этого поля у самого товара — числовое.

В категории выбираю только включенные бренды:
{set $published_brands = '!pdoResources' | snippet : [
    'parents'       => 2,
    'depth'         => 0,
    'limit'         => 0,
    'returnIds'     => 1
]|strToArray}
и далее вызываю сам фильтр:

{'!mFilter2' | snippet : [
    'parents'   => $_modx->resource.id,
    'includeTVs' => 'brand',
    'where'     => '{ "TVbrand.value:IN": $published_brands }'
    'class'     => 'msProduct',
    'element'   => 'msProducts',
    'sortby'    => 'editedon',
    'sortdir'   => 'DESC',
    'limit'     => 18,
...
}
В итоге, в выдачу упорно попадают товары от выключенных брендов. Ни ручная подстановка значений вида [1,2,3] вместо $published_brands, ни вариации с «brand:IN», ничего такое не решает проблему. Подскажите кто-нибудь, пожалуйста, я запутался.
Альберт
11 января 2021, 20:03
modx.pro
566
0

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

Артур Шевченко
11 января 2021, 20:18
+1
если уж используете fenom проще писать через массивы
{'!mFilter2' | snippet : [
    'parents'   => $_modx->resource.id,
    'includeTVs' => 'brand',
    'where'     => ["TVbrand.value:IN" => $published_brands],
    'class'     => 'msProduct',
    'element'   => 'msProducts',
    'sortby'    => 'editedon',
    'sortdir'   => 'DESC',
    'limit'     => 18,
}
А если очень хочется json
'where'     => '{ "TVbrand.value:IN": ' ~ $published_brands~' }'
    Альберт
    11 января 2021, 21:56
    0
    Вот с json почему-то не срабатывало, а с массивом получилось.
    Alexey
    11 января 2021, 20:28
    +1
    А что это за модификатор — strToArray? Переменная $published_brands что возвращает?

    Зы: а, не увидел в условии, что подстановка массива не помогает…
      Alexey
      11 января 2021, 20:44
      +1
      И что возвращает само ТV- поле brand? Может, разделителя нет? Или не тот?
        Артур Шевченко
        11 января 2021, 20:49
        0
        И ещё скорее всего TV.brand:IN вместо TVbrand.value:IN. И ещё $published_brands можно массивом оставить.
          Alexey
          11 января 2021, 21:41
          +1
          Вот такой вариант должен сработать (с массивом в where и модификатором split, который разбивает $published_brands по запятой):

          {set $published_brands = '!pdoResources' | snippet : [
                      'parents'       => 2,
                      'depth'         => 0,
                      'limit'         => 0,
                      'returnIds'     => 1
          ] | split : ','}
          
          {'!mFilter2' | snippet : [
                      'parents'   => $_modx->resource.id,
                      'includeTVs' => 'brand',
                      'where'     => ["TVbrand.value:IN" => $published_brands],
                      'class'     => 'msProduct',
                      'element'   => 'msProducts',            
                      'sortby'    => 'editedon',
                      'sortdir'   => 'DESC',
                      'limit'     => 18
                      ...
                      ]
                  }

          Почему-то JSON не принимает переменную $published_brands. Я сходу не разобрал, как её корректно подставить…
            Альберт
            11 января 2021, 21:55
            0
            Шик! Я просто уже в порядке эксперимента разное пробовал и забыл про split.
            И да, в таком виде — с массивом в where все заработало! Премного благодарен.
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            7