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

Способы доставки

Управление способами доставки доступно через Extras → MiniShop3 → Настройки → Доставки.

Поля доставки

ПолеТипОписание
namestringНазвание способа доставки
descriptiontextОписание для покупателя
pricenumberБазовая стоимость доставки
weight_pricefloatСтоимость за единицу веса
distance_pricefloatСтоимость за единицу расстояния
free_delivery_amountfloatСумма заказа для бесплатной доставки
logostringПуть к изображению
positionintПорядок сортировки
activeboolАктивность
classstringPHP-класс обработчика
validation_rulesJSONПравила валидации полей

Связь с оплатой

Каждый способ доставки может быть связан с определёнными способами оплаты. Это позволяет:

  • Ограничить оплату наличными только для самовывоза
  • Разрешить онлайн-оплату для курьерской доставки
  • Настроить специфичные комбинации для разных регионов

При выборе доставки покупателем, список доступных способов оплаты автоматически фильтруется.

Расчёт стоимости

Стоимость доставки рассчитывается по формуле:

Итоговая стоимость = price + (weight_price × вес) + (distance_price × расстояние)

Если сумма заказа превышает free_delivery_amount, стоимость доставки = 0.

Кастомный расчёт

Для сложной логики расчёта создайте свой класс-обработчик:

php
<?php
namespace MyComponent\Delivery;

use MiniShop3\Controllers\Delivery\DeliveryProviderInterface;
use MiniShop3\Model\msDelivery;
use MiniShop3\Model\msOrder;

class CustomDelivery implements DeliveryProviderInterface
{
    public function getCost(msDelivery $delivery, msOrder $order, float $cost): float
    {
        // Ваша логика расчёта
        $cartCost = $order->get('cart_cost');
        $weight = $order->get('weight');

        if ($cartCost > 10000) {
            return 0; // Бесплатно от 10000 руб
        }

        if ($weight > 5000) {
            return 500 + ($weight - 5000) * 0.1; // Наценка за тяжёлый заказ
        }

        return 300; // Базовая стоимость
    }
}

Укажите класс в поле class: MyComponent\Delivery\CustomDelivery

Валидация полей заказа

MiniShop3 позволяет настроить обязательные поля и правила валидации для каждого способа доставки. Например, для курьерской доставки можно требовать полный адрес, а для самовывоза — только телефон.

Визуальный конструктор

Интерфейс настройки валидации предоставляет два режима работы:

Визуальный режим

Интуитивный конструктор правил:

  1. Нажмите Добавить поле
  2. Выберите поле из списка (сгруппированы по категориям: Заказ, Адрес)
  3. Добавьте правила валидации для поля
  4. Для правил с параметрами укажите значение

Правила отображаются в виде тегов (chips), которые можно удалять кликом по крестику.

JSON режим

Переключатель позволяет перейти в режим ручного редактирования JSON:

json
{
  "phone": "required",
  "email": "required|email",
  "city": "required|min:2",
  "street": "required|min:3",
  "building": "required"
}

Это удобно для:

  • Копирования правил между доставками
  • Использования сложных правил с регулярными выражениями
  • Импорта/экспорта конфигурации

Доступные поля для валидации

Поля заказа

ПолеОписание
order_commentКомментарий к заказу

Поля адреса

ПолеОписание
first_nameИмя
last_nameФамилия
phoneТелефон
emailEmail
countryСтрана
indexПочтовый индекс
regionРегион/область
cityГород
metroСтанция метро
streetУлица
buildingДом/строение
entranceПодъезд
floorЭтаж
roomКвартира/офис
commentКомментарий к адресу
text_addressПолный адрес текстом

Правила валидации

MiniShop3 использует библиотеку rakit/validation для валидации данных.

Базовые правила

ПравилоОписаниеПример
requiredОбязательное полеrequired
nullableПоле может быть nullnullable
presentПоле должно присутствовать (даже пустое)present
acceptedЗначение должно быть "yes", "on", "1", trueaccepted

Типы данных

ПравилоОписаниеПример
emailВалидный emailemail
urlВалидный URLurl
ipIP адрес (v4 или v6)ip
ipv4IPv4 адресipv4
ipv6IPv6 адресipv6
numericЧисловое значениеnumeric
integerЦелое числоinteger
booleanБулево значениеboolean
arrayМассивarray
jsonВалидный JSONjson

Строковые правила

ПравилоОписаниеПример
alphaТолько буквыalpha
alpha_numБуквы и цифрыalpha_num
alpha_dashБуквы, цифры, дефис, подчёркиваниеalpha_dash
alpha_spacesБуквы и пробелыalpha_spaces
uppercaseТолько заглавные буквыuppercase
lowercaseТолько строчные буквыlowercase

Правила с параметрами

ПравилоОписаниеСинтаксис
minМинимальная длина строки или значение числаmin:3
maxМаксимальная длина строки или значение числаmax:100
betweenЗначение в диапазонеbetween:1,10
digitsТочное количество цифрdigits:6
digits_betweenКоличество цифр в диапазонеdigits_between:4,8
inЗначение из спискаin:pickup,courier,post
not_inЗначение НЕ из спискаnot_in:test,demo
sameСовпадает с другим полемsame:email_confirm
differentОтличается от другого поляdifferent:old_password
regexСоответствует регулярному выражениюregex:/^[0-9]{6}$/

Правила для дат

ПравилоОписаниеСинтаксис
dateВалидная дата в форматеdate:Y-m-d
afterДата после указаннойafter:2024-01-01
beforeДата до указаннойbefore:2025-12-31

Условные правила

ПравилоОписаниеСинтаксис
required_ifОбязательно, если другое поле = значениюrequired_if:delivery,courier
required_unlessОбязательно, если другое поле ≠ значениюrequired_unless:delivery,pickup
required_withОбязательно, если указано другое полеrequired_with:phone
required_withoutОбязательно, если НЕ указано другое полеrequired_without:email
required_with_allОбязательно, если указаны ВСЕ поляrequired_with_all:city,street
required_without_allОбязательно, если НЕ указано НИ ОДНО полеrequired_without_all:phone,email

Примеры конфигураций

Курьерская доставка

Требуется полный адрес:

json
{
  "first_name": "required|min:2",
  "last_name": "required|min:2",
  "phone": "required|regex:/^\\+?[0-9]{10,15}$/",
  "email": "required|email",
  "city": "required|min:2",
  "street": "required|min:3",
  "building": "required",
  "room": "required_if:building_type,apartment"
}

Самовывоз

Минимум данных для связи:

json
{
  "first_name": "required|min:2",
  "phone": "required"
}

Почтовая доставка

Требуется индекс и полный адрес:

json
{
  "first_name": "required",
  "last_name": "required",
  "phone": "required",
  "index": "required|digits:6",
  "region": "required",
  "city": "required",
  "street": "required",
  "building": "required"
}

Доставка в постамат

Только контактные данные:

json
{
  "first_name": "required",
  "phone": "required|regex:/^\\+?[0-9]{10,15}$/",
  "email": "required|email"
}

Комбинирование правил

Правила комбинируются через символ |:

json
{
  "email": "required|email",
  "phone": "required|numeric|min:10|max:15",
  "index": "nullable|digits:6"
}

Сообщения об ошибках

Валидатор автоматически генерирует сообщения об ошибках на языке интерфейса. Пользователь увидит понятное сообщение, например:

  • "Поле Email обязательно для заполнения"
  • "Поле Телефон должно содержать не менее 10 символов"
  • "Поле Индекс должно состоять из 6 цифр"

API

Получение правил валидации

GET /api/v1/order/delivery/validation-rules?delivery_id=1

Ответ:

json
{
  "success": true,
  "data": {
    "phone": "required",
    "city": "required|min:2",
    "street": "required"
  }
}

Получение обязательных полей

GET /api/v1/order/delivery/required-fields?delivery_id=1

Ответ:

json
{
  "success": true,
  "data": ["phone", "city", "street"]
}

Используйте эти endpoints для динамического обновления формы заказа при смене способа доставки.