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

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

Страница оформления заказа — завершающий этап покупки. MiniShop3 предоставляет готовый шаблон и чанк формы заказа с контактными данными, выбором доставки и оплаты.

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

КомпонентФайлИмя чанка в БДНазначение
Шаблон страницы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 доступных способов оплаты. JavaScript автоматически фильтрует оплаты при смене доставки.

Валидация

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

Обязательные поля и правила валидации настраиваются для каждого способа доставки в админ-панели. Это позволяет, например, требовать полный адрес для курьерской доставки, но только email для самовывоза.

Подробная документация по настройке правил валидации — в разделе Настройка доставок → Валидация полей заказа.

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

  1. При добавлении значения поля (ms3.order.setField) — сервер проверяет его по правилам доставки
  2. При отправке заказа — сервер проверяет, что все обязательные поля заполнены
  3. При ошибке — фронтенд подсвечивает проблемные поля

Отображение ошибок

Каждое поле формы содержит контейнер .invalid-feedback. При ошибке валидации JavaScript добавляет класс is-invalid на поле и текст ошибки в контейнер:

fenom
<input type="text" name="email" class="form-control"
       value="{$form.email}">
<div class="invalid-feedback"></div>

Валидация чекбоксов

Для обязательного чекбокса (например, согласие с условиями) используйте правило accepted в настройках доставки. Оно проверяет, что значение равно "yes", "on", "1" или true.

JavaScript API

Объект ms3.order

javascript
// Оформить заказ
ms3.order.submit();

// Обновить способ доставки
ms3.order.setDelivery(deliveryId);

// Обновить способ оплаты
ms3.order.setPayment(paymentId);

// Обновить поле формы
ms3.order.setField('city', 'Москва');

События

javascript
// Перед отправкой заказа
document.addEventListener('ms3:order:before-submit', (e) => {
    console.log('Данные заказа:', e.detail);
    // Можно отменить отправку: e.preventDefault()
});

// После успешного оформления
document.addEventListener('ms3:order:success', (e) => {
    console.log('Заказ создан:', e.detail.order_id);
    window.location.href = e.detail.redirect;
});

// При ошибке оформления
document.addEventListener('ms3:order:error', (e) => {
    console.error('Ошибки:', e.detail.errors);
});

// При изменении способа доставки
document.addEventListener('ms3:order:delivery-changed', (e) => {
    console.log('Выбрана доставка:', e.detail.delivery_id);
});

// При изменении способа оплаты
document.addEventListener('ms3:order:payment-changed', (e) => {
    console.log('Выбрана оплата:', e.detail.payment_id);
});

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

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

СобытиеКогдаПараметры
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-режиме настроек доставки:

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%)