Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
monterarty opened this issue Aug 8, 2024 · 5 comments
Labels

Comments

@monterarty
Copy link

Сообщение об ошибке / 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_key IN ('msCategory','msProduct').....

Резюме / Summary

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

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

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

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

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

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

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

Environment

miniShop2 3.0.7

@monterarty monterarty added the bug label Aug 8, 2024
@monterarty
Copy link
Author

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

@webinmd
Copy link
Collaborator

webinmd commented Aug 8, 2024

есть такое решение от 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
Copy link
Contributor

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

@monterarty
Copy link
Author

monterarty commented Aug 28, 2024

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

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

@monterarty
Copy link
Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants