simpleFilters - простая фильтрация для MODX3
Всем привет!
Пока мы ждём нового mFilter для MODX3 (который обещает быть ого-го), предлагаю вниманию уважаемого сообщества более простое решение здесь и сейчас ).
Пакет устанавливается стандартным образом из репозитория.
&where поддерживает один параметр/значение.
Работает только к таблицами ресурса MODX и продукта MiniShop3 (поля указываются без префиксов, как в базе).
Вывод новинок:
Вывод товаров с ценой больше 2000:
Вывод ресурсов со словом «скидка» в longtitle:
В чанках по умолчанию используется Fenom (требуется наличие pdoTools), но поддерживается и стандартный синтаксис
Для этого нужно указать параметры в виде &tplFilter_параметр и &tplFilterRow_параметр.
Например, если требуется для фильтра по тегам (ms_tags) какое-то своё оформление, создайте соответствующие чанки и укажите в вызове:
Названия блоков фильтров задаются через лексиконы в формате sf_filter_фильтр (также можно менять в плагине на событие sfOnBeforeCreateFilter).
Пока мы ждём нового mFilter для MODX3 (который обещает быть ого-го), предлагаю вниманию уважаемого сообщества более простое решение здесь и сейчас ).
Основные свойства
- Поддержка полей ресурсов, TV и MIGX полей, а также полей и опций товаров MiniShop3.
- Четыре типа фильтров: чекбокс, радиокнопка, выпадающий список, слайдер для числовых значений (на основе noUiSlider).
- Пагинация (постраничная и кнопкой «Загрузить ещё»).
- Настраиваемая сортировка и выбор количества на страницу.
- Работает как в логике AND, так и OR (настраивается).
- Системные события для тонкой настройки (тексты фильтров, значения, сортировка полей и т. д.).
- Для работы не требуется jQuery.
Системные настройки
- sf_css_path — путь к JS-файлу, по умолчанию {assets_url}components/simplefilters/js/web/default.min.js
- sf_css_path — путь к CSS-файлу, по умолчанию {assets_url}components/simplefilters/css/web/default.min.css
Сниппет simpleFilters
Выводит список ресурсов, фильтры, подключает все необходимые скрипты и стили.Параметры (в скобках — значение по умолчанию):
- parents — родители для выборки (текущий ресурс)
- sortby — поле для сортировки (menuindex)
- sortdir — направление сортировки (ASC)
- limit — кол-во на страницу (10)
- includeTVs — TV-поля через запятую для включения в вывод
- tvPrefix — префикс для TV-полей (tv_)
- msPrefix — префикс для полей товара miniShop3 (ms_)
- msoPrefix — префикс для опций товара miniShop3 (mso_)
- templates — шаблоны ресурсов через запятую
- where — первоначальная выборка в JSON-формате
- filters — список фильтров в формате поле1: тип_поля1, поле2: тип_поля2, поле3: тип_поля3
- fseparator — разделитель значений фильтра в адресной строке (_)
- mode — режим работы: and — совпадение всех условий, or — совпадение хотя бы одного уcловия (or)
- Поле ресурса — без префикса
- TV-параметр — tv_
- Поле товара MiniShop3 — ms_
- Опция товара MiniShop3 — mso_
- Чекбокс — checkbox или оставить пустым
- Выпадающий список — select
- Слайдер — slider
- Радиокнопка — radio
...
&filters=`ms_vendor_id:select,ms_price:slider,tv_instock:slider,ms_color,ms_tags:select`
...&where поддерживает один параметр/значение.
Работает только к таблицами ресурса MODX и продукта MiniShop3 (поля указываются без префиксов, как в базе).
Вывод новинок:
&where=`{ "new":"1" }`Вывод товаров с ценой больше 2000:
&where=`{ "price:>":"2000" }`Вывод ресурсов со словом «скидка» в longtitle:
&where=`{ "longtitle:like":"скидка" }`Шаблоны
В чанках по умолчанию используется Fenom (требуется наличие pdoTools), но поддерживается и стандартный синтаксис
- tpl — чанк вывода ресурса
- tplWrapper — чанк-обертка всего вывода (sf_wrapper)
- tplPaginationWrapper — чанк-обертка пагинации (sf_pagination)
- tplPagination — чанк вывода ссылки на страницу (sf_page)
- tplPaginationFirst — чанк вывода ссылки на первую страницу (sf_page_first)
- tplPaginationLast — чанк вывода ссылки на последнюю страницу (sf_page_last)
- tplMoreButton — чанк вывода кнопки «Загрузить ещё» (sf_morebutton)
- tplFilter — чанк блока фильтра (sf_filter)
- tplFilterRow — чанк строки фильтра типа чекбокс (sf_filter_row)
- tplFilterRadioRow — чанк строки фильтра типа радиокнопка (sf_filter_radio_row)
- tplFilterSelect — чанк блока фильтра типа селект (sf_filter_select)
- tplFilterSelectRow — чанк опции фильтра типа селект (sf_filter_option_row)
- tplFilterSlider — чанк блока фильтра типа слайдер (sf_filter_slider)
Для этого нужно указать параметры в виде &tplFilter_параметр и &tplFilterRow_параметр.
Например, если требуется для фильтра по тегам (ms_tags) какое-то своё оформление, создайте соответствующие чанки и укажите в вызове:
&tplFilter_ms_tags=`чанк_для_блока`
&tplFilterRow_ms_tags=`чанк_для_элемента`Названия блоков фильтров задаются через лексиконы в формате sf_filter_фильтр (также можно менять в плагине на событие sfOnBeforeCreateFilter).
Системные события
Все события принимают массив $data.- sfOnGetIds — вызывается после первоначального сбора ID выводимых ресурсов. Можно добавить ресурс, прописав его ID или полностью переписать набор.
- sfOnGetFilterValues — вызывается после создания значений фильтра. Принимает массив со значениями (например, можно отсортировать по-своему), названием и типом фильтра.
- sfOnBeforeCreateFilterRow — вызывается при создании строки (элемента фильтра). Можно заменить названия, значения и т. д.
- sfOnBeforeCreateFilter — вызывается при создании блока фильтра. Например, можно изменить название блока, значения для слайдера и т. д.
- sfOnCheckResource — вызывается при проверке ресурса на соответствие значению выбранного фильтра. Приходит id ресурса, название фильтра и значение. Чтобы ресурс добавился в выборку должно возвращать $data['result'] = true;
Комментарии: 13
Кроме обычной пагинации предусмотрена ли загрузка «по кнопке»?
В данный момент нет, но в ближайшее время планирую добавить.
Также в планах работа с MIGX-параметрами, но это позже.
Также в планах работа с MIGX-параметрами, но это позже.
Добавлено в версии 1.0.3
Как будто бы 2 секунды на фильтрацию 1000 товаров без единой твшки это многовато.
Новинки, Акции, Хиты, Цена и Цвет — поля товара miniShop3.
На складе — TV-шка.
Материал — опция категории (ms3_product_option).
Компонент потому и «simple», что не претендует на суперскорость.
Для >1000 товаров в категории или большого кол-ва фильтров нужно использовать другие решения.
На складе — TV-шка.
Материал — опция категории (ms3_product_option).
Компонент потому и «simple», что не претендует на суперскорость.
Для >1000 товаров в категории или большого кол-ва фильтров нужно использовать другие решения.
Для упрощенной версии и ограниченного функционала, высоковата цена. Быстродействие оставляет желать лучшего.
У Modstore есть правила размещения и это компромиссный вариант, который устроил обе стороны.
В любом случае никто же не заставляет покупать и всегда хорошо, когда есть выбор.
Нужно что-то большее, подождите выхода нового mFilter и купите его — никто же не запрещает.
Что касается скорости, то это решение для небольших магазинов, у которых в одной категории порядка 300-500 товаров (согласитесь, таких много).
Да, на большом количестве будут тормоза, ну так они и на mFilter2 есть и ничего, многие пользуются.
Вот, к примеру, всего порядка 650 товаров в категории подтормаживает не меньше и ничего.
В любом случае никто же не заставляет покупать и всегда хорошо, когда есть выбор.
Нужно что-то большее, подождите выхода нового mFilter и купите его — никто же не запрещает.
Что касается скорости, то это решение для небольших магазинов, у которых в одной категории порядка 300-500 товаров (согласитесь, таких много).
Да, на большом количестве будут тормоза, ну так они и на mFilter2 есть и ничего, многие пользуются.
Вот, к примеру, всего порядка 650 товаров в категории подтормаживает не меньше и ничего.
Цитата из демки
То есть налицо логическая ошибка и антипаттерн. Не могу представить ситуации, в которых такая архитектура может быть уместна.
Не сочти за претензию, я скорее удивлен твоему выбору.
Демо с 1 000 товарами в одной категории и логикой AND (то есть выполняются все условия по отмеченным опциям):Я проверил… выбрал все цвета — получил 0 результатов. Реально AND работает. Выбирается товар у которого одновременно есть Красный, Синий, Белый и так далее цвета. Однако типовой фасетный фильтр работает через OR, то есть выбрать все товары у которых цвета Синий ИЛИ Белый ИЛИ Красный т.д.
То есть налицо логическая ошибка и антипаттерн. Не могу представить ситуации, в которых такая архитектура может быть уместна.
Не сочти за претензию, я скорее удивлен твоему выбору.
Иногда нужно отобрать в этой логике (например, блюдо по ингредиентам, чтобы было и то и то).
В демке именно так, но ничего не мешает указать в вызове &mode=`or` и будет стандартный режим.
В демке именно так, но ничего не мешает указать в вызове &mode=`or` и будет стандартный режим.
Ну тогда мое почтение
Захожу на страницу, по счетчику грузится за 0,5 сек
Обновляю просто страницу, страница загружается по счетчику за 2 секунд. Также и по фильтрам, скорость загрузки скачет в 4 раза при одних и тех же условиях.
Интересно, почему так происходит?
Обновляю просто страницу, страница загружается по счетчику за 2 секунд. Также и по фильтрам, скорость загрузки скачет в 4 раза при одних и тех же условиях.
Интересно, почему так происходит?
Что касается просто открытия/обновления страницы (без значений в URL), то довольно ровно 0.4 – 0.49.
В остальном чем больше фильтров выбрано, тем дольше обработка (проверяется больше условий).
Если выбраны только новинки, то 0.45, если добавить еще что-то, будет дольше.
Ну и зависит, конечно, от типа поля. Для TV и опций товаров нужны дополнительные запросы.
В остальном чем больше фильтров выбрано, тем дольше обработка (проверяется больше условий).
Если выбраны только новинки, то 0.45, если добавить еще что-то, будет дольше.
Ну и зависит, конечно, от типа поля. Для TV и опций товаров нужны дополнительные запросы.
Ну я говорю разную скорость при одних и тех же условиях.
1 — зашел на страницу — 0.5 сек
2. — просто обновил страницу — 2 сек
3. — выбрал один чекбокс — 1 сек
4 обновил страницу с этим же чек боксом — 2,5сек
Время округлил
1 — зашел на страницу — 0.5 сек
2. — просто обновил страницу — 2 сек
3. — выбрал один чекбокс — 1 сек
4 обновил страницу с этим же чек боксом — 2,5сек
Время округлил
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.