Дата последнего изменения: 13.11.2023
Средства системы позволяют кастомизировать и добавлять свои собственные службы доставки, причем в магазине на ядре 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) ) ); }
В качестве примера служб доставок лучше всего подходят следующие:
/bitrix/modules/sale/handlers/delivery/simple/handler.php
) - простейший пример обработчика./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.