Skip to content
  1. Компоненты
  2. MiniShop3
  3. Интерфейс фронтенда
  4. Оформление заказа

Оформление заказа ​

Последний шаг покупки: контакты, доставка, оплата, адрес. Шаблон и чанк формы уже есть в пакете.

Структура страницы ​

КомпонентФайлИмя чанка в БДНазначение
Шаблон страницыelements/templates/order.tpl—Разметка страницы, вызов msOrder
Чанк формыelements/chunks/ms3_order.tpltpl.msOrderФорма оформления заказа

Вызов сниппета ​

fenom
{'!msOrder' | snippet : [
    'tpl' => 'tpl.msOrder'
]}

Кэширование

Сниппет msOrder должен вызываться некэшированно (!msOrder), так как работает с сессией пользователя.

Форма заказа ​

Форма содержит следующие секции:

СекцияОписание
Пустая корзинаСообщение и ссылка на каталог (если корзина пуста)
Контактные данныеИмя, фамилия, email, телефон, комментарий
Способы оплатыРадиокнопки с логотипом и описанием
Способы доставкиРадиокнопки с логотипом и описанием
Адрес доставкиИндекс, регион, город, улица, дом, подъезд, этаж, квартира
Сохранённые адресаВыпадающий список ранее сохранённых адресов (для авторизованных)
Итоговая панельСтоимость товаров, доставки, итого, кнопки отмены и оформления

Плейсхолдеры ​

В чанке формы доступны следующие данные:

ПлейсхолдерТипОписание
$isCartEmptyboolКорзина пуста
$formarrayЗначения полей формы ($form.first_name, $form.email и т.д.)
$orderarrayДанные заказа ($order.cost, $order.delivery_cost, $order.cart_cost)
$deliveriesarrayСпособы доставки
$paymentsarrayСпособы оплаты
$addressesarrayСохранённые адреса клиента
$isCustomerAuthboolКлиент авторизован

Связь доставки и оплаты ​

У каждой доставки в данных есть массив payments с ID допустимых оплат. JS на смене доставки прячет чужие способы оплаты. Связки задают в админке в карточке доставки (msDeliveryMember).

Если пара недопустима, submit или финализация в менеджере вернут ошибку.

Гость и авторизованный покупатель ​

РежимЧто происходит
ГостьЗаполняет контакты вручную. Сохранённых адресов нет
АвторизованВ форме есть список адресов. Контакты можно подтянуть из профиля

Авторегистрация при заказе ​

Ключи:

  • ms3_customer_auto_register_on_order (по умолчанию включено)
  • ms3_customer_auto_login_on_order (по умолчанию включено)

При submit гость с валидным email может получить запись msCustomer и сессию без отдельной регистрации. Отключите ключи, если регистрация только через форму ЛК.

Отдельно: ms3_order_register_user_on_submit создаёт modUser при оформлении (по умолчанию выключено). Это не то же самое, что msCustomer.

Вход и регистрация вручную: Вход и регистрация.

Валидация ​

Как работает валидация полей ​

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

Настройка правил: Доставки → Валидация.

Процесс валидации ​

  1. При смене доставки OrderUI запрашивает GET /api/v1/order/delivery/validation-rules и GET /api/v1/order/delivery/required-fields, скрывает лишние поля и обновляет required.
  2. При ms3.orderAPI.add(key, value) сервер проверяет поле по правилам текущей доставки.
  3. При submit сервер проверяет все обязательные поля.
  4. При ошибке OrderUI ставит атрибут data-ms3-error и класс ms3_field_error на поле. Классы Bootstrap is-invalid / .invalid-feedback форма заказа сама не получает.

Сохранённые адреса ​

Сниппет msOrder подключает order-addresses.js (не входит в ms3_frontend_assets). В чанке — <select id="saved_address_id"> с <option data-address='{"city":"..."}'>: при выборе поля формы заполняются автоматически.

Два API-пути:

СценарийЭндпоинт
Checkout: применить адрес к черновикуPOST /api/v1/order/address/set
Выбор адреса из списка (CustomerUI / msCustomer)POST /api/v1/customer/changeAddress

Сброс адресных полей: POST /api/v1/order/address/clean.

Кастомные поля (_validated) ​

Поля вне модели заказа (например чекбокс согласия agreement) уходят в черновик и хранятся в msOrder.properties['_validated']. На событиях создания заказа они доступны как customFields.

На витрине чекбокс должен слать input.checked (1 / 0), не статичный value. Для согласия используйте правило accepted в доставке.

JavaScript API ​

Публичный фасад — ms3.orderAPI (не ms3.order). UI-форма дергает его через OrderUI.

javascript
// Оформить заказ
const response = await ms3.orderAPI.submit()
if (response.success) {
  window.location.href = response.data.redirect
}

// Способ доставки / оплаты
await ms3.orderAPI.add('delivery_id', deliveryId)
await ms3.orderAPI.add('payment_id', paymentId)

// Поля адреса и заказа
await ms3.orderAPI.add('city', 'Москва')
await ms3.orderAPI.add('order_comment', 'Позвонить перед доставкой')
// address.comment (комментарий к адресу): await ms3.orderAPI.add('comment', '…')

Хуки ​

DOM-событий ms3:order:* нет. Используйте hooks:

javascript
ms3Hooks.addHook('beforeSubmitOrder', async (data) => {
  // можно изменить data.formData
})

ms3Hooks.addHook('afterSubmitOrder', async ({ response }) => {
  if (response.success) {
    console.log('order_id:', response.data.order_id)
  }
})

ms3Hooks.addHook('afterAddOrder', async ({ key, value, response }) => {
  if (key === 'delivery_id') {
    console.log('Доставка:', value)
  }
})
ХукКогда
beforeAddOrder / afterAddOrderПоле черновика через orderAPI.add
afterUpdateOrderCostsПосле пересчёта сумм (только after)
beforeSubmitOrder / afterSubmitOrderОформление заказа
beforeCleanOrder / afterCleanOrderОчистка черновика

См. Frontend JS — хуки.

Серверные события ​

События полей заказа ​

СобытиеКогдаПараметры
msOnBeforeAddToOrderПеред добавлением поляkey, value, draft
msOnAddToOrderПосле добавления поляkey, value, draft
msOnBeforeRemoveFromOrderПеред удалением поляkey, draft
msOnRemoveFromOrderПосле удаления поляkey, draft

События валидации ​

СобытиеКогдаПараметры
msOnBeforeValidateOrderValueПеред валидацией значенияkey, value, orderData
msOnValidateOrderValueВалидация пройденаkey, value
msOnErrorValidateOrderValueОшибка валидацииkey, value, error

События оформления ​

СобытиеКогдаПараметры
msOnSubmitOrderПеред началом оформленияhandler, draft, orderData, data
msOnBeforeCreateOrderПеред созданием заказаhandler, msOrder
msOnCreateOrderПосле создания заказаhandler, msOrder

Кастомизация ​

Изменение формы заказа ​

  1. Создайте свой чанк, например tpl.myOrder
  2. Укажите его в вызове: 'tpl' => 'tpl.myOrder'
  3. Используйте доступные плейсхолдеры из документации msOrder

Добавление кастомных полей ​

Поля вне модели заказа проходят два шага.

1. Валидация. Добавьте правила в настройках доставки:

json
{
  "first_name": "required",
  "email": "required|email",
  "agree": "accepted"
}

2. Сохранение. Стандартные поля (first_name, email, city и т.д.) пишутся сами. Чужие ключи (не из msOrder / msOrderAddress) кладите в properties заказа плагином, если они нужны после оформления:

php
switch ($modx->event->name) {
    case 'msOnBeforeCreateOrder':
        // $msOrder доступен из параметров события
        $address = $msOrder->Address;
        if ($address) {
            $properties = $msOrder->get('properties') ?: [];
            $properties['agree'] = $address->get('properties')['agree'] ?? '';
            $msOrder->set('properties', $properties);
        }
        break;
}

Подсказка

Чекбокс «Согласен с условиями» часто нужен только на валидации. Тогда хватит правила accepted в доставке. В заказ его писать не обязательно.

Адаптивная вёрстка ​

Форма использует Bootstrap 5 Grid:

ЭкранКолонки
< 992pxПо одной секции в ряд (100%)
≥ 992pxПо две секции в ряд (50% + 50%)