Часто встречаюсь с задачей, когда необходимо отфильтровать не только товары по свойствам их товарных предложений, но и фильтровать сами предложения и выводить для товара только те, которые удовлетворяют фильтру. Я решил этот вопрос переопределением(через extends, а не модификаций ядра) метода GetOffersArray системного класса CIBlockPriceTools.
[spoiler]
...
if (!empty($arFilter) && is_array($arFilter))
{
if (isset($arFilter['IBLOCK_ID']))
$IBLOCK_ID = $arFilter['IBLOCK_ID'];
if (isset($arFilter['HIDE_NOT_AVAILABLE']))
$boolHideNotAvailable = 'Y' === $arFilter['HIDE_NOT_AVAILABLE'];
if (isset($arFilter['CHECK_PERMISSIONS']))
$boolCheckPermissions = 'Y' === $arFilter['CHECK_PERMISSIONS'];
}
else
{
$IBLOCK_ID = $arFilter;
}
//новые строки
unset($arFilter['IBLOCK_ID']); unset($arFilter['HIDE_NOT_AVAILABLE']); unset($arFilter['CHECK_PERMISSIONS']); $arrFilter = $arFilter;
//конец новых строк
$arOffersIBlock = CIBlockPriceTools::GetOffersIBlock($IBLOCK_ID);
if($arOffersIBlock)
{
...
...
//в GetList делаем merge.
$rsOffers = CIBlockElement::GetList($arOrder, array_merge($arFilter,$arrFilter), false, false, array_keys($arSelect));
...
|