Skip to content
MiniShop3
MiniShop3
Современный компонент интернет-магазина для MODX 3
  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. При ошибке JS вешает 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
Выбор адреса из списка (AuthUI / 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)
  }
})

См. 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%)