Неожиданное поведение фильтра в Битрикс: как мы решили проблему сортировки

О проекте

Поступил запрос от клиента: в каталоге товаров фильтры свойств (как товаров, так и торговых предложений) выводятся не в том порядке, который был задан в настройках(поле SORT). Вместо этого сначала отображались свойства товаров, а уже ниже — свойства торговых предложений.

Анализ кода компонента

Первым делом заглянули в ядро Битрикса, чтобы разобраться, как работает стандартный компонент фильтрации( bitrix/components/bitrix/catalog.smart.filter/class.php ). Оказалось, что:

  • Множественные запросы к базе данных метода CIBlockProperty::GetByID() выполнялся на каждой итерации, что приводило к 30 дополнительным запросам при наличии 30 свойств(легко посчитать маштаб Морти)
  • Отсутствие сортировки – финальный набор параметров не учитывал заданную сортировку, из-за чего свойства выводились в непредсказуемом порядке.

Решение

Мы решили проблему следующим образом:

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

Итог

После доработки фильтр стал работать корректно: свойства товаров и торговых предложений теперь сортируются так, как задумано, без лишних запросов. Клиент остался доволен, а мы — еще раз убедились, что иногда стандартные решения требуют тонкой шрифовки.

Вывод

Если столкнулись с подобной проблемой — не спешите переписывать компонент с нуля. Иногда достаточно небольшой доработки, чтобы заработало как надо.

Технологии

bitix
bitrix24
slide-1