Skip to content
  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"
}

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

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

Кастомные поля валидации ​

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

json
{
  "phone": "required",
  "email": "required|email",
  "agreement": "required|accepted"
}

Кастомные поля (agreement и другие, не входящие в стандартный набор) сохраняются в черновике заказа между шагами order/add и order/submit. При создании заказа они передаются в события msOnBeforeCreateOrder / msOnCreateOrder через параметр customFields.

Чекбоксы

На фронтенде чекбоксы отправляют состояние input.checked ('1' или '0'), а не статический атрибут value. Это обеспечивает корректную работу правила accepted.

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

Поля заказа ​

ПолеОписание
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 для динамического обновления формы заказа при смене способа доставки.