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

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

Откройте Пакеты → MiniShop3 → Настройки → Варианты доставки.

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

ПолеТипОписание
namestringНазвание способа доставки
descriptiontextОписание для покупателя
pricestringБазовая стоимость доставки (в БД — varchar(11), в расчёте приводится к числу)
weight_pricefloatСтоимость за единицу веса
distance_pricefloatСтоимость за единицу расстояния — в расчёте сейчас не используется (резервное поле)
free_delivery_amountfloatСумма заказа для бесплатной доставки
logostringПуть к изображению
positionintПорядок сортировки
activeboolАктивность
classstringPHP-класс обработчика
validation_rulesJSONПравила валидации полей
propertiesJSONJSON-свойства для своих данных обработчика

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

Каждый способ доставки связываете с нужными способами оплаты.

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

Когда покупатель выбирает доставку, список оплат фильтруется.

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

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

text
Итоговая стоимость = price + (weight_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(msOrder $order, msDelivery $delivery, 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.

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

Для каждого способа доставки задаёте обязательные поля и правила: полный адрес для курьера, телефон для самовывоза.

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

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

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

Правила отображаются тегами, удаляются кликом по крестику.

JSON-режим ​

Переключатель открывает ручное редактирование JSON:

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

В этом режиме правила копируют между доставками, задают regex и переносят JSON между установками.

Свои поля валидации ​

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

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Полный адрес текстом

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

Валидацию выполняет встроенный PipeRuleValidator (src/Services/Validation/PipeRuleValidator.php), внешние библиотеки не нужны. Правила комбинируются через |.

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

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

Типы данных ​

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

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

ПравилоОписание
alphaТолько буквы
alpha_numБуквы и цифры
alpha_dashБуквы, цифры, дефис, подчёркивание
alpha_spacesБуквы и пробелы
uppercaseТолько заглавные буквы
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}$/
extensionРасширение файлаextension:jpg,png
mimesMIME-тип файлаmimes:jpg,png

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

ПравилоОписаниеСинтаксис
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"
}

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

Сообщения по умолчанию английские (PipeRuleValidator::DEFAULT_MESSAGES): язык интерфейса они не читают. Настроить их можно через setValidationRules() / setValidationMessages() (OrderFieldManager) или properties доставки.

API ​

Оба GET-запроса требуют токен магазина: заголовок Bearer/MS3Token или кука ms3_token (query-параметр не принимается).

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

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

Ответ:

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

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

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

Ответ (карта поле → правила, только с required):

json
{
  "success": true,
  "data": {
    "requires": {
      "phone": "required",
      "city": "required",
      "street": "required"
    }
  }
}

Эти два запроса обновляют форму заказа при смене способа доставки.