Новости MiniShop3, mSearch, mFilter

За четыре релиза — с 1.6.0 до 1.10.0 — MiniShop3 заметно похорошел: галерея и опции полностью на Vue, кастомные вкладки заказа из плагинов, inline-редактирование в каталоге, свои поля у производителя. Параллельно двигались и компоненты экосистемы — mSearch и mFilter, так что про них тоже будет. Рассказываю по порядку, что изменилось снаружи и что стоит учесть при обновлении.



Галерея товаров — полностью на Vue



Старая ExtJS-прослойка (панель, тулбар, диалоги) ушла целиком. На её месте — Vue-компоненты: сетка с drag-n-drop для сортировки, контекстное меню, поиск и пагинация. Массовые действия вынесены в тулбар, отдельный диалог редактирования вызывается по клику. Uppy-загрузчик встроен прямо в бандл вкладок товара — больше никаких отдельных точек входа. В совокупности — минус ~900 строк ExtJS.



Опции — тоже на Vue, включая страницу настроек



До последнего не хотел лезть в страницу Настройки → Опции — слишком много функционала, который нужно перевезти без регрессий. Собрался с духом и сделал. Теперь страница Настройки полностью избавлена от ExtJS.

Что получили:

  • Настройки → Опции — грид с сортировкой, дерево категорий с независимыми чекбоксами и контекстным меню, диалог редактирования со всеми типами значений (включая удобный выбор цвета и drag-n-drop сортировку значений в списке).
  • Категория → Опции — drag-n-drop сортировка привязок, inline-редактор значения по умолчанию, массовые действия и удобный диалог «Копировать опции из другой категории» (сам не знал, что такой сценарий уже был заложен).
  • Карточка товара → Опции товара — все десять типов опций переехали в новом исполнении, старые задумки сохранены. Для comboOptions появились чипы с автодобавлением по Enter или запятой и кликабельными подсказками под полем.
По пути удалено семь старых файлов и двадцать два PHP-процессора — около 2600 строк legacy-кода.







Отдельной строкой хочу отметить, что теперь для каждой категории опцию можно назвать по своему.
Например option_color в одной категории может быть подписана как Цвет плафона, в другой как Цвет рамки, в третьей просто Цвет.



Справедливости ради, с опциями, работы впереди еще много. Мы уже успели зафиксировать парочку багов, которые предстоит закрыть.

Кастомные вкладки на странице заказа



На экране заказа теперь можно добавлять свои вкладки из плагина — хоть на Vue, хоть на ExtJS, хоть вперемешку. Регистрация через MS3OrderTabsRegistry.register() в обработчике msOnManagerCustomCssJs. Ядро ничего не правим, вкладки подхватываются на лету. Можно скрыть вкладку в режиме создания заказа, зарезервированные ключи защищены — чужой плагин не сломает «Информацию» или «Товары».



Inline-редактирование товаров в каталоге



Двойной клик по ячейке в таблице товаров — и вводите цену (или артикул, или вес) прямо там, не открывая карточку. Работает для текста, чисел и чекбоксов. Какие поля редактируются и каким редактором — настраивается в Утилиты → Поля таблицы для грида «Товары категории». Поле published дополнительно дёргает события OnDocPublished / OnDocUnPublished, так что всё, что подписано на публикацию ресурса, продолжит работать.



Модульные роуты для сторонних компонентов



Раньше любой компонент, которому нужно было что-то делать через API, писал собственный роутинг. Теперь можно пользоваться роутингом MiniShop3: складываете PHP-фрагмент в core/config/ms3.routes.d/web/ (или /manager/), и ядро подхватит его автоматически при следующем запросе. Переопределение — по ключу METHOD:PATTERN. В поставке лежит example-addon.php.dist — скопировали, подправили, работает.

Документация к разделу


Кастомные поля для производителя



Форма производителя переехала на универсальный рендерер полей, и теперь в Утилиты → Свои поля можно выбрать модель msVendor и добавить любое поле — текст, число, чекбокс, файл через FileBrowser, выпадающий список. Поле появится в форме редактирования и отдастся через API вместе со стандартными. Это задел на будущее: постепенно так же будут расширяться и другие страницы админки.

Ещё — по мелочи, но заметно



  • Форматированные плейсхолдеры валюты и веса. В сниппетах и чанках появились price_formatted, cost_formatted, weight_formatted и так далее — больше не нужно дописывать рубли и килограммы руками. Источник истины — системные настройки ms3_currency_symbol, ms3_currency_position, ms3_weight_unit.
  • Корзина синхронизируется с плагинами. Если ваш плагин на msOnGetStatusCart пересчитывает скидку или добавляет стоимость доставки — итоги в чанке msCart теперь корректно отразят эти изменения. В чанке и return=data доступен отдельный массив status.
  • Кастомные поля в валидации заказа. Правила доставки вида agreement: required|accepted сохраняются между шагами оформления и доезжают до событий msOnBeforeCreateOrder / msOnCreateOrder.
  • Самолечащаяся миграция. Если после обновления админка встретила вас ошибкой ms3_model_fields_empty — при следующем накате миграций всё починится автоматически, пользовательские настройки секций и ширин колонок не затирая.

Что учесть при обновлении



В версии 1.7.0 плейсхолдер cost_formatted в списке заказов личного кабинета стал включать символ валюты. Если в вашем кастомном чанке валюта дописана руками — получите двойной символ. Лечится удалением ручной валюты из шаблона.

Что дальше



Полный список изменений по каждому релизу — в CHANGELOG. Сами релизы и транспортные пакеты — на странице releases. Вопросы, предложения и баг-репорты — в issues.

Экосистема: mSearch 1.1.0 → 1.2.0-beta



MiniShop3 — не единственное, что двигалось. Компонент mSearch за эти месяцы прошёл путь до версии 1.2.0-beta с двумя большими релизами.

Главное снаружи:

  • Событие mseOnRegisterAdapters — теперь сторонние компоненты могут регистрировать свои адаптеры индексации. Это открывает дорогу к индексации товаров MiniShop3, комментариев форума и любых других моделей без правки ядра mSearch.
  • Поиск с учётом контекста. Параметр &contexts= в сниппете mSearch ограничивает результаты выбранными контекстами MODX. Полезно для мультиязычных и мультиконтекстных сайтов.
  • Headless-режим и hook-система. Появился window.msearch для интеграции с React, Vue или кастомным фронтом. Через хуки beforeSearch, afterSearch, beforeSuggest можно вмешиваться в поиск без форка.
  • Оптимизация использования памяти при поиске по большим базам. Раньше при выдаче сотен результатов по тяжёлым моделям (msProduct) PHP-воркер ложился на 512 MB из-за xPDO-кэша. Запросы переведены на простой PDO, intro грузится потоково.
По мелочи: автоподсказки теперь корректно ведут на страницу ресурса, а не на страницу поиска; заработали файловые чанки (@FILE) в mSearchForm; починена установка на серверах с коротким MySQL-таймаутом; локализованы кнопки в админке.

Экосистема: mFilter — что нового после 1.2.0



Второй крупный компонент экосистемы— mFilter — с марта доехал до версии 1.3.2-beta. Главное, что увидит пользователь:

  • Поддержка дополнительных категорий MS3. Товары, привязанные к категории через msCategoryMember, теперь корректно учитываются во всех фильтрах — в счётчиках, пагинации и выдаче. Раньше они просто выпадали.
  • Защита от SEO-дублей. Фильтрованные URL без концевого слэша по умолчанию возвращают 404, поведение настраивается — 404, 301 или выключить. Больше не нужно городить правила в nginx, чтобы не плодить дубли.
  • Поддержка цен с копейками в range-фильтрах. Слайдер больше не округляет 17.6 до 18, в SEO URL легально живут значения вида price_99.50_500.
  • Точка расширения для стороннего JS. После каждого обновления выдачи mFilter выбрасывает событие mfilter:contentLoaded. Лейзи-лоад картинок, трекеры, обработчики кликов на новые карточки — всё это теперь навешивается без танцев.
По мелочи: опции с нулевым счётчиком в select-фильтрах становятся disabled (не даёт кликать в заведомо пустое), кнопка догрузки сама прячется после последней страницы, ушёл весь legacy JS-стек (минус 2500 строк) — FilterUI.js остался единственной реализацией UI.

Демо-сайт


Также запустил демо-сайт minishop3.ru/ где вы можете увидеть работу самого MiniShop3 а также поиска и фильтров.
Николай Савин
2 часа назад
modx.pro
20
+3
Поблагодарить автора Отправить деньги

Комментарии: 2

Наумов Алексей
33 минуты назад
0
Шикарная работа!

Коль, расскажи, схема базы данных (особенно в опциях товара) не менялась? На этом стоит уточнять внимание, ибо существующие компоненты могут её использовать.
    Николай Савин
    5 минут назад
    0
    Нет. изменился только интерфейс админки. Модели, состав таблиц, работа сниппетов на фронте — все осталось прежним
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    2