Понадобилось мне на днях сделать фильтр шин и дисков на очередном проекте, но к сожалению в стандартном фильтре Битрикса свойство "Привязка элементов в виде списка" не работает и вместо выпадающего списка <select>...</select>, выводится текстовое поле <input type="text">, а т.к. это привязка к производителям (элементам другого инфоблока) и нам нужен именно выпадающий список производителей, значит будем править сам компонент, заодно узнаем получше, как взаимодействует битрикс инфоблоки и простой фильтр битрикс.

Наглядно, что будем реализовывать:

Фильтр по свойству "Привязка элементов в виде списка" Битрикс

Рис. 1

Видим, что первый фильтр - это стандартный фильтр catalog.filter, а ниже готовое решение проблемы - search.filter.


Решение:

Итак, копируем стандартный компонент Битрикса catalog.filter в ваше пространство имен и переименовываем под себя, например так:
/bitrix/components/api/search.filter

Теперь нужно поправить файл /search.filter/description.php так, чтобы он находился в вашей папке в дереве компонентов визуального редактора Битрикс, иначе потом он может путать Вас, если оставить по умолчанию.

Далее все правки в файле компонента /search.filter/component.php.

Открываем его для редактирования, переходим к (у меня 301 строка) к коду, где в условии получаем значения свойства типа Список "L".

Вот после этого условия в 301 строке и будем добывать значения свойства "Привязка элементов в виде списка" (см. 314 строка).

Фильтр по свойству "Привязка элементов в виде списка" Битрикс

Рис. 2

Т.к. метод  CIBlockProperty::GetPropertyEnum() для свойства типа "E" нам ничего не выводит,
то нам нужно получить ID и NAME элементов этого инфоблока, к которому привязаны.

Как их будем получать?

Печатаем массив fb($arProp); описывающий свойство "Привязка элементов в виде списка" - 316 строка (на скрине нет) в условии:
 if ($arProp['PROPERTY_TYPE'] == 'E') { fb($arProp); }

Фильтр по свойству "Привязка элементов в виде списка" Битрикс

Рис. 3

Здесь мы видим ключ LINK_IBLOCK_ID значение которого и есть ID нужного нам битрикс инфоблока.
Поэтому, просто получаем список элементов (производителей) инфоблока и подставляем их ID и NAME в общий массив, чтобы обработать ниже по коду (строка 320, рис. 2) или код ниже.
 if ($arProp['PROPERTY_TYPE'] == 'E'){ $arrEnum = array(); if(!empty($arProp['LINK_IBLOCK_ID'])) { //EXECUTE ELEMENT $rsElement = CIBlockElement::GetList(array('NAME'=>'ASC','SORT'=>'ASC'), array('IBLOCK_ID' => $arProp['LINK_IBLOCK_ID']), false, false, array('ID','NAME')); while( $arElement = $rsElement->GetNext() ) { $arrEnum[$arElement['ID']] = $arElement['NAME']; } } $arTemp['VALUE_LIST'] = $arrEnum;}

Далее, идем ниже по коду, ищем где у нас формируется html селектов, инпутов и прочего для свойства типа "E", находим в строке 480 switch(){..}, в котором все это дело делается, далее в строке 544 видим case 'E': , который как раз нам нужно перенести в самое начало свитча, где формируется тег <select>...</select> - рис.4:

Фильтр по свойству "Привязка элементов в виде списка" Битрикс

Рис. 4


Вот и все! Надеюсь не забыл ничего.

Теперь фильтр будет работать и фильтровать не только по свойству "Привязка элементов в виде списка", но и возможно по всем другим свойствам привязки к элементам, я просто пока не тестировал с другими свойствами.
В фильтр теперь будут  подставлены ID элемента, в адресной строке задействованный фильтр выглядит так:

arrFilter_pf[VENDOR]=18

где, VENDOR - код свойства, а 18 - ID производителя (элемента инфоблока).

Код работает потому что, если обратиться к API  документации Битрикс, в которой фильтр по свойствам типа "Список" описан таким образом:


PROPERTY_<PROPERTY_CODE> - фильтр по значениям свойств, где PROPERTY_CODE - код свойства или мнемонический код. Для свойств типа "Список", "Число", "Привязка к элементам" и "Привязка к разделам"  - Число. Для прочих - Маска;


Соответственно, если распечать массив $arrFilter в коде компонента catalog.section в момент, когда задействован сам фильтр, то мы увидим, что складывается фильтр так:

PROPERTY[VENDOR] = 18

что нам и требовалось.

Что изменилось в этом компоненте:

1. Добавлен параметр - Каталог для отправки данных.
Указывается в настройках компонента директория, в которую должен перенаправлять компонент, по умолчанию перенаправляет в текущую, что неудобно, когда фильтр на сайте на всех страницах, а фильтровать должен только на указанных.

2. Ну и возможность фильтровать по свойству "Привязка элементов в виде списка", описанная в этой статье.


Вернуться в список