271  /  333

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

Просмотров: 577 (Статистика ведётся с 06.02.2017)

Средства системы позволяют кастомизировать и добавлять свои собственные службы доставки, причем в магазине на ядре 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, которое позволяет вмешаться в расчеты стоимости доставки:

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

Например, вы можете увеличить стоимость доставки на 100 единиц:

function myCalc(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().

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

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

  • \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.



1
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии