Skip to content
  1. Компоненты
  2. mSearch2
  3. Расширение
  4. Методы фильтрации

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

mFilter2 может фильтровать информацию из любых таблиц, главное, чтобы вы описали, как её получить.

Для этого предусмотрена возможность расширения класса фильтрации, который находится в /core/components/msearch2/model/msearch2/filters.class.php через системную настройку mse2_filters_handler_class.

Для расширения стандартного класса, вам нужно создать новый файл в директории /core/components/msearch2/custom/filters/ с именем имя.class.php и унаследовать mse2FiltersHandler.

php
<?php
class myCustomFilter extends mse2FiltersHandler {
  // Здесь можно переопределить методы родительского класса, или создать собственные
}

Всего есть 3 типа методов:

  1. Получение информации для фильтрации - методы getИмяValues.
  2. Приготовление фильтров для вывода - методы buildИмяFilter.
  3. Собственно, проведение фильтрации по параметру - методы filterИмя.

Эти методы обрабатывают значения, указанные в параметре &filters. Например:

modx
&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Что делает
getResourceValuesresourceВыбирает данные для указанных полей ресурса
getTvValuestvВыбирает данные для указанных ТВ параметров
getMsValuesmsВыбирает данные для для указанных полей товара MS2
getMsOptionValuesmsoptionВыбирает данные из специальной таблицы JSON полей товара MS2
buildDefaultFilterdefaultСтроит фильтр по умолчанию, состоящий их чекбоксов
buildNumberFilternumberСтроит фильтр для чисел, который можно вывести в виде слайдера
buildVendorsFiltervendorsСтроит фильтр, в котором значениями являются имена производителей товаров MS2. Можно применять только к полю vendor `ms
buildBooleanFilterbooleanСтроит фильтр для булевых значений. Нужен для того, чтобы вместо 0 и 1 вы видели "Да" и "Нет".
buildParentsFilterparentsСтроит фильтр, в котором выбираются и показываются два родителя ресурса. Можно применять только к полю parent `resource
buildCategoriesFiltercategoriesСтроит фильтр, в котором выбирается и показывается один родитель ресурса. Можно применять только к полю parent `resource
buildGrandParentsFiltergrandparentsСтроит фильтр, в котором выбираются и показываются второй родитель ресурса. Можно применять только к полю parent `resource
buildFullnameFilterfullnameСтроит фильтр, в котором выбираются и показываются полные имена пользователей. Можно применять только к id юзера, например `resource
buildYearFilteryearСтроит фильтр, в котором показывается год, например `resource
filterDefaultdefaultОбычная фильтрация, работает по умолчанию, если нет специального метода.
filterGrandParentsgrandparentsСпециальная фильтрация по второму родителю (дедушке ресурса).
filterNumbernumberСпециальная фильтрация по диапазонам числовых значений.
filterYearyearСпециальная фильтрация по дате.

Вы можете переопределить любой из этих методов, или создать свой.

Возвращаемые значения

Первый тип методов должен возвращать такой массив значений:

php
Array (
  [ИмяПоля 1] => array(
    [Значение1] => array(
      [0] => id подходящего ресурса
      [1] => id подходящего ресурса
      [2] => id подходящего ресурса
    ),
  ),
)

Например, вызываем

php
&filters=`resource|parent:parents,resource|template:default`

и метод getResourceValues возвращает примерно такой массив:

php
Array (
  [parent] => array(
    [0] => array(
      [0] => 1
      [1] => 2
    )
    [2] => array(
      [0] => 5
    )
  )
  [template] => array(
    [1] => array(
      [0] => 1
      [1] => 2
      [2] => 3
    ),
  )
)

Второй тип методов возвращает массив для вывода фильтров пользователю. Формат у него такой:

php
Array (
  [ИмяФильтра] => Array (
    [title] => ИмяФильтра
    [value] => значение позиции фильтра
    [type] => необязательное поле с типом фильтра
    [resources] => Array (
      [0] => id подходящего ресурса
      [1] => id подходящего ресурса
      [2] => id подходящего ресурса
    )
  )
)

Например, вызываем

modx
&filters=`resource|parent:categories`

и метод getResourceValues возвращает примерно такой массив:

php
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 требуемых родителей:

php
Array (
  [0] => 71
)

Во-втором придёт массив имеющихся родителей с их ресурсами:

php
Array (
  [71] => Array (
    [0] => 72
    [1] => 73
    [2] => 74
  )
)

А в третьем придут id ресурсов, которые еще участвуют в фильтрации и не были исключены другими фильтрами:

php
Array (
  [0] => 72
  [1] => 73
  [2] => 74
  [3] => 75
  [4] => 76
)

Мы должны сравнить первый массив с ключами второго и значениями третьего, после чего вернуть массив ресурсов, которые прошли проверку. Этот массив попадёт или в другой фильтр, если он есть, или будет отдан mFilter2 для вывода отфильтрованных ресурсов.

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