Skip to content
ms3PromoCode
ms3PromoCode
Промо-коды для MiniShop3 с гибкими правилами, генерацией по маске и интеграцией в позиции заказа
  • MODX 3
  • PHP 8.2
  • miniShop3
  1. Компоненты
  2. ms3PromoCode
  3. Интерфейс админки
  4. Вкладка в заказе

Вкладка «Промо-код» в карточке заказа ​

Позволяет менеджеру применить или снять промо-код к существующему заказу MS3.

Где находится ​

Магазин → Заказы → конкретный заказ → вкладка «Промо-код».

Регистрируется через window.MS3OrderTabsRegistry в новой Vue-админке MS3. При создании заказа скрыта (hideOnCreate: true), появляется после сохранения.

При каждом открытии (переключение на вкладку, перемонтирование компонентом MS3) вызывается процессор Mgr/Order/GetPromo: возвращает current, order_cost, cart_cost и определяет текущее состояние.

Состояния ​

Код не применён ​

Показано:

  • Текущая сумма заказа.
  • Сообщение «К заказу не применён промо-код.»
  • Поле ввода кода + кнопка «Применить».

При нажатии кнопки вызывается процессор Mgr/Order/ApplyPromo. При успехе состояние меняется на «применён», msOrder.cost обновляется мгновенно. Под карточкой состояния появляется подсказка «Изменения применены. Для отображения новой суммы в остальных вкладках обновите страницу.» со ссылкой на window.location.reload(). Та же подсказка показывается после снятия кода.

Код применён ​

Показано:

  • Текущая сумма заказа (со скидкой).
  • Информация о применённом коде:
    • Код — сам код (например, WELCOME10).
    • Скидка — сумма скидки в валюте MS3. Символ и позиция берутся из системных настроек ms3_currency_symbol и ms3_currency_position.
    • Применён — дата и время применения.
  • Кнопка Отменить — после подтверждения вызывает процессор Mgr/Order/RemovePromo. По умолчанию подтверждение запрашивается через PrimeVue ConfirmDialog; если ConfirmService недоступен — через window.confirm.

Заблокировано по статусу ​

Если статус заказа входит в ms3promocode.lock_statuses, вкладка показывает уведомление:

Текущий статус заказа не позволяет менять промо-код.

Кнопки «Применить» и «Отменить» отключены.

Автоматический пересчёт при изменении состава ​

Если на вкладке Товары этого же заказа добавить, изменить или удалить позицию, скидка пересчитается автоматически:

  • Применённый код заново распределяется по новому составу.
  • Если новый состав не подходит под условия (например, cart_cost стал меньше min_order_amount) — код автоматически снимается.
  • Факт автоматического снятия фиксируется в истории заказа (msOrderLog с операцией ms3promocode_auto_remove).

Технический нюанс

Vue-админка MS3 не вызывает MODX-процессоры при изменении позиций (см. issue #207), поэтому ms3PromoCode использует JS-перехватчик в order-tab.js:

  • Основной путь — хук на window.fetch.
  • Запасной путь — хук на XMLHttpRequest.prototype.{open, send, addEventListener} для случаев, если MS3 отправит мутацию через XMLHttpRequest.

Оба хука срабатывают на мутациях (POST / PUT / PATCH / DELETE) по URL-паттерну /api/mgr/orders/{id}/products(/|) — путь дополнительно декодируется, потому что MS3 оборачивает запросы в query-параметр route=. После успешной мутации вызывается процессор Mgr/Order/Resync, Vue получает ответ только после завершения пересчёта — на UI всегда актуальные суммы.

После мерджа PR в MS3 этот обходной механизм можно будет убрать.

Реактивная синхронизация с другими вкладками ​

Применение и снятие кода сразу меняют msOrder.cost: компонент мутирует prop.order.cost и обнуляет cost_formatted. MS3-вкладка «Информация о заказе» на это опирается — показывает новую сумму без перезагрузки. Цены позиций в других вкладках обновляются только после window.location.reload() (ссылка «обновите страницу» в состоянии «код применён»).

Почему отдельная вкладка, а не кнопка в общем виде заказа ​

  • Применение/снятие кода — действие, требующее подтверждения и информации (стоимость до/после, причина).
  • Отдельная вкладка не загромождает основной интерфейс заказа.
  • Менеджер видит всю историю применения (когда применён, какой код, какая скидка).

Реализация ​

Вкладка реализована как Vue-компонент без сборки в assets/components/ms3promocode/js/mgr/order-tab.js: использует Vue, уже загруженный MS3-админкой, и встраивает свои стили в <head>. Это не Vite-сборка.

Так удаётся:

  • не включать в пакет отдельный сборщик;
  • подключаться через <script src="..."> без модульной системы;
  • работать с любой версией Vue, которую использует MS3.