Только существующие значения в фильтре Битрикс

В том случае, если у нас на странице есть фильтр элементов инфоблока и есть фильтрация по доп. свойствам, было бы хорошо, если в списках значений доп. свойств выводились только те, которые присутствуют у элементов.

На данный момент существует компонент умного фильтра catalog.smart.filter, разумнее использовать его

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

Реализовать эту задачу можно, скопировав компонент catalog.filter и подправив файл component.php. Рассматривается вариант изменения значений только доп. свойств, с остальными (полями, свойствами предложений, ценами) можно поступить по аналогии.

Находим строку, где начинается цикл по доп. свойствам

foreach($arResult["arrProp"] as $prop_id => $arProp)

и вставляем перед ней код

$arFilter = array(
 'IBLOCK_ID' => CATALOG_IBLOCK_ID,
 'ACTIVE' => 'Y',
 'INCLUDE_SUBSECTIONS' => 'Y'
);
if ($arParams['SECTION_ID']) {
 $arFilter = array_merge($arFilter, array('SECTION_ID' => $arParams['SECTION_ID']));
}
$arGroupBy = array(
 'PROPERTY_BRAND',
 'PROPERTY_CHASSIS',
 'PROPERTY_WHEELS',
 'PROPERTY_BOOM_LENGTH',
 'PROPERTY_CAPACITY'
);
$res = CIBlockElement::GetList(
 array(),
 $arFilter,
 $arGroupBy
);
$arRes = array();
$i = 0;
while ($arElem = $res->Fetch()) {
 if (!empty($arElem['PROPERTY_BRAND_VALUE'])) {
 $arRes['BRAND'][$arElem['PROPERTY_BRAND_VALUE']] = $i;
 }
 if (!empty($arElem['PROPERTY_CHASSIS_VALUE'])) {
 $arRes['CHASSIS'][$arElem['PROPERTY_CHASSIS_VALUE']] = $i;
 }
 if (!empty($arElem['PROPERTY_WHEELS_VALUE'])) {
 $arRes['WHEELS'][$arElem['PROPERTY_WHEELS_VALUE']] = $i;
 }
 if (!empty($arElem['PROPERTY_BOOM_LENGTH_VALUE'])) {
 $arRes['BOOM_LENGTH'][$arElem['PROPERTY_BOOM_LENGTH_VALUE']] = $i;
 }
 if (!empty($arElem['PROPERTY_CAPACITY_VALUE'])) {
 $arRes['CAPACITY'][$arElem['PROPERTY_CAPACITY_VALUE']] = $i;
 }
 $i++;
}

foreach($arResult["arrProp"] as $indexProp => $arItem) {
 foreach($arItem['VALUE_LIST'] as $indexPropValue => $propValue) {
  if(!array_key_exists("HIDDEN", $arItem)) {
   if (!array_key_exists($propValue, $arRes[$arItem['CODE']])) {
    unset($arResult["arrProp"][$indexProp]['VALUE_LIST'][$indexPropValue]);
   }
  }
 }
}

В компонент фильтра необходимо передать параметр SECTION_ID с ID текущего раздела, либо с 0, если мы не находимся ни в одном из разделов.

$arParams['SECTION_ID']

Мы делаем выборку по элементам с группировкой по свойствам

$res = CIBlockElement::GetList(

далее в цикле собираем массив со значениями доп. свойств

while ($arElem = $res->Fetch()) {

и убираем из массива arResult значения доп. свойств, которых нет у элементов

foreach($arResult["arrProp"] as $indexProp => $arItem) {
 foreach($arItem['VALUE_LIST'] as $indexPropValue => $propValue) {
  if(!array_key_exists("HIDDEN", $arItem)) {
   if (!array_key_exists($propValue, $arRes[$arItem['CODE']])) {
    unset($arResult["arrProp"][$indexProp]['VALUE_LIST'][$indexPropValue]);
   }
  }
 }
}

Похожие статьи

Статья оказалась полезной? Вырази благодарность - поделись в соцсетях

Комментирование отключено