Понадобилось мне на днях сделать фильтр шин и дисков на очередном проекте, но к сожалению в стандартном фильтре Битрикса свойство "Привязка элементов в виде списка" не работает и вместо выпадающего списка
Наглядно, что будем реализовывать:
Рис. 1
Видим, что первый фильтр - это стандартный фильтр
Решение:
Итак, копируем стандартный компонент Битрикса
Теперь нужно поправить файл
Далее все правки в файле компонента
Открываем его для редактирования, переходим к (у меня 301 строка) к коду, где в условии получаем значения свойства типа Список "L".
Вот после этого условия в 301 строке и будем добывать значения свойства "Привязка элементов в виде списка" (см. 314 строка).
Т.к. метод
то нам нужно получить
Как их будем получать?
Печатаем массив
Здесь мы видим ключ
Поэтому, просто получаем список элементов (производителей) инфоблока и подставляем их
Далее, идем ниже по коду, ищем где у нас формируется html селектов, инпутов и прочего для свойства типа "E", находим в строке 480
Вот и все! Надеюсь не забыл ничего.
Теперь фильтр будет работать и фильтровать не только по свойству "Привязка элементов в виде списка", но и возможно по всем другим свойствам привязки к элементам, я просто пока не тестировал с другими свойствами.
В фильтр теперь будут подставлены
где,
Код работает потому что, если обратиться к API документации Битрикс, в которой фильтр по свойствам типа "Список" описан таким образом:
PROPERTY_<PROPERTY_CODE> - фильтр по значениям свойств, где PROPERTY_CODE - код свойства или мнемонический код. Для свойств типа "Список", "Число", "Привязка к элементам" и "Привязка к разделам" - Число. Для прочих - Маска;
Соответственно, если распечать массив
что нам и требовалось.
<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. Ну и возможность фильтровать по свойству "Привязка элементов в виде списка", описанная в этой статье.
Компонент на Маркетплейс |
http://marketplace.1c-bitrix.ru/solutions/api.searchfilter/ |
Похожие статьи
Фильтр по дате активности 14.11.2016