modx-pro / miniShop2

Second version of simple online shop for MODX Revolution
GNU General Public License v2.0
150 stars 128 forks source link

Если в msProducts в where указать class_key:IN - правило добавляется но не работает #923

Open monterarty opened 2 months ago

monterarty commented 2 months ago

Сообщение об ошибке / Error message

Если в msProducts в where указать class_key:IN - правило добавляется но не работает, например

{set $resources = 'msProducts' | snippet :[
      'parent' => $params.resource,
      'where' => [
        'class_key:IN' => ['msCategory','msProduct'],
        'product_hide_catalog!=' => 1
      ],
      'sortby' => [
        'menuindex' => 'ASC',
      ]
]}

Поскольку теперь ключом массива является class_key:IN а по умолчанию msProducts заполняет ключ в where class_key (30-33 строки сниппета msProducts)

// Start build "where" expression
$where = array(
    'class_key' => 'msProduct',
);

Получаем условие WHERE (msProduct.class_key= 'msProduct' ANDmsProduct.class_keyIN ('msCategory','msProduct').....

Резюме / Summary

Не получается вывести в одном вызове сниппета сразу и категории и товары

Шаг для воспроизведения / Step to play

указать в параметрах 'where' => ['class_key:IN' => ['msCategory','msProduct']]

Наблюдаемое поведение / Observed behavior

Выводятся только товары

Ожидаемое поведение / Expected behavior

Выводятся и категории и товары

Environment

miniShop2 3.0.7

monterarty commented 2 months ago

Пока вкрутил вот такой костыль, и это работает как надо, но там ведь могут быть и другие условия, наверно нужна более сложная проверка наличия ключей, чтобы затрагивало LIKE, IN, != и др if (!array_key_exists('class_key:IN', $scriptProperties['where'])) { $where = array( 'class_key' => 'msProduct', ); }

webinmd commented 2 months ago

есть такое решение от 2013 года

[[!msProducts?
    &class=`msCategory`
    &parents=`2`
    &where=`{"class_key":"msCategory"}`
    &tpl=`tpl.Products.category_light`
    &tplOdd=`tpl.Products.category_dark`
    &select=`{
        "msCategory":"*"
        ,"msProduct":"msProduct.id as product_id, msProduct.uri as product_uri, msProduct.pagetitle as product_pagetitle"
        ,"msProductData":"*"
        ,"500x500":"500x500.url as 500x500"
    }`
    &innerJoin=`{
        "msProduct": {"class":"msProduct", "alias":"msProduct", "on":"msProduct.parent = msCategory.id AND msProduct.class_key = 'msProduct'"}
        ,"msProductData": {"class":"msProductData", "alias":"msProductData", "on":"msProduct.id = msProductData.id"}
    }`
    &leftJoin=`{
        "500x500": {"class":"msProductFile","alias":"500x500", "on": "500x500.product_id = msProduct.id AND 500x500.path LIKE '%/500x500/' AND 500x500.rank=0"}
    }`
    &sortby=`msCategory.menuindex`
    &sortdir=`asc`
    &showLog=`1`
]]

https://bezumkin.ru/topics/16d7ec84-6448-4a58-8b72-d9c7c082f8d1

Также можно использовать pdoResources с leftJoin и указанием class = msProduct

А сам сниппет msProducts предназначен для вывода товаров, поэтому не считаю описанное поведение ошибкой

Electrica commented 2 months ago

А зачем в сниппете который выводит ТОВАРЫ пытаться засунуть вывод КАТЕГОРИИ? В чем практический смысл?

monterarty commented 1 month ago

@Electrica Практический смысл что это работает кратно быстрее чем pdoResources и иногда хочется вывести ТОВАРЫ по КАТЕГОРИЯМ одним запросом, а не делать вызов pdoResources внутри чанка которого будет вызов msProducts для вывода продуктов таким образом получаем количество вызовов msProducts равное количеству категорий, а в решении выше - один вызов и все

Далее вывод в формате json и уже через fenom это все распределяешь как удобно

monterarty commented 1 month ago

@webinmd смысл вывести и категории и товары в одном запросе. Если сделать запрос только по категориям то там и без leftjoin работает все