Может кому пригодится еще один способ
перед вызовом компонента каталога пишем.
Код |
---|
//фильтрация по цене товаров со скидкой
$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 со сроком кеширования в несколько часов или дней, кому как лучше. Это удобней чем создавать отдельное свойство, писать в него и по агенту обновлять. У меня товаров было менее сотни и проблем не доставило.