Быстрая фильтрация detectFilters через класс selectorHelper в 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. Пользователи должны сразу получать отличный функционал, а не только быстро работающую админку!!! Я сразу скажу, что понимаю, что все это трудозатратно...
В одной из следующих статей постараюсь подробнее расписать работу с методами — это тоже трудозатратно.
Ну и хочу напомнить службе заботы о том, что они так и не сделали описание данного метода.
@kibal4iw Мы передали разработчикам задачу описать класс selectorHelper в заявке №136. Как только появится информация, мы вам сразу сообщим.
— UMI.CMS (@umi_cms) 20 мая 2014