Методы фильтрации

21 августа 2017, 18:14

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 типа методов:

  1. Получение информации для фильтрации - методы getИмяValues.
  2. Приготовление фильтров для вывода - методы buildИмяFilter.
  3. Собственно, проведение фильтрации по параметру - методы 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|vendor:vendors.
buildBooleanFilter boolean Строит фильтр для булевых значений. Нужен для того, чтобы вместо 0 и 1 вы видели "Да" и "Нет".
buildParentsFilter parents Строит фильтр, в котором выбираются и показываются два родителя ресурса. Можно применять только к полю parent resource|parent:parents.
buildCategoriesFilter categories Строит фильтр, в котором выбирается и показывается один родитель ресурса. Можно применять только к полю parent resource|parent:categories.
buildGrandParentsFilter grandparents Строит фильтр, в котором выбираются и показываются второй родитель ресурса. Можно применять только к полю parent resource|parent:grandparents.
buildFullnameFilter fullname Строит фильтр, в котором выбираются и показываются полные имена пользователей. Можно применять только к id юзера, например resource|createdby:fullname.
buildYearFilter year Строит фильтр, в котором показывается год, например resource|createdon:year.
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 для вывода отфильтрованных ресурсов.

Таким образом, пользователь увидит только те результаты, которые прошли все фильтры.


Наверх, в раздел
Расширение
Следующий документ
Пример фильтрации товаров