msProducts - как получить массив с данными для дальнейшей выборки?

Здравствуйте!
Мне нужно сделать карусель товаров, которая имеет два блока: т.е. в верстке сначала выводится блок с картинками, а потом еще один блок с описаниями и характеристиками.
Два раза запускать [[!msProducts]] не хочется, поэтому решил сделать через fenom:
{set $items = '!msProducts' | snippet : [
    'parents' => 2,
   ....
]}

{foreach $items as $item}
    ...
{/foreach}
Но так, почему-то не работает — т.е. foreach не понимает массив $items… что делать?
Игорь
28 июля 2020, 18:25
modx.pro
212
0

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

Михаил
28 июля 2020, 18:55
0
А можно написать без tpl и выведет массив.
Или скопировать сниппет и вот тут:
github.com/bezumkin/miniShop2/blob/master/core/components/minishop2/elements/snippets/snippet.ms_products.php#L241
вывести массив а не в чанк пихать
    Игорь
    28 июля 2020, 20:42
    0
    я ничего в чанк и не пихаю… хочу получить массив с данными
      Михаил
      28 июля 2020, 21:23
      0
      укажи &tpl=`` и выведет массив
        Игорь
        28 июля 2020, 22:01
        0
        мысль интересная… но не понятная
        … нашел подобную тему на форуме — но там ответа так и не дали modx.pro/help/19613
    Баха Волков
    28 июля 2020, 20:30
    0
    Но так, почему-то не работает — т.е. foreach не понимает массив $items… что делать?
    С чего бы ему быть массивом, если сниппет возвращает строку
      Игорь
      28 июля 2020, 20:42
      0
      а как быть?
      Артем
      28 июля 2020, 21:26
      0
        Игорь
        28 июля 2020, 21:52
        0
        ?… а что плейсхолдер это разве массив?
          Артем
          28 июля 2020, 22:19
          0
          Плейсхолдер может быть любым типом данных, но msProducts выставляет в него распарсенный шаблон, да, только что проверил.

          Собственно, можно было бы воспользоваться общим параметром &return, выставив json, но в msProducts есть такая строка:
          'return' => !empty($returnIds)
                  ? 'ids'
                  : 'data',
          Это значит, что из сниппета можно вернуть либо список id, либо распарсенный шаблон (строку).
          Отсюда простой вывод: если нужен массив, то используй pdoResources в связке с 'return' => 'json'.
            Игорь
            28 июля 2020, 22:33
            0
            не очень понял — т.е. нельзя из msProducts данные в массив загнать?
            А если использовать pdoResources, то как мне от-туда миниатюры minishop получить, например?
              Артем
              28 июля 2020, 22:43
              0
              т.е. нельзя из msProducts данные в массив загнать?
              Нельзя.

              как мне от-туда миниатюры minishop получить, например?
              Открыть сниппет msProducts, написать в поиске includeThumbs, а затем продублировать подобную выборку в pdoResources.
              Если не нравится такое решение, то можно вызывать msProducts дважды, вряд ли это радикально повлияет на производительность, особенно в рамках карусели, где редко бывает больше 10-20 товаров.
              Либо можно написать свою собственную выборку в новом сниппете, с помощью pdoFetch.
              Либо на худой конец скопировать msProducts и убрать обработку чанка.
                Игорь
                28 июля 2020, 22:50
                0
                да, видимо придется дважды msProducts вызывать (в принципе, не критично, конечно)… про переделать сниппет msProducts, кстати, тоже хорошая мысль — но это лучше с утра, на свежую голову смотреть (пока не особо представляю как это)…
                Спасибо.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        12