Добрый день! Подскажите, пожалуйста, работает ли умный фильтр с ценами со скидками? Нигде не могу найти по этому поводу информации. Или возможно это можно решить с помощью каких-то штатных средств?
На сайте имеется торговый каталог с торговыми предложениями и соответственно сами цены торговых предложений в фильтре отображаются, но скидки не учитываются. Например, в категории товары со скидками отображаются, но в поле минимальной цены в ползунке фильтра отображается базовая цена товара без скидки http://joxi.ru/MAjlYlYuv1Vzlm Заранее спасибо!
Пробовала, что-то придумать в самом шаблоне умного фильтра с этими функциями - достать все цены, найти их скидки и найти минимальную, но не работает
Присоединяюсь к вопросу. Причём если вводить цену в окошке, то она принимается и фильтруется корректно с учётом скидки, но подписи значений так и остаются без скидок
YuliyaKardash написал: Подскажите, пожалуйста, работает ли умный фильтр с ценами со скидками? Нигде не могу найти по этому поводу информации. Или возможно это можно решить с помощью каких-то штатных средств?
Умный фильтр не умеет выводить диапазоны цен с учетом скидок. Это давняя проблема, актуальная и по сей день. Дело в том, что цены и скидки хранятся отдельно. То есть итоговые скидочные цены не хранятся в БД, а вычисляются налету. --- Наиболее простой и удобный способ реализовать данный функционал: - завести вспомогательный тип цен "Цены с учетом скидок" - по крону (серверный планирощик заданий) пересчитывать скидочные цены товаров и заносить во вспомогательную цену - на сайте по прежнему везде использовать основной тип цен - в умном фильтре указать вспомогательный тип цен
Для данного решения потребуется лицензия "Бизнес", тк в "Малом бизнесе" только один тип цен.
http://dermanov.ru/#bx - профессиональная разработка сайтов на Битриксе и консультации --- http://dermanov.ru/hosting/ - хостинг под ключ + оптимизация скорости работы сайта. Для тех, кому надоело, что сайт тормозит.
Марк Дерманов написал: Наиболее простой и удобный способ реализовать данный функционал:- завести вспомогательный тип цен "Цены с учетом скидок"- по крону (серверный планирощик заданий) пересчитывать скидочные цены товаров и заносить во вспомогательную цену- на сайте по прежнему везде использовать основной тип цен- в умном фильтре указать вспомогательный тип ценДля данного решения потребуется лицензия "Бизнес", тк в "Малом бизнесе" только один тип цен.
Можно цену со скидкой писать в свойство и в фильтре выводить цену из свойства.
Роман Семёнов написал: намного легче сохранить в свойство посчитанную цену и использовать стандартный функционал фильтра без кастомизации - чем городить свой компонент
это если 1-2 правила по скидкам, и они меняются раз в 1-3 месяца.А если правил больше 40 , и товаров 20 000 ? Т.е. запускать пересчет цен в свойство каждые полчаса - не вариант.
Может кому пригодится еще один способ перед вызовом компонента каталога пишем.
Код
//фильтрация по цене товаров со скидкой
$ob = CIBlockElement::GetList(
false,
array('IBLOCK_ID' => 18, 'ACTUVE'=>'Y'), // каталог товаров
false,false,
array('IBLOCK_ID','ID','NAME')
);
while($res = $ob->Fetch())
$products[$res['ID']] = $res;
$ob = CIBlockElement::GetList(
false,
array('IBLOCK_ID' => 21), // каталог предложений
false,false,
array('IBLOCK_ID','ID','NAME','PROPERTY_CML2_LINK','ACTIVE')
);
while($res = $ob->Fetch())
{
$Offers[] = $res;
if($products[$res['PROPERTY_CML2_LINK_VALUE']]['OFFERS'][0]['ACTIVE']!='Y')
$products[$res['PROPERTY_CML2_LINK_VALUE']]['OFFERS'][0] = $res;
$products[$res['PROPERTY_CML2_LINK_VALUE']]['OFFERS'][] = $res;
}
foreach($products as $product)
{
if($product['OFFERS'][0])
{
if($product['OFFERS'][0]['ACTIVE']!='Y')continue;
$arPrice = CCatalogProduct::GetOptimalPrice($product['OFFERS'][0]['ID'], 1, $USER->GetUserGroupArray(), 'N');
}
else
{
$arPrice = CCatalogProduct::GetOptimalPrice($product['ID'], 1, $USER->GetUserGroupArray(), 'N');
}
$productDiscauntPrice[$product['ID']] = $arPrice["DISCOUNT_PRICE"];
if(
$_GET['arFilterSection_P1_MIN']
&& $_GET['arFilterSection_P1_MAX']
&& ($arPrice["DISCOUNT_PRICE"] >= $_GET['arFilterSection_P1_MIN'])
&& ($arPrice["DISCOUNT_PRICE"] <= $_GET['arFilterSection_P1_MAX'])
)
// массив id элементов соответствующих ценовому диапазону
$allowedId[] = $product['ID'];
}
// добавляем массив id элеметов к фильтру каталога
global $catalogFilter;
if($allowedId) $catalogFilter['ID'] = $allowedId;
в параметрах компонента каталога добавляем
Код
"FILTER_NAME" => "catalogFilter",
и в шаблоне каталога в section.php после вызова "bitrix:catalog.smart.filter и перед вызовом bitrix:catalog.section добавляем
Код
<?
global $catalogFilter;
unset($catalogFilter["><CATALOG_PRICE_1"]);
?>
Если типов цен больше 1 то придется допиливать. Кто то скажет что куча CCatalogProduct::GetOptimalPrice в цикле это не правильно и будет прав. Для этого можно профильтровать дополнительно в начале по другим параметрам, или можно закешировать $allowedId с помощью \Bitrix\Main\Data\Cache со сроком кеширования в несколько часов или дней, кому как лучше. Это удобней чем создавать отдельное свойство, писать в него и по агенту обновлять. У меня товаров было менее сотни и проблем не доставило.