В битриксе использование этого компонента одно из самых болезненных событий. Увы и самому порой приходится "костылить", а еще хуже поддерживать чужие фильтры. И хоть фильтрация одна из самых необходимых вещей на сайте, я особо не разбирался, что внутри. Вот и начал я своё внедрение красивого фильтра с возможностью фильтровать значения чекбоксами. Хорошая возможность немного расширить кругозор.
Сразу оговорюсь, что на сайте несколько свойств либо списки либо привязка к элементу инфоблока.
Когда-то единственный путь, который я видел это создавать в глобальном массиве $GLOBALS свой фильтр по параметрам из $_GET и далее реализовывать свою логику. Это отличный путь, которым следуют многие и для которого и сейчас есть место для существования. Но программист животное ленивое, поэтому лень берет своё и я продолжаю поиски простых решений.
Первым, что стоит отметить фильтрация в catalog.filter не поддерживает такой ход событий, поэтому надо кастомизировать компонент. А второе - кастомизировать необходимо совсем немного.
Итак, кто не знает, я расскажу что делает фильтр:
1. заполняет массивы данных из $_REQUEST-а или $_SESSION
2. делает выборку свойств инфоблока
3. для каждого свойства, в зависимости от его типа, a. формирует html и, что очень важно, б. заполняет глобальный фильтр!
Так вот это одновременное действие и не позволяет работать фильтрации после изменения шаблона компонента, путём добавления чекбоксов вместо того, что формируется самим компонентом. Конечно если бы разработчики подумали заранее и разделили представление от логики, я думаю подобный компонент был куда более эффективным.
В общем, решение очень простое - формирование шаблона делается в template.php, а вот логику можно подкорректировать тут, подставив:
Это одно нехитрое условие необходимо подставить при обработке свойств типа G и L, после чего компонент с радостью отфильтрует множественные значения свойства.
Сразу оговорюсь, что на сайте несколько свойств либо списки либо привязка к элементу инфоблока.
Когда-то единственный путь, который я видел это создавать в глобальном массиве $GLOBALS свой фильтр по параметрам из $_GET и далее реализовывать свою логику. Это отличный путь, которым следуют многие и для которого и сейчас есть место для существования. Но программист животное ленивое, поэтому лень берет своё и я продолжаю поиски простых решений.
Первым, что стоит отметить фильтрация в catalog.filter не поддерживает такой ход событий, поэтому надо кастомизировать компонент. А второе - кастомизировать необходимо совсем немного.
Итак, кто не знает, я расскажу что делает фильтр:
1. заполняет массивы данных из $_REQUEST-а или $_SESSION
2. делает выборку свойств инфоблока
3. для каждого свойства, в зависимости от его типа, a. формирует html и, что очень важно, б. заполняет глобальный фильтр!
if (!is_array($value) && strlen($value) > 0) { ${$FILTER_NAME}["PROPERTY"][$arProp["CODE"]] = $value; } |
Так вот это одновременное действие и не позволяет работать фильтрации после изменения шаблона компонента, путём добавления чекбоксов вместо того, что формируется самим компонентом. Конечно если бы разработчики подумали заранее и разделили представление от логики, я думаю подобный компонент был куда более эффективным.
В общем, решение очень простое - формирование шаблона делается в template.php, а вот логику можно подкорректировать тут, подставив:
if ((!is_array($value) && strlen($value) > 0) || (is_array($value) && count($value) > 0)) { ${$FILTER_NAME}["PROPERTY"][$arProp["CODE"]] = $value; } |