Задача: Вывести фильтр на странице списка товаров, отфильтрованному по бренду или другому свойству.
Проблема: Так как у нас нет определённого раздела — товары выводятся из всего каталога — то мы получим в фильтре все возможные свойства, а нам бы хотелось видеть только тот набор свойств, которые есть у данных товаров.
Решение (Для работы без фасета):
Получаем ID товаров, используя те же параметры фильтрации, что и для основного списка товаров, например так
$arFilteredID = []; $dbRes = CIBlockElement::GetList([], ["IBLOCK_ID" => 10, "PROPERTY_FABRIKA" => $ELEMENT_NAME], false, false, ["ID"]); while($arRes = $dbRes->Fetch()){ $arFilteredID[] = $arRes["ID"]; }
В параметры фильтра добавляем ещё один с массивом ID
"FILTERED_ID" => $arFilteredID
В кастомизированном компоненте фильтра добавляем условие. Добавляется в ту часть, которая работает без фасеточного фильтра (условие $this->facet->isValid() === false).
if(isset($arParams["FILTERED_ID"]) && is_array($arParams["FILTERED_ID"]) && count($arParams["FILTERED_ID"]) > 0){ $arElementFilter["ID"] = $arParams["FILTERED_ID"]; }