Быстрая фильтрация detectFilters через класс selectorHelper в UMI.CMS

Быстрая фильтрация detectFilters через класс selectorHelper в UMI.CMS. Как фильтровать товары и объекты в UMI.CMS

Продолжаю экскурс по UMI.CMS. В последний раз я упомянул про класс предоставляющий заказ, либо корзину заказов пользователя. В этой статье хочу упомянуть про класс selectorHelper, и отличный методы detectFilters

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

Расположение classes/system/subsystems/selector/helper.php

В по сути работать с методом очень просто.

Для начала в URL страницы нужно передать параметры. Могут быть следующие параметры:

  • ?search-all-text — параметр который сообщает, что нужно искать текст. Передавать можно только строку.
  • ?fields_filter — параметр сообщает, типы фильтруемых полей и значения. Возможна передача массива, для множественного поиска
  • ?order_filter — параметр для сортировки товаров. Возможна передача массива для сортировки по нескольким полям

Пример URL:

  • ?search-all-text=текст для поиска
  • ?fields_filter[price][0]=8&fields_filter[price][1]=500&fields_filter[nalichie_kamnej][eq][]=6513
  • ?order_filter[price]=desc

Пояснение к URL fields_filter.

Если вам нужно искать по диапазону от-до (может быть цена или например вес), то нужно передать в параметр название поля и id 0 и 1, которые обозначают диапазон:

  • От fields_filter[price][0]=8
  • До fields_filter[price][1]=500

Если нужно искать точное соответствие:

  • fields_filter[nalichie_kamnej][eq][]=6513

Есть еще несколько параметров (с ними мне еще ну удалось поработать):

  • 'ne' => 'notequals',
  • 'like' => 'like',
  • 'gt' => 'more',
  • 'lt' => 'less'

Пояснение к URL order_filter:

Тут все очень просто:

  • order_filter[price]=asc — по возрастанию
  • order_filter[price]=desc — по убыванию

Теперь, чтобы выборка сработала, вам нужно запустить метод selectorHelper::detectOrderFilters ($sel). Напоминаю, UMI.CMS уже самостоятельно делает выборку и фильтрацию, вам нужно только вызвать метод.

public function getAllFiltredObjects() {
	$hierarchy = umiHierarchy::getInstance();

	$sel = new selector('pages');
	$sel->types('hierarchy-type')->name('catalog', 'object');

	selectorHelper::detectOrderFilters($sel);

	// Отрисовать элементы
	$lines = Array();
	foreach ($sel->result as $item){
		$element = $hierarchy->getElement($item->id);

		$arr['attribute:id'] = $item->id;
		$arr['attribute:link'] = $item->link;
		$arr['name'] = $element->name;

		$lines['nodes:item'][] = $arr;
	}
	return array(
		"items" => $lines,
	);
}

Не могу не упомянуть про производительность. 

Связка UMI Selector + detectFilters это что-то. Мною было протестировано порядка 15 тыс. товаров с различными фильтрами. Все работает очень и очень быстро.

Если честно, на месте разработчиков UMI я бы отказался от всех устаревших getObjectList и переписал бы все методы, которые используются на fron-end. Пользователи должны сразу получать отличный функционал, а не только быстро работающую админку!!! Я сразу скажу, что понимаю, что все это трудозатратно...

В одной из следующих статей постараюсь подробнее расписать работу с методами — это тоже трудозатратно.

Ну и хочу напомнить службе заботы о том, что они так и не сделали описание данного метода.