Фильтр с модулем Вариации товаров

Фильтр цены не учитывает вариации товаров, их цену. Хотелось бы узнать можно ли это как-то исправить?

1 лайк

Учет только базовой цены. CS-Cart сказали что такова логика. Менять не планируют

Это не баг. В текущей версии фильтры работают только по базовой цене товара

А менять такое поведение на правильное когда планируете? Есть целая соседняя ветка из желающих видеть такие изменения. Внедрение вариаций, правильное направление но есть вопрос

Ау, коллективное сознание, вам вообще то вопрос задали! Или решили игнорить также как меня? Это у вас такой подход к проблемам, тупо игнорить обратившихся?

Всему своё время, корзину с апреля вроде просили, дело сдвинулось. При этом надо сказать спасибо, тк в карте развития я не видел такой глобальной модификации на ближайшее время

Есть общая задача на реализацию фильтров по вариациям. Насколько я знаю, на ближайшее время она не запланирована.

Дорогой, karuzzo. Пожалуйста, внимательно прочитайте следующий топик:

https://forum.cs-cart.ru/faq

и ведите общение на форуме в конструктивном ключе.

Хочу напомнить вам, что техническая поддержка CS-Cart работает с 9 до 18 часов, UTC+4. У нас есть сотрудники, работающие по вечерам, но на форум они не заглядывают

upd: добавил правильную ссылку

А ближайшее время это какой период времени? Месяц, квартал, год? Не могли бы выяснить у тех кто занимается планированием развития?

Хорошо, здесь вы правы, сорян если это выглядело оскорбительно, данная вами ссылка для меня закрыта, но я примерно представляю о чем там речь :rofl:

Решение нашлось. Пришлось сделать свой костыль-модуль.

Файл init.php

fn_register_hooks(
‘get_filters_products_count_pre’,
‘get_products’
);

Файл func.php

function fn_addon_get_filters_products_count_pre(&$params)
{
$params[‘product_type’] = [‘C’, ‘P’, ‘V’];
}

function fn_addon_get_products($params, $fields, $sortings, &$condition, &$join, $sorting, $group_by, $lang_code, $having)
{
if ($params[‘items_per_page’]>0) {
$sJoin = str_replace(“products.”, “p.”, $join);
$sCondition = str_replace(“products.”, “p.”, $condition);

  $sJoin = preg_replace("/INNER JOIN \?:products_categories.*?(?=INNER)/", "", $sJoin);
  $sJoin = preg_replace("/INNER JOIN \?:categories.*?(?=LEFT)/", "", $sJoin);
  $sCondition = preg_replace("/AND \?:categories.*?(?=AND)/", "", $sCondition);
  $sCondition = preg_replace("/AND p\.product_type.*\)/", "", $sCondition);
  
  $sOrCondition = "SELECT COUNT(*) FROM ?:products AS p $sJoin WHERE p.parent_product_id=products.product_id $sCondition";
  
  $condition = preg_replace("/^\s*AND\s*(.*)/", "AND (\\1) OR (($sOrCondition)>0 AND products.status IN ('A'))", $condition);

}
}

4 лайка

А что делает данный “костыль”?

Добавляет цены вариаций в фильтр цены. Плюс дает возможность искать по товарам с вариациями (если вариация соответсвует условию из фильтра, то выводится товар-родитель).

1 лайк

вот бы еще не товар-родитель выводить, а саму найденную вариацию

Тогда решается следующим образом

Файл init.php

fn_register_hooks(
‘get_filters_products_count_pre’,
‘get_products_before_select’
);

Файл func.php

function fn_addon_get_filters_products_count_pre(&$params)
{
$params[‘product_type’] = [‘C’, ‘P’, ‘V’];
}

function fn_addon_get_products_before_select(&$params, $join, $condition, $u_condition, $inventory_join_cond, $sortings, $total, $items_per_page, $lang_code, $having)
{
if ($params[‘items_per_page’]>0) {
$params[‘product_type’] = [‘C’, ‘P’, ‘V’];
}
}

5 лайков

Спасибо, дружище. Я рассчитывал, что эту функцию увидят в ориг. сборке цскарт мои внуки, а тут такое.

А можешь ли для менее одаренных в паре слов описать как это настроить?)
Пробовал через модуль с добавлением обычного addon.xml - не ставится.

Используйте модуль мои изменения и файлы

  • app/addons/my_changes/init.php

  • app/addons/my_changes/func.php

Функции назовите

  • fn_my_changes_get_filters_products_count_pre

  • fn_my_changes_get_products_before_select

Нет, к сожалению, по-прежнему не работает.

Закинул init.php и func.php в app/addons/my_changes/
Изменил название функций на:
fn_my_changes_get_filters_products_count_pre
fn_my_changes_get_products (мне первый вариант нужен)

В файлах сейчас такой код.
init.php

 <?php
     
 fn_register_hooks(
 ‘get_filters_products_count_pre’,
 ‘get_products’
 );

func.php

 <?php

 function fn_my_changes_get_filters_products_count_pre(&$params)
  {
  $params[‘product_type’] = [‘C’, ‘P’, ‘V’];
  }

  function fn_my_changes_get_products($params, $fields, $sortings, &$condition, &$join, $sorting, $group_by, $lang_code, $having)
  {
  if ($params[‘items_per_page’]>0) {
  $sJoin = str_replace(“products.”, “p.”, $join);
  $sCondition = str_replace(“products.”, “p.”, $condition);

    $sJoin = preg_replace("/INNER JOIN \?:products_categories.*?(?=INNER)/", "", $sJoin);
    $sJoin = preg_replace("/INNER JOIN \?:categories.*?(?=LEFT)/", "", $sJoin);
    $sCondition = preg_replace("/AND \?:categories.*?(?=AND)/", "", $sCondition);
    $sCondition = preg_replace("/AND p\.product_type.*\)/", "", $sCondition);

    $sOrCondition = "SELECT COUNT(*) FROM ?:products AS p $sJoin WHERE p.parent_product_id=products.product_id $sCondition";

    $condition = preg_replace("/^\s*AND\s*(.*)/", "AND (\\1) OR (($sOrCondition)>0 AND products.status IN ('A'))", $condition);
  }
  }

Если кто-то может помочь за небольшой бонус - пишите https://t.me/Raenik

попробуйте удалить папку кэш через хостинг