Методы фильтрации
mFilter2 может фильтровать информацию из любых таблиц, главное, чтобы вы описали, как её получить.
Для этого предусмотрена возможность расширения класса фильтрации, который находится в /core/components/msearch2/model/msearch2/filters.class.php
через системную настройку mse2_filters_handler_class.
Для расширения стандартного класса, вам нужно создать новый файл в директории /core/components/msearch2/custom/filters/
с именем имя.class.php
и унаследовать mse2FiltersHandler.
<?php
class myCustomFilter extends mse2FiltersHandler {
// Здесь можно переопределить методы родительского класса, или создать собственные
}
Всего есть 3 типа методов:
- Получение информации для фильтрации - методы get
Имя
Values. - Приготовление фильтров для вывода - методы build
Имя
Filter. - Собственно, проведение фильтрации по параметру - методы filter
Имя
.
Эти методы обрабатывают значения, указанные в параметре &filters. Например:
&filters=`
resource|parent:categories,
resource|template:default,
ms|price:number,
tv|myname:default,
msoption|size:default
`
Первое слово - кодовое имя метода для выборки данных из таблиц. Если указан resource, то будет вызван getResourceValues, если ms, то getMsValues, и т.д.
Второе слово - это поле, которое выбирается. Для одной таблицы можно указывать несколько полей, главное, чтобы они существовали в ней.
Третье слово - это имя применяемого метода для построения фильтра, и самой фильтрации. Если указано default, то будут вызваны buildDefaultFilter и filterDefault, если number, то buildNumberFilter и filterNumber и т.д.
Таким образом, у нас получаются стандартные методы класса фильтрации
Метод | Имя в &filters | Что делает |
---|---|---|
getResourceValues | resource | Выбирает данные для указанных полей ресурса |
getTvValues | tv | Выбирает данные для указанных ТВ параметров |
getMsValues | ms | Выбирает данные для для указанных полей товара MS2 |
getMsOptionValues | msoption | Выбирает данные из специальной таблицы JSON полей товара MS2 |
buildDefaultFilter | default | Строит фильтр по умолчанию, состоящий их чекбоксов |
buildNumberFilter | number | Строит фильтр для чисел, который можно вывести в виде слайдера |
buildVendorsFilter | vendors | Строит фильтр, в котором значениями являются имена производителей товаров MS2. Можно применять только к полю vendor `ms |
buildBooleanFilter | boolean | Строит фильтр для булевых значений. Нужен для того, чтобы вместо 0 и 1 вы видели "Да" и "Нет". |
buildParentsFilter | parents | Строит фильтр, в котором выбираются и показываются два родителя ресурса. Можно применять только к полю parent `resource |
buildCategoriesFilter | categories | Строит фильтр, в котором выбирается и показывается один родитель ресурса. Можно применять только к полю parent `resource |
buildGrandParentsFilter | grandparents | Строит фильтр, в котором выбираются и показываются второй родитель ресурса. Можно применять только к полю parent `resource |
buildFullnameFilter | fullname | Строит фильтр, в котором выбираются и показываются полные имена пользователей. Можно применять только к id юзера, например `resource |
buildYearFilter | year | Строит фильтр, в котором показывается год, например `resource |
filterDefault | default | Обычная фильтрация, работает по умолчанию, если нет специального метода. |
filterGrandParents | grandparents | Специальная фильтрация по второму родителю (дедушке ресурса). |
filterNumber | number | Специальная фильтрация по диапазонам числовых значений. |
filterYear | year | Специальная фильтрация по дате. |
Вы можете переопределить любой из этих методов, или создать свой.
Возвращаемые значения
Первый тип методов должен возвращать такой массив значений:
Array (
[ИмяПоля 1] => array(
[Значение1] => array(
[0] => id подходящего ресурса
[1] => id подходящего ресурса
[2] => id подходящего ресурса
),
),
)
Например, вызываем
&filters=`resource|parent:parents,resource|template:default`
и метод getResourceValues возвращает примерно такой массив:
Array (
[parent] => array(
[0] => array(
[0] => 1
[1] => 2
)
[2] => array(
[0] => 5
)
)
[template] => array(
[1] => array(
[0] => 1
[1] => 2
[2] => 3
),
)
)
Второй тип методов возвращает массив для вывода фильтров пользователю. Формат у него такой:
Array (
[ИмяФильтра] => Array (
[title] => ИмяФильтра
[value] => значение позиции фильтра
[type] => необязательное поле с типом фильтра
[resources] => Array (
[0] => id подходящего ресурса
[1] => id подходящего ресурса
[2] => id подходящего ресурса
)
)
)
Например, вызываем
&filters=`resource|parent:categories`
и метод getResourceValues возвращает примерно такой массив:
Array (
[Tickets] => Array (
[title] => Tickets
[value] => 71
[type] => parents
[resources] => Array (
[0] => 72
[1] => 73
[2] => 74
)
)
[mSearch2] => Array (
[title] => mSearch2
[value] => 62
[type] => parents
[resources] => Array (
[0] => 63
[1] => 64
)
)
)
Ну а третий тип методов должен принять 3 массива:
- Массив с запрошенными значениями
- Массив имеющихся значений, где ключами являются значения фильтров, а значениями - подходящие ресурсы
- Текущий массив результатов
Например, если мы фильтруем по родителю, то в первом массиве придут id требуемых родителей:
Array (
[0] => 71
)
Во-втором придёт массив имеющихся родителей с их ресурсами:
Array (
[71] => Array (
[0] => 72
[1] => 73
[2] => 74
)
)
А в третьем придут id ресурсов, которые еще участвуют в фильтрации и не были исключены другими фильтрами:
Array (
[0] => 72
[1] => 73
[2] => 74
[3] => 75
[4] => 76
)
Мы должны сравнить первый массив с ключами второго и значениями третьего, после чего вернуть массив ресурсов, которые прошли проверку. Этот массив попадёт или в другой фильтр, если он есть, или будет отдан mFilter2 для вывода отфильтрованных ресурсов.
Таким образом, пользователь увидит только те результаты, которые прошли все фильтры.