Фильтрация товаров UMI.CMS. Работа с методом detectFilters
Опубликовано: 01.09.2018
Продолжаю экскурс по UMI.CMS. В последний раз я упомянул про класс предоставляющий заказ, либо корзину заказов пользователя . В этой статье хочу упомянуть про класс selectorHelper, и отличный методы detectFilters
К большому сожалению я нигде не нашел упоминаю про этот великолепный метод... Мною он был обнаружен тогда, когда я изучал работу админ панели сайта.
Движок UMI.CMS | Урок #8 - Макросы для работы с разделами, фильтрация по характеристикам
Расположение classes/system/subsystems/selector/helper.php
В по сути работать с методом очень просто.
Для начала в URL страницы нужно передать параметры . Могут быть следующие параметры:
?search-all-text — параметр который сообщает, что нужно искать текст. Передавать можно только строку. ?fields_filter — параметр сообщает, типы фильтруемых полей и значения. Возможна передача массива, для множественного поиска ?order_filter — параметр для сортировки товаров. Возможна передача массива для сортировки по нескольким полямПример URL :
Вебинар от umihelp.ru: углубленный курс по XSLT-шаблонизатору (UMI.CMS)
?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. Пользователи должны сразу получать отличный функционал, а не только быстро работающую админку!!! Я сразу скажу, что понимаю, что все это трудозатратно...
В одной из следующих статей постараюсь подробнее расписать работу с методами — это тоже трудозатратно.
Ну и хочу напомнить службе заботы о том, что они так и не сделали описание данного метода.