Перейти к содержанию

Кастомизация служб доставок

Кастомизация

Средства системы позволяют кастомизировать и добавлять свои собственные службы доставки, причем в магазине на ядре D7 они представляют из себя классы. Следовательно, можно использовать механизм наследования. Для создания собственной службы доставки необходимо создать класс - наследник базового \Bitrix\Sale\Delivery\Services\Base.

Пример наследования для служб доставок:

class SimpleHandler extends \Bitrix\Sale\Delivery\Services\Base
{
    protected static $isCalculatePriceImmediately = true;
        protected static $whetherAdminExtraServiceShow = true;

    /**
    * @param array $initParams
    * @throws \Bitrix\Main\ArgumentTypeException
    */

    public function __construct(array $initParams)
    {
        parent::__construct($initParams);
    }
}

Система будет искать обработчик в следующих директориях:

self::$handlersDirectories = array(
    'LOCAL' = > '/local/php_interface/include/sale_delivery',
    'CUSTOM' = > '/bitrix/php_interface/include/sale_delivery',
    'SYSTEM' = > '/bitrix/modules/sale/handlers/delivery'
)

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

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

Дополнительно стоит отметить, что для служб доставок имеется событие onSaleDeliveryServiceCalculate, которое позволяет вмешаться в расчеты стоимости доставки (например, вы можете увеличить стоимость доставки на 100 единиц):

EventManager::getInstance()->addEventHandler(
    'sale',
    'onSaleDeliveryServiceCalculate',
    'myCalc'
);

function myCalc(\Bitrix\Main\Event $event)
{
    /** @var Delivery\CalculationResult $baseResult */
    $baseResult = $event->getParameter('RESULT');
    $shipment = $event->getParameter('SHIPMENT');

    $price = $baseResult->getDeliveryPrice() + 100;
    $baseResult->setDeliveryPrice($price);

    $event->addResult(
        new EventResult(
            EventResult::SUCCESS, array('RESULT' => $baseResult)
        )
    );
}

Важно! При создании службы доставки учитывайте тот факт, что сайт может быть как в кодировке utf-8, так и в кодировке cp-1251. Если производится обмен данными со службой доставки, то необходимо правильно менять кодировку при отправлении и получении данных. Здесь вам поможет метод \Bitrix\Main\Text\Encoding::convertEncoding().

Примечание: о работе с REST служб доставки читайте в отдельной главе

В данной главе рассмотрим принципы работы с REST служб доставки:

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

Стартовой точкой для менеджера может являться функционал принятия оплаты ("Принять

оплату в сделке") или создание дела на доставку.

Подробнее... .

Примеры служб доставок

В качестве примера служб доставок лучше всего подходят следующие:

  • \Sale\Handlers\Delivery\SimpleHandler (/bitrix/modules/sale/handlers/delivery/simple/handler.php) - простейший пример обработчика.
  • \Sale\Handlers\Delivery\SpsrHandler (/bitrix/modules/sale/handlers/delivery/spsr/handler.php) - вариант посложнее с использованием всех возможностей текущей архитектуры.

Для служб доставок существует механизм автоматического отслеживания идентификаторов отправления (трэкинг-номеров) (пример, как это реализовано для службы доставки СПСР: \Sale\Handlers\Delivery\SpsrTracking).

Рекомендации

Для запросов к сервису службы доставки рекомендуется использовать встроенный класс \Bitrix\Main\Web\HttpClient вместо сторонних расширений. Оптимальный формат обмена - json, так как возможно использовать встроенный класс \Bitrix\Main\Web\Json.

При обмене информацией с сервисами служб доставок зачастую необходимо передавать идентификаторы местоположений. Сопоставление идентификаторов местоположений интернет-магазина с идентификаторами местоположений служб доставок - задача нетривиальная. Как пример, используйте \Sale\Handlers\Delivery\Spsr\Location::mapStepless().

Чтобы не порождать лишних запросов к службе доставки и не замедлять работу сайта, желательно при возможности кешировать полученную от сервисов служб доставок информацию. Однако, делать это надо аккуратно во избежание побочных эффектов. Используйте \Sale\Handlers\Delivery\Spsr\Cache.

В случае возникновения ошибок и для отладки желательно записывать события, связанные с получением информации от служб доставок в системный журнал. Для этих целей используйте класс \CEventLog.