Новые возможности для разработчиков: доступ к свойствам отправления и управление состояниями отправки

В dev-ветке репозитория на «ГитХабе» опубликовано предварительное обновление фреймворка Webasyst для разработчиков. Оно добавляет новые возможности для создания плагинов доставки:
- доступ к расширенным свойствам элементов отправления
- управление состояниями отправки
Расширенные свойства элементов отправления
Для элементов отправления (items) расширен набор свойств: добавлены габариты (width, length, height) и артикул (sku).
Из поля params класса waShipping скопированы в отдельные атрибуты shipping_data и payment_data (по префиксу ключа shipping_data_*** и payment_data_*** соответственно).
Состояния отправления
Отправление — это экземпляр класса waOrder. Оно может находиться в одном из нескольких статусов, которые обозначаются новыми константами:
- STATE_DRAFT — отправление формируется или редактируется
- STATE_READY — отправление сформировано и готово к отправке
- STATE_SHIPPING — отправление передается службе доставки
- STATE_CANCELED — отправление отменено
Новые методы класса waShipping
setPackageState (waOrder $order, $state, $params = array())
Переводит отправление в указанный статус и возвращает результат в одном из следующих форматов:
- null — если плагин не поддерживает это состояние.
- string — одну строку с описанием ошибки для записи ее приложением в историю обработки заказа; HTML-теги допустимы, но не экранируется.
- array[string] — ассоциативный массив с данными, которые будут сохранены приложением в элемент shipping_data в информации о заказе. Исключение: view_data — строка для отображения в истории обработки заказа. HTML-теги допустимы, но не экранируются.
getStateFields($state, waOrder $order = null, $params = array())
Возвращает массив полей веб-формы, которые должен заполнить пользователь при переводе отправления в указанное состояние $state.
Значения заполненных полей копируются в аргумент $params['shipping_data'] при вызове метода setPackageState().
getAdapter()->getAppProperties($property_name = null)
Позволяет выяснить, насколько подробно приложение поддерживает возможности плагинов доставки.
Возвращает значения из параметра shipping_plugins, указанного в конфигурационном файле app.php. Раньше этот параметр мог быть только булевым, сейчас это может быть также ассоциативный массив обозначений функций, которые поддерживает приложение:
- desired_date — желаемая дата доставки (требуется, например, для плагина «Курьер»)
- draft — передача данных о черновике отправления
- ready — подтверждение данных отправления
- shipping — запрос на отправку отправления
- cancel — отмена отправления
Адаптация Shop-Script к новым возможностям
В конфигурационном файле app.php декларирована поддержка параметров shipping_plugins:
- desired_date
- draft
- ready
- cancel
В класс shopShipping добавлен статический метод getOrderData (array $order, waShipping $shipping_plugin = null).
В классе shopHelper общие части кода выделены в метод getWaOrder().
Изменения в потоке обработки заказов (workflow)
В конструкторе класса shopWorkflowAction для удобства инициализируются модели shopOrder***Model.
Добавлен новый метод setPackageState ($state, $order_id, $params = array()). Он переводит отправление, связанное с заказом, в указанное состояние и сохраняет результаты обмена данными с сервером службы доставки в параметры заказа. Эти параметры сохраняются в таблицу shop_order_params с префиксами shippingdata_***. Запись об этом также всегда добавляется в историю действия с заказом — вне зависимости от результата.
Как действия с заказами переводят отправления в новые состояния
- В состояние waShipping::STATE_DRAFT переводят действия create, edit и pay.
- В состояние waShipping::STATE_READY переводит действие ship.
- В состояние waShipping::STATE_CANCELED переводят действия delete и refund, а также действие edit, при котором пользователь выбирает способ доставки, настроенный с помощью другого плагина.
ship переводит в STATE_READY — как-то нелогично. Логичнее в STATE_SHIPPED наверное переводить.
О getStateFields.
А если нужны разные наборы полей, зависящие от выбранного варианта? например для курьера адрес, а для пвз еще что-нибудь. Можно, конечно, в waOrder заглянуть, но тогда что выводить если waOrder == null? :)