MiniShop3: итоги февраля и версия 1.6.0

За февраль выпустили четыре релиза — с 1.4.0 до 1.6.0. Переработали авторизацию, добавили уведомления, переписали личный кабинет. 242 файла, 36 закрытых задач. Расскажу по порядку, начиная с самого крупного.



Авторизация: одна 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 — общий клиент для всех операций покупателя
Единый API-клиент, единые хуки, единые селекторы. Нативные confirm() заменены на Bootstrap Modal — с автоматическим выбором языка и возможностью декларативной привязки через data-атрибуты.

Заодно перевели 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.
Николай Савин
Вчера в 22:08
modx.pro
335
+10
Поблагодарить автора Отправить деньги

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

Артур Шевченко
Вчера в 22:20
+1
Приятно, что я вдохновил тебя использовать data-атрибуты вместо классов)))

А если серьезно, ты молодец! И твоя продуктивность восхищает!
    Николай Савин
    Вчера в 22:23
    +1
    Да в этом месяце больше Ваня старался, львиная доля работы — его заслуга.
      Артур Шевченко
      Вчера в 22:25
      +1
      Он тоже молодец. Он ещё и развитие ядра решил расшевелить, откуда только столько энтузиазма)))
        Иван Бочкарев
        8 часов назад
        0
        Не за что! Благое дело делаем.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      4