MiniShop3: итоги февраля и версия 1.6.0
За февраль выпустили четыре релиза — с 1.4.0 до 1.6.0. Переработали авторизацию, добавили уведомления, переписали личный кабинет. 242 файла, 36 закрытых задач. Расскажу по порядку, начиная с самого крупного.
Это изменение назревало давно. Токен авторизации покупателя хранился одновременно в четырёх местах: localStorage в браузере, PHP-сессия на сервере, таблица в базе и поле в объекте msCustomer. Четыре источника правды — и ни один из них не был главным.
На практике это приводило к конкретной проблеме: гость добавляет товары в корзину, логинится — и корзина пропадает. Токены рассинхронивались, и корзина «терялась» между старым и новым токеном.
Теперь один httpOnly cookie ms3_token — единственный источник правды. Сервер ставит, сервер читает. JavaScript доступа не имеет — закрыт вектор XSS-атаки. Токен не светится в URL-параметрах. Для межсайтовых запросов поддерживается Authorization: Bearer.
При логине токен не пересоздаётся — гостевая корзина сохраняется. При выходе старый токен инвалидируется, генерируется свежий анонимный. Обратная совместимость сохранена — middleware прозрачно транслирует cookie в существующий формат, контроллеры не потребовали изменений.
В 1.4.0 начали нормально работать уведомления о смене статуса заказа — email и Telegram. Настраиваются через админку: кому отправлять, какой шаблон использовать. Шаблоны — обычные чанки с поддержкой @FILE.
До 1.6.0 в ЛК жило три отдельных JS-модуля, каждый сам по себе — со своим клиентом, обработкой ошибок и нативными диалогами подтверждения. Теперь всё интегрировано в архитектуру ms3:
Заодно перевели URL заказов с integer ID на UUID — не раскрывает количество заказов в системе.
Частый запрос — дать покупателю возможность отменить заказ из ЛК. Кнопка появляется в списке заказов и на странице деталей. Статусы, в которых отмена разрешена, настраиваются (по умолчанию — новый и оплаченный). Есть хуки для кастомной логики.
Все CSS-селекторы фронтенда собраны в единый конфиг Selectors.js. Переопределяются из темы без переписывания JS. Параллельно разметка переведена на data-ms3-* атрибуты — меньше конфликтов со стилями темы. CSS-классы сохранены как fallback.
Несколько исправлений, которые не видны снаружи, но важны:
Спасибо Ivan Bochkarev за контрибьюты. Часть задач в этом цикле — прямые запросы из issues: #17 (data-атрибуты), #18 (селекторы), #68 (обработка отсутствия сервиса), #78 (пагинация заказов), #117 (отмена заказа).
Полный список изменений — в CHANGELOG. Все релизы доступны в GitHub Releases и в репозитории modstore. Баг-репорты и предложения — в issues.
Авторизация: одна cookie вместо четырёх хранилищ
Это изменение назревало давно. Токен авторизации покупателя хранился одновременно в четырёх местах: localStorage в браузере, PHP-сессия на сервере, таблица в базе и поле в объекте msCustomer. Четыре источника правды — и ни один из них не был главным.
На практике это приводило к конкретной проблеме: гость добавляет товары в корзину, логинится — и корзина пропадает. Токены рассинхронивались, и корзина «терялась» между старым и новым токеном.
Теперь один httpOnly cookie ms3_token — единственный источник правды. Сервер ставит, сервер читает. JavaScript доступа не имеет — закрыт вектор XSS-атаки. Токен не светится в URL-параметрах. Для межсайтовых запросов поддерживается Authorization: Bearer.
При логине токен не пересоздаётся — гостевая корзина сохраняется. При выходе старый токен инвалидируется, генерируется свежий анонимный. Обратная совместимость сохранена — middleware прозрачно транслирует cookie в существующий формат, контроллеры не потребовали изменений.
Notification Center
В 1.4.0 начали нормально работать уведомления о смене статуса заказа — email и Telegram. Настраиваются через админку: кому отправлять, какой шаблон использовать. Шаблоны — обычные чанки с поддержкой @FILE.
Личный кабинет: рефакторинг
До 1.6.0 в ЛК жило три отдельных JS-модуля, каждый сам по себе — со своим клиентом, обработкой ошибок и нативными диалогами подтверждения. Теперь всё интегрировано в архитектуру ms3:
- AuthUI — формы логина/регистрации
- CustomerUI — отмена заказов, управление адресами
- CustomerAPI — общий клиент для всех операций покупателя
Заодно перевели URL заказов с integer ID на UUID — не раскрывает количество заказов в системе.
Отмена заказа покупателем
Частый запрос — дать покупателю возможность отменить заказ из ЛК. Кнопка появляется в списке заказов и на странице деталей. Статусы, в которых отмена разрешена, настраиваются (по умолчанию — новый и оплаченный). Есть хуки для кастомной логики.
Селекторы и data-атрибуты
Все CSS-селекторы фронтенда собраны в единый конфиг Selectors.js. Переопределяются из темы без переписывания JS. Параллельно разметка переведена на data-ms3-* атрибуты — меньше конфликтов со стилями темы. CSS-классы сохранены как fallback.
Устойчивость к ошибкам
Несколько исправлений, которые не видны снаружи, но важны:
- MySQL reconnect при установке. На хостингах с коротким таймаутом соединение обрывалось между скачиванием пакетов и миграциями. Теперь resolver восстанавливает его автоматически.
- Проверка сервиса ms3. Если MiniShop3 не загрузился — корректный 503 вместо необработанного Exception.
- Идемпотентные миграции. Повторный запуск не ломает базу.
Community
Спасибо Ivan Bochkarev за контрибьюты. Часть задач в этом цикле — прямые запросы из issues: #17 (data-атрибуты), #18 (селекторы), #68 (обработка отсутствия сервиса), #78 (пагинация заказов), #117 (отмена заказа).
Дополнительная информация
Полный список изменений — в CHANGELOG. Все релизы доступны в GitHub Releases и в репозитории modstore. Баг-репорты и предложения — в issues.
Комментарии: 33
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
А если серьезно, ты молодец! И твоя продуктивность восхищает!
Есть небольшой вопрос, Modx3, minishop3 1.6.0 — как только ресурс перевожу в статус категории товаров, то отключается визуальный редактор и видна просто верстка. При этом, галочка в настройках не меняется, т.е. визуальный редактор по настройкам включен, но он не отображается(( в чем может быть ошибка?
И пропал photo-screen.ru/i/iBsrZbZ66 создать Документ.
Цена доставки не меняется после изменения администратором способов оплаты и доставки. Намертво прилипает.
Есть ручная возможность принудительно менять цифры в админке на странице заказа?
Необходимо предусмотреть возможность добавления и наценок скидок в % отношении, для настроек в поле добавления способов доставки и оплаты. Цена доставки не меняется после изменения администратором, способов оплаты и доставки.
временно поправлено костылями, ждем рабочее решение.
Вообще Было бы лучше если в настройках доставки и способов оплаты, добавить отдельное поле скидка. К примеру в нашем варианте самовывоз подразумевает скидку в 15%.
docs.modx.pro/components/minishop3/development/services
И есть пошаговое описание, как сменить класс docs.modx.pro/components/minishop3/development/services#zamena-servisov
Расширение сервисов я вам показал. Там есть конкретные примеры как расширить класс заказа.
что касается отрицательных наценок на доставку — честно скажу это неожиданный кейс. Посмотрим что можно сделать и нужно ли.
Решите пож. проблему с обновлением стоимости в зависимости от смены способа доставки и оплаты с админки на всех этапах заказа, с возможностью ручной корректировки цифры доставки,
Гибкость и контроль самом деле очень важен, к примеру для доставки по городу когда цена курьера может сильно плавать в ту или иную сторону.
Добавьте поле скидка в настройки способа доставки и оплаты. отрицательная наценка — кринжа.)) к примеру в нашем случае Самовывоз предусматривает скидку, наличка предусматривает еще одну скидку.
В остальном плагин супер. Идеально подошел для сайта доставки еды.
github.com/modx-pro/MiniShop3/issues/212
PS письмо с ссылкой с токеном потьверждения юзер получает, но ссылка выводит на главную страницу, и никак не меняет статус почты,
Проверьте на последней актуальной версии 1.10.0-beta1 и вернитесь с обратной связью
Подскажите еще один момент! нам надо куда то пристроть код отправки уведомления на почту администратора, в момент появления нового заказа. Куда лучше всего приютить строчку, чтобы не ломать существующие классы, заменой своими, или их правкой? с учетом того что файлы могут обновляться с пакетами.
Вообще у нас есть центр уведомлений, где вы можете задать Email шаблоны для каждого статуса покупателю и менеджеру (в том числе файловые). Можно сделать отложенную отправку с настраиваемой задержкой отправления. Можно использовать телеграм и sms каналы отправки данных. Можно использовать события.
Документация docs.modx.pro/components/minishop3/interface/notifications
MiniShop3 — это бесплатный open source, без техподдержки. Вся работа тут происходит на энтузиазме по мере свободного времени и настроения.
Вы всегда можете предложить свое видение реализации и исправление найденных ошибок через механизм pull request, либо заказать доработку у программистов.