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

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

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

В 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) описание пути
  • additional string (HTML) комментарии
  • timezone string временая зона, например Europe/Moscow
  • schedule расписание в виде строки (HTML) или структурированный массив расписаний на ближайшие дни [weekdays][] со следующей структурой:
    • type string (workday|weekend) тип дня
    • start_work string SQL DATETIME начало работы
    • end_work string SQL DATETIME окончание работы
    • additional string любая информация, которую надо вывести в чекауте. Ограничена 64 символами.
  • 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');
update: начиная с версии Shop 8.1 срок готовности заказа к отправлению передается и для пошагового оформления заказа, а не только для режима оформления заказа на одной странице.
Управление кешированием.

Для отключения кеширования результатов работы плагинов доставки на уровне кода приложения shop необходимо определить константу WA_DISABLE_FUNCTIONS_CACHE, например, в классе systemConfig.

18 ответов

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

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

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

    • +1
      enso_studio@mail.ru enso_studio@mail.ru 3 ноября 2018 03:08 #

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

  • 2
    enso_studio@mail.ru 4 ноября 2018 16:28 #

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

  • 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 и т.д. должны быть значения общих габаритов отправления
  • 2
    Павел Трофимов 23 ноября 2018 05:50 #

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

    name string название - название все равно отсюда не берется. Берется из элемента name уровнем выше

    description string (HTML) описание - HTML не поддерживает. В вёрстке почему-то название поля Адрес
    way string (HTML) описание пути -  HTML не поддерживает

    additional string (HTML) комментарииHTML не поддерживает

    schedule расписание в виде строки (HTML)-  почему-то в вёрстке информация выводится под названием поля, а не справа как везде. HTML под вопросом

    • +1
      enso_studio@mail.ru enso_studio@mail.ru 23 ноября 2018 10:31 #
      HTML не поддерживает.

      Поля записываются в data-* аттрибуты, видимо поэтому html и не поддерживается, в принципе он и не нужен ососбо.

      name string название - название все равно отсюда не берется. Берется из элемента name уровнем выше

      А service задан?

      Не в курсе что записывать в additional? Я честно говоря не понял зачем это поле нужно если есть description.

      • +2
        Павел Трофимов Павел Трофимов 23 ноября 2018 15:54 #

        в принципе он и не нужен ососбо.

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

        Не в курсе что записывать в additional? Я честно говоря не понял зачем это поле нужно если есть description.

        у Desctiption есть проблема в том, что в итоге в интерфейсе оно выводится под заголовком Адрес  =)  Поэтому в additional запихал всякую дополнительную инфу, которая на адрес никак не тянет.

    • +1

      Результирующее name собирается из названия плагина, названия варианта доставки (в custom-data оно дублируется на самом деле) и названия service.

      Про экранирование строк - после долгого периода неэкранирования наступил период "экранируем все", по этим моментам мы еще пройдемся.

      • +1
        Павел Трофимов Павел Трофимов 23 ноября 2018 15:58 #

        Результирующее name собирается из названия плагина, названия варианта доставки (в custom-data оно дублируется на самом деле) и названия service.

        Да. Но я про ту часть, которая именно name. У меня для старого чекаута там html использован, поэтому в новом поле я от него избавился. Однако в названии все равно оставался вариант для старого чекаута с экранированным html.

  • 2
    Syrnik.com 29 ноября 2018 16:58 #

    schedule расписание в виде строки (HTML) или структурированный массив расписаний на ближайшие дни [weekdays][] со следующей структурой:
    - type string (workday|weekend) тип дня
    - start_work string SQL DATETIME начало работы
    - end_work string SQL DATETIME окончание работы

    А можно как-то сделать, чтоб было просто расписание по дням недели, а не "ближайшие дни"? Ибо расписание есть, а вот работает-ли ПВЗ 1 января никто не знает, кроме этого самого ПВЗ

    Или это расписание надо в свой произвольный HTML засунуть и пусть темоделы крутятся, как хотят?

  • 2
    MDcode 10 декабря 2018 11:27 #

    1. А когда появится карта выбора ПВЗ? Выбирать из списка >500 ПВЗ, мягко говоря не удобно. 

    2. cli контроллеры, есть ли новости когда будут реализованы? 

    2.1. Да и по хорошему во многих плагинах доставки просится штатная поддержка моделей для работы с БД. Хранить списки ПВЗ, городов и т.д. в файлах размером 10Мб. не есть хорошо, а приходится

  • 2
    enso_studio@mail.ru 15 февраля 2019 13:15 #

    storage int: срок хранения заказа в днях

    оказался на проверку массивом.

  • 1
    Владислав Горлов Webasyst 31 октября 2018 19:44 #

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

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

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

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

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

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

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

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

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

      • +1

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

        • -1
          enso_studio@mail.ru enso_studio@mail.ru 1 ноября 2018 14:18 #

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

          • +1

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

            • +1
              enso_studio@mail.ru enso_studio@mail.ru 1 ноября 2018 17:39 #

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

              • +1

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

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

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

                • +1
                  enso_studio@mail.ru enso_studio@mail.ru 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
          enso_studio@mail.ru enso_studio@mail.ru 15 ноября 2018 11:52 #

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

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

  • 1
    enso_studio@mail.ru 31 октября 2018 23:24 #

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

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

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

    • +1

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

      • +1
        enso_studio@mail.ru enso_studio@mail.ru 1 ноября 2018 14:21 #

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

  • 1
    enso_studio@mail.ru 3 ноября 2018 02:28 #

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


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

  • 1
    Дмитрий Елшин Webasyst 23 ноября 2018 14:05 #

    Update: оформление заказа на одной странице кеширует результаты от плагинов доставки в блоке "Доставка".

    Добавление в SystemConfig.class.php константы WA_DISABLE_FUNCTIONS_CACHE — отключает кеширование. Важно помнить, что это может сказаться на производительности.

    • +1
      enso_studio@mail.ru enso_studio@mail.ru 23 ноября 2018 16:39 #

      зачем такие извращения с константами? есть же wa-config/config.php

      • +1
        Дмитрий Елшин Дмитрий Елшин Webasyst 23 ноября 2018 17:41 #

        Файловая операция? :-(

        Так уж сложилось, что многие штуки во Фреймворке, типа этой, работают на константах.

        • +1
          enso_studio@mail.ru enso_studio@mail.ru 23 ноября 2018 19:38 #
          Так уж сложилось, что многие штуки во Фреймворке

          Когда это они "сложились"? судя по git'y эти WA_* константы добавлены недавно)) Я бы еще понял если без этого было бы никак, а так - халтура. Итак уже в коде куча какие-то непонятных хвостов и заброшенных параметров.

          Зачем плодить эти константы создаваемые хрен знает где и как, которые еще и толком незадокументированы, когда можно собрать все в один конфиг который удобно и просто изменять/отслеживать/документировать? 

          return array(
              'backend_url' => 'webasyst',
              'mod_rewrite' => true,
              'debug' => false, 
              // ...
              'debug_js' => false, // DEBUG_WA_JS
              'debug_assets' => false, // DEBUG_WA_ASSETS
              'user_strict_password' => false, // WA_STRICT_PASSWORD_CHECK
              'user_strict_ban' => false, // WA_STRICT_BAN_CHECK
              'cache_event' => true, // !WA_EVENT_CLEAR_CACHE
              'cache_funct' => true, // !WA_DISABLE_FUNCTIONS_CACHE
          );

    • +1
      Павел Трофимов Павел Трофимов 23 ноября 2018 18:33 #

      Там с кешированием результатов расчета доставки какая-то беда... Если глянуть под отладчиком когда, при каких обстоятельствах и сколько раз дергаются плагины доставки для расчета, можно умом тронуться в поисках логики =)  Посмотрите еще разок внимательно этот момент.

  • 1
    Павел Трофимов 25 ноября 2018 03:10 #

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

  • 1
    enso_studio@mail.ru 27 ноября 2018 01:25 #

    Что-то не работает у меня плагин с новым оформлением заказа :(

    plugin.php

    return [
        'name' => 'Test',
        'description' => 'Test shipping plugin',
        'icon' => 'img/icon.png',
        'logo' => 'img/logo.png',
        'version' => '1.0.0',
        'vendor' => 1099015,
        'services_by_type' => true,
    ];

    testShipping.class.php:

    class testShipping extends waShipping
    {    
        public function allowedCurrency()
        {
            return 'RUB';
        }
        public function allowedWeightUnit()
        {
            return 'kg';
        }
        public function allowedAddress()
        {
            return [[
                'country' => 'rus',
                'city'    => ['Москва', 'Мытищи', 'Воронеж',],
            ]];
        }
        public function requestedAddressFields()
        {
            return [
                'country' => ['cost' => true, 'hidden' => true, 'value' => 'rus'],
                'region'  => ['cost' => true, 'required' => true],
                'city'    => ['cost' => true, 'required' => true],
            ];
        }
        public function requestedAddressFieldsForService($service)
        {
            $fields = $this->requestedAddressFields();
            
            if ($service['type'] == self::TYPE_TODOOR) {
                $fields['street'] = ['required' => true];
            } elseif ($service['type'] == self::TYPE_POST) {
                $fields['zip'] = ['required' => true];
            }
            
            return $fields;
        }
        protected function calculate()
        {
            return '@todo calc';
        }
    }

    В адресе доставки указываю РФ, Моск.обл, Мытищи, но способ доставки не отображается.

    Вообще не понял что стало с форматом данных возвращаемых allowedAddress, в плагине sd:

    return ['country' => ['rus']];

    а в yandexdelivery:

    return [['country' => 'rus']];

    • +1
      enso_studio@mail.ru enso_studio@mail.ru 27 ноября 2018 09:35 #

      Да забыл написать, тема Default 3.0 последняя.

      • +1
        Syrnik.com Syrnik.com 27 ноября 2018 17:30 #

        Чтобы отображался, надо вернуть вариант со стоимостью. Ты возвращаешь строку вместо массива, это распознаётся, как сообщение об ошибке расчёта, результат не показывается.

        • +1
          enso_studio@mail.ru enso_studio@mail.ru 28 ноября 2018 10:45 #

          Это кстати тоже проблема - раньше я возвращал текст вида "ошибка, обновите страницу", а теперь пользователь не видит этого сообщения.

          • +1
            Syrnik.com Syrnik.com 28 ноября 2018 13:07 #

            Угу. Вебассистам об этом говорилось — ошибка ошибке рознь, может нет доставки вовсе,  а может каких-то данных не хватает, почтового индекса например. Но за месяц до релиза поздно пить боржоми и менять логику работы ¯\_(ツ)_/¯

  • 1
    enso_studio@mail.ru 28 ноября 2018 23:38 #

    Поле payment есть почему-то только у TYPE_PICKUP, хотя должно быть у всех типов.

    Аналогичная ситуация с полем id - оно должно быть у всех типов

    Поле "Доступные интервалы времени доставки" (interval) в TYPE_PICKUP не требуется.

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

    • +1
      Павел Трофимов Павел Трофимов 29 ноября 2018 09:51 #

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

      Мне кажется, TYPE_POST && TYPE_PICKUP хоть и похожи по сути, но все же правильно сделали, что их развели. В сознании обывателя это разные штуки. Почта - это почта. Пункт самовывоза - это нечто иное. Хоть и соглашусь, что абстрагировавшись от привычек, это достаточно близкие вещи.
      Касательно выбора: у Почты (по крайней мере РФ) есть один незыблемый идентификатор почтового отделения: индекс. И не указав конкретный индекс никто не может гарантировать, что посылка придет в нужное отделение. Кроме того, некоторые отделения или вовсе не выдают посылки, или выдают их по каким-то параметрам (например, до определенного веса/объема/определенных видов отправлений). Т.о. предоставив пользователю выбирать отделение на карте никто не сможет гарантировать, что приедет оно именно туда. Кроме того, получается что плагин доставки должен знать координаты почтового отделения, индекс соответствующий каждому почтовому отделению, и т.д. Исходя из этого, считаю правильным такое разделение, хоть и соглашусь, что по сути своей почта достаточно близка к ПВЗ.

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

        У почты РФ есть услуга "Посылка онлайн" в рамках которой можно заказать доставку в любое почтовое отделение города.

        • +1
          Павел Трофимов Павел Трофимов 29 ноября 2018 15:45 #

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

          • +1
            Syrnik.com Syrnik.com 29 ноября 2018 15:53 #

            Это не доп. услуга, а отдельный тариф. я просто неверно выразился

      • +1
        enso_studio@mail.ru enso_studio@mail.ru 29 ноября 2018 15:34 #

        Дарю решение всех твоих "проблем"

        /**
         * @param array $address
         * @param int $limit
         * @param array $filters
         * @return array
         */
        public function getPostOffices(array $address, $limit = 3, array $filters = [])
        {
            $net = new waNet([
                'format' => waNet::FORMAT_JSON,
                'priority' => [waNet::TRANSPORT_CURL],
                'log' => __FUNCTION__.'.log',
                'expected_http_code' => null,
            ]);
            
            if (empty($address['zip'])) {
                $formatter = new waContactAddressForMapFormatter;
                $address = $formatter->format(['data' => $address]);
                $address = urlencode($address['with_street']);
            } else {
                $address = $address['zip'];
            }
            
            $data = [
                'address' => $address,
                'currentDateTime' => date('Y-m-d H:i:s'),
                'limit' => $limit,
                'filters' => $filters,
                'offset' => 0,
            ];
            $offices = (array) $net->query(
                'https://www.pochta.ru/suggestions/v1/suggestion.find-postoffices-by-address',
                $data,
                waNet::waNet::METHOD_POST
            );
            if ($offices) {
                $offices = array_column($offices, 'addressSource', 'postalCode');
            }
            return $offices;
        }

      • +1
        enso_studio@mail.ru enso_studio@mail.ru 29 ноября 2018 15:36 #

        Почта давно уже обновила api и можно легко получить список подходящих отделений.

        • +1
          Павел Трофимов Павел Трофимов 29 ноября 2018 15:46 #

          Т.е. все плагины Почты обязаны быть external и пользовать их API, а если не пользуешь то и делать тебе в SS8 нечего? =)  Никто ж не спорит что можно. Речь ведь об универсальном механизме, а не о частных случаях.

          • +1
            enso_studio@mail.ru enso_studio@mail.ru 29 ноября 2018 16:18 #
            обязаны быть external

            не обязаны, внешние запросы не обязательно exrternal, exrternal запросы это вообще другая песня.

            и пользовать их API

            А как ты собрался стоимость доставки получать? 

            если не пользуешь то и делать тебе в SS8 нечего

            тут свободный рынок - не хочешь улучшать плагин? - пожалуйста, сиди без денег :)

            Речь ведь об универсальном механизме, а не о частных случаях.

            Никто не говорит что эти поля были обязательными для заполнения, есть - используем, нет - работаем по старинке.

            Если TYPE_POST останется в текущем виде, то проще его игноририровать и использовать TYPE_PICKUP.

        • +1
          Syrnik.com Syrnik.com 29 ноября 2018 15:52 #

          это unfair use. В смысле это для их автодополнения задумано, а не использования всеми подряд. плюс сайт почты часто либо совсем валяется, либо глючит

          Вот их официальный API https://www.pochta.ru/support/...

          про подсказки там нет ничего. Стало быть они в любой момент могут поменять как URL для запросов, так и просто IP забанить.

          • +1
            enso_studio@mail.ru enso_studio@mail.ru 29 ноября 2018 16:29 #

            Я в курсе. Для работы с API нужно регистрировать компанию которой у меня нет. Этот метод из бекенд плагина т.ч. проблем не возникает. Заменить запрос особого труда не составляет, у авторизованых пользователей API меньше ограничений. Это просто пример того что никаких проблем с получением данных по отделениям нет и нечего выдумывать проблемы там где их нет.

        • +1
          Syrnik.com Syrnik.com 29 ноября 2018 16:07 #

          Вообще обсуждение сползло на какие-то частности. В целом стало получше, чем было. Не без недостатков, конечно. Улучшат со временем.

          Пока можно выбор почтового отделения для "Почты онлайн" засунуть в раздел с ПВЗ. штатная "Ядоставка", кажется, так и делает (не хочу проверять).

          Думаю, что будут клиенты, которые захотят отделять "ПВЗ" и "Почтомат" в разные разделы, например.

  • 1
    enso_studio@mail.ru 10 декабря 2018 12:02 #

    Вопрос по

    $this->getPackageProperty('departure_datetime');

    "Дополнительное время на комплектацию" (assembly_time) уже включено или добавляется вручную?

    Если у каждого варианта доставки свое время доставки заказа, то нужно добавлять его к $this->getPackageProperty('departure_datetime')?

    Есть вариант попроще чем?

    $delivery_date = strtotime(
        '+'.$service_type['processing'].' hour', 
        strtotime($this->getPackageProperty('departure_datetime'))
    );

    В чем отличие 'est_delivery' от 'delivery_date' ?

    protected function calculate()
    {
        $departure_datetime = strtotime($this->getPackageProperty('departure_datetime'));
        $variants = [];
        foreach ($this->getServiceTypes() as $service_type) {
            // $service_type['processing'] - кол-во часов, требуемых на доставку заказа данным вариантом
            $delivery_date = strtotime(
                '+'.$service_type['processing'].' hour', 
                $departure_datetime
            );
            $variants[$service_type['id']] = [
                'id'            => $service_type['id'],
                // ...
                'est_delivery'  => wa_date('humandate', $delivery_date),
                'delivery_date' => self::formatDatetime($delivery_date),
                'type'          => $service_type['type'],
                'custom_data'   => [$service_type['type'] => []],
            ];
        }
        return $variants;
    }

    Подобные значения 'est_delivery', 'delivery_date' допустимы?

  • 1
    enso_studio@mail.ru 10 декабря 2018 12:02 #

    waShipping::getPackageProperty('departure_datetime') не использует waShipping::formatDatetime(), а должен бы.

  • 1
    BNP (Дмитрий) 9 января 2019 03:36 #

    Поясните пожалуйста следующий момент:

    В описании поля вижу

    additional string (HTML) комментарии

    Вроде указано что можно использовать HTML, но при этом в шаблоне вывода это поле эскейпится

    {if !empty($_additional)}
        <div class="wa-line wa-additional-item">
            <div class="wa-label">[`More details`]:</div>
            <div class="wa-value">{$_additional|escape}</div>
        </div>
    {/if}

    Как так? А если я туда хочу ссылку положить?

  • 1
    enso_studio@mail.ru 10 февраля 2019 17:34 #

    payment поддерживаемые способы оплаты в следующем формате string[string] массив вариантов оплаты с ключами из числа констант waShipping::PAYMENT_TYPE_*

    как вообще это работает? не могу найти как получить например платежные плагины с PAYMENT_TYPE_CARD

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

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