Чекаут магазина: изменения плагинов доставки

Это ознакомительная версия описания изменений взаимодействия с плагинами расчета стоимости доставки. Топик будет корректироваться и обновляться недостающими деталями.

Типизация вариантов доставки

В developer preview версии фреймворка вводятся понятие типа варианта доставки, который может принимать одно из следующих значений.

  • waShipping::TYPE_TODOOR — доставка до двери (курьером)
  • waShipping::TYPE_PICKUP — самовывоз из пункта выдачи заказов/магазина/офиса
  • waShipping::TYPE_POST — доставка почтовой службой
Новые атрибуты плагина доставки

В описании атрибутов плагина в plugin.php появляются следующие ключи:

  • services_by_type — флаг того, что плагин умеет работать в режиме разделения вариантов доставки по их типу.
  • type — тип плагина доставки, если все возможные варианты доставки одного типа.
Расширенная информации о вариантах доставки от метода calculate

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

В зависимости от типа информация о варианте дополняется специфичными для указанного типа данными.

Самовывоз waShipping::TYPE_PICKUP

Информация для каждого варианта такого типа заполняется массивом [custom_data][pickup] со следующей структурой:

  • id string
  • lat float широта
  • lng float долгота
  • name string название
  • description string (HTML) описание
  • way string (HTML) shop
  • additional string (HTML) комментарии
  • timezone string временая зона, например Europe/Moscow
  • schedule расписание
  • payment поддерживаемые способы оплаты в следующем формате
    • string[string] массив вариантов оплаты с ключами из числа констант waShipping::PAYMENT_TYPE_*
  • photos string[] массив URL-ов изображений пункта выдачи; в полноценном варианте массив массивов с ключами uri, title, description
  • storage срок хранения заказа
  • interval mixed[] Доступные интервалы времени доставки.
Курьер waShipping::TYPE_TODOOR

Информация для каждого варианта такого типа заполняется массивом [custom_data][todor] со следующей структурой:

  • id string
  • interval mixed[] Доступные интервалы времени доставки.
Почта waShipping::TYPE_POST

Специфичной информации для вариантов доставки почтой пока не определено

Новые атрибуты для всех вариантов доставки
  • delivery_date string|string[] Дата доставки или интервал дат доставки в формате SQL DATETIME.
  • service string Название службы доставки. Используется, например, плагинами-агрегаторами для указания конечной компании, выполняющей доставку.
Новые методы
customFieldsForService(waOrder $order, $service)

Расширяет метод customFields (по умолчанию, результат совпадает), позволяя возвращать набор дополнительных полей, специфичных для конкретного варианта доставки $service.

Для получения HTML полей ввода используется класс waHtmlControl, поэтому доступен контроль над этими полями через соответствующие механизмы. Например, возможность указать стили, css классы, шаблоны вывода и так далее. Подробнее в документации waHtmlControl

Для типа доставки waShipping::TYPE_TODOOR рекомендуется использовать дополнительное поле с ключом desired_delivery указав ему тип waHtmlControl::DATETIME. Введенные пользователем данные будут доступны для просмотра и редактирования.

Напомним, что в случае, если поле может влиять на стоимость доставки, ему необходимо выставить флаг $field['data']['affects-rate'] = true;, чтобы изменение значения поля приводило к пересчету стоимости доставки и её возможности.

requestedAddressFieldsForService($service)

Расширяет метод requestedAddressFields (по умолчанию, результат совпадает), позволяя возвращать набор полей адреса, специфичных для конкретного варианта доставки $service.

Напомним, что поля, обязательные для расчета стоимости доставки помечаются флагом $field['cost']=true;, а обязательные для ввода $field['required']=true;

Передача габаритов отправления.

Для каждого элемента отправления указываются габариты в полях height,width, length если они определены для элемента и приложение поддерживает передачу габаритов.

Параметры total_height, total_width и total_length передаются в том случае, если приложение рассчитало общие габариты отправления.

Shop — хук для расчета общих габаритов

Параметры, передаваемые в событие shipping_package:

  • array[] mixed $items
  • float[string][] $items[]['weight'] Item `weight` property
  • float[string][] $items[]['height'] Item `height` property
  • float[string][] $items[]['width'] Item `width` property
  • float[string][] $items[]['length'] Item `length` property

Результат работы каждого плагина:

  • array[string] $return array package data
  • array[string]float $return['callback'] Callback to calculate total properties
  • array[string]float $return['weight'] Calculated total package weight
  • array[string]float $return['height'] Calculated total package height
  • array[string]float $return['width'] Calculated total package width
  • array[string]float $return['length'] Calculated total package length

Если плагин возвращает callback, то при расчете он вызывается с теми же параметрами, что и событие.

Размерность габаритов отправления.

Метод allowedLinearUnit возвращает строковое обозначения размерности, в которой ожидаются линейные размеры. Поддерживаются следующие варианты размерности:

  • m — метр
  • cm — сантиметр
  • mm — мм
  • in — дюйм
  • ft — фут
  • yd — ярд
  • km — километр
  • mi — миля
Проверка поддержки приложением передачи габаритов

В коде класса плагина можно проверить настройки приложения по передаче габаритов с помощью такого кода: $this->getAdapter()->getAppProperties('dimensions'). Если всё настроено - результатом будет true, если поддерживается, но не настроено, то false, если же поддержки нет, то null

Сроки готовности отправления к передаче в службу доставки.

При расчете стоимости доставки дополнительно передается срок готовности заказа к передаче в службу доставки.

/** @var string $departure_datetime SQL DATETIME */
$departure_datetime = $this->getPackageProperty('departure_datetime');

6 ответов

  • 5
    Syrnik.com 1 ноября 2018 19:34 #

    Надо добавить waShipping::TYPE_UNKNOWN и написать адаптер для "старых" расчетных плагинов, которые не поддерживают новые возможности. И выводить их на отдельной вкладке (типа "Другие способы доставки"). А то сейчас они тупо не показываются.

    Туда, возможно, переедут всякие транспортные компании, везущие до склада на ж/д станции и прочие "менеджер позвонит и всё расскажет".

    • +1
      EnsoStudio EnsoStudio 3 ноября 2018 03:08 #

      Сначала идея понравилась, но плагинов доставки не так уж много и большинство из них за авторством WA т.ч. проще уж их обновить чем писать адаптеры.

  • 2
    Syrnik.com 15 ноября 2018 03:16 #

    Проверка поддержки приложением передачи габаритов В коде класса плагина можно проверить настройки приложения по передаче габаритов с помощью такого кода: $this->getAdapter()->getAppProperties('dimensions'). Если всё настроено - результатом будет true, если поддерживается, но не настроено, то false, если же поддержки нет, то null

    По факту, если:

    • null — приложение не поддерживает
    • false — приложение поддерживает, но не настроено ничего
    • true — приложение поддерживает, настроена передача габаритов каждого вложения в плагин доставки, но не настроен внешний плагин, рассчитывающий общие габариты отправления. То есть свойства total_* будут пустыми (null) 
    • (string) — приложение поддерживает, настроена передача габаритов каждого вложения в плагин доставки, настроен внешний плагин, рассчитывающий общие габариты отправления. Строка — это id внешнего плагина. В свойствах total_length, total_width и т.д. должны быть значения общих габаритов отправления
  • 1
    Владислав Горлов Webasyst 31 октября 2018 19:44 #

    Поддержкой новых возможностей обзавелись плагины доставки Курьер, Яндекс.Доставка и Почта России.

    Ознакомиться с изменениями можно в github-е.

    • +1
      EnsoStudio EnsoStudio 31 октября 2018 23:09 #
      waShipping::TYPE_POST — доставка почтовой службой

      это по сути тоже самое что и

      waShipping::TYPE_PICKUP — самовывоз из пункта выдачи заказов/магазина/офиса

      также идешь, также забираешь.

      в чем принципиальное отличие в WA будет?

      description string (HTML) описание

      а в Ваших темах используется comment

      • +1

        А в новом уже description. Возможно, вариативность названий будет исправлено на уровне кода.

        • 0
          EnsoStudio EnsoStudio 1 ноября 2018 14:18 #

          Высыпайся и смотри внимательно еще раз.

          • +1

            Это для нового режима оформления заказа, онотличается в ряде моментов

            • +1
              EnsoStudio EnsoStudio 1 ноября 2018 17:39 #

              ну а со старым то как быть? делать проверку в плагинах из-за бага в темах так себе решение.

              • +1

                Еще раз смотрим на формат описания деталей: 

                $new_rate['custom_data']['pickup']['description'] 
                $old_rate['description']

                А вообще, в методе waShipping::getRates мы можем исправить нехороший эффект вызванный тем, что разработчики тем использовали comments, а разработчики плагинов description практически без болезненных ощущений для перфекционистов.

                • +1
                  EnsoStudio EnsoStudio 1 ноября 2018 18:30 #

                  сами накосячили в докунтации, а потом обвинили партнеров, так держать!

                • +1
                  Syrnik.com Syrnik.com 1 ноября 2018 18:50 #

                  Да всю дорогу $rate['comment'] использовали. description никто никогда не показывал, так же, как min_rate и max_rate

      • +1
        Syrnik.com Syrnik.com 11 ноября 2018 23:59 #

        TYPE_POST и TYPE_PICKUP, видимо, чтоб люди не путались, плюс для почтовых отделений невозможно показать маркер на карте (не во всех плагинах, в бесплатном нельзя).

        Но ситуация усугубляется тем, что для некоторых городов и  отправителей-юрлиц доступны также почтовые услуги "Курьер Онлайн" (доставка до двери курьером почты за +100р.) и "Посылка онлайн" (возможность выбрать и получить в любом удобном почтовом отделении, а не в том, чей почтовый индекс указал). Поэтому вписать в эту структуру сторонний почтовый плагин — задача не для слабонервных. Ну, посмотрим, что там в плагине Я.Доставки с этим сделают, ЯДост тоже эти почтовые услуги умеет.

        В противовес этому не всегда есть гео-координаты пунктов выдачи. Насколько помню ТК Энергия и GTD координаты своих складов не предоставляют. У GTD еще и адрес фиг вытащишь.

        Поэтому решил пока не дёргаться с поддержкой этого нового чекаута. Ну ещё и потому, что если для какого-то способа расчёта нужен почтовый индекс, то поле с индексом должно быть обязательным — не думаю, что пользователей это обрадует.

        • +1
          EnsoStudio EnsoStudio 15 ноября 2018 11:52 #

          Координаты можно получить по адресу с помощью waMapYandex (не помню точно название).

          Координаты почтовых отделений я получаю отдельным запросом через api почты рф.

  • 1
    EnsoStudio 31 октября 2018 23:24 #

    В остальном все отлично.

    От себя добавлю что хорошо бы еще привести поля и значения в бекенде и фронтенде к единому виду, а то по сути выполняется одно и тоже действие, но приходится делать 2 метода - даже формат значений отличается.

    +добавьте в плагины доставки хотя бы install/uninstall.php + cli контроллеры (некоторые службы доставки отдают "матрасы" по 5мб, хотелось бы повесить обновление таких "жырных" процессов на крон).

    • +1

      Длительные подготовительные операции плагинам доставки по расписанию будут доступны немного позднее.

      • +1
        EnsoStudio EnsoStudio 1 ноября 2018 14:21 #

        Могу ускорить процесс и скинуть свой cli контроллер для приложения webasyst который запускает cli контроллеры плагинов.

  • 1
    EnsoStudio 3 ноября 2018 02:28 #

    Да, еще совсем забыл о таком моменте как вариативность настроек плагина: скажем в приложении не реализована поддержка доп.полей (customFields), а часть настроек плагина относится к этим доп.полями, хотелось бы скрыть эти настройки в данном приложении.


    + добавить в waAppShipping константы свойств проверяемых с помощью waAppShipping::getAppProperties (массив 'shipping_plugins' в app.php).

  • 1
    EnsoStudio 4 ноября 2018 16:28 #

    + в настройки магазина добавьте область\город чтобы не прописывать их в каждом плагине.

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите