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.
Поблагодарить автора
Отправить деньги
Комментарии: 3
Приятно, что я вдохновил тебя использовать data-атрибуты вместо классов)))
А если серьезно, ты молодец! И твоя продуктивность восхищает!
А если серьезно, ты молодец! И твоя продуктивность восхищает!
Да в этом месяце больше Ваня старался, львиная доля работы — его заслуга.
Он тоже молодец. Он ещё и развитие ядра решил расшевелить, откуда только столько энтузиазма)))
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.