276  /  333

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

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

Чтобы добавить собственную службу доставки, следует создать файл handler.php и в нем написать класс <Ваше_название>Handler для вашей службы доставки. Файл должен быть размещен в отдельной директории <ваше_название> в /local/php_interface/include/sale_delivery/ или в том разделе, который задан в настройках модуля Интернет-магазин с помощью параметра Путь к собственным обработчикам расширенных систем доставки (по умолчанию используется /bitrix/php_interface/include/sale_delivery/). Из данного файла система подключает вашу службу доставки автоматически.

Например, добавим службу доставки, зависящую от веса.

Для этого файл handler.php расположим в директории /bitrix/php_interface/include/sale_delivery/custom/ и в нем составим описание для класса соответственно CustomHandler. Класс наследуем от базового класса служб доставки:

<?
namespace Sale\Handlers\Delivery;

use Bitrix\Sale\Delivery\CalculationResult;
use Bitrix\Sale\Delivery\Services\Base;

class CustomHandler extends Base
{
	public static function getClassTitle()
		{
			return 'Доставка по весу';
		}
		
	public static function getClassDescription()
		{
			return 'Доставка, стоимость которой зависит только от веса отправления';
		}
		
	protected function calculateConcrete(\Bitrix\Sale\Shipment $shipment)
		{
			$result = new CalculationResult();
			$price = floatval($this->config["MAIN"]["PRICE"]);
			$weight = floatval($shipment->getWeight()) / 1000;
		
			$result->setDeliveryPrice(roundEx($price * $weight, 2));
			$result->setPeriodDescription('1 день');
		
			return $result;
		}
		
	protected function getConfigStructure()
		{
			return array(
				"MAIN" => array(
					"TITLE" => 'Настройка обработчика',
					"DESCRIPTION" => 'Настройка обработчика',"ITEMS" => array(
						"PRICE" => array(
									"TYPE" => "NUMBER",
									"MIN" => 0,
									"NAME" => 'Стоимость доставки за грамм'
						)
					)
				)
			);
		}
		
	public function isCalculatePriceImmediately()
		{
			return true;
		}
		
	public static function whetherAdminExtraServicesShow()
		{
			return true;
		}
}
?>

В классе определяем необходимые нам методы. Так, методы getClassTitle и getClassDescription содержат название и описание службы доставки. Метод calculateConcrete вызывается при расчете стоимости доставки, принимая в качестве параметра отгрузку. Метод getConfigStructure описывает параметры, которые необходимо спросить в интерфейсе у администратора.


Примечание: если класс с вашей службой доставки имеет произвольное название, лежит в произвольном файле, то для подключения вашей службы в файл init.php необходимо добавить следующий код:
function addCustomDeliveryServices()
{
    return new \Bitrix\Main\EventResult(
        \Bitrix\Main\EventResult::SUCCESS,
        array(
            '\Sale\Handlers\Delivery\CustomHandler' => '/ваш_путь_до_обработчика/имя_обработчика.php'
        )
    );
}

$eventManager->addEventHandler('sale', 'onSaleDeliveryHandlersClassNamesBuildList', 'addCustomDeliveryServices');

Дополнительные рекомендации

  • Обязательно учитывайте кодировку сайта. Если производится обмен данными со службой доставки, необходимо при этом правильно менять кодировку данных при отправлении и получении данных. В этом вам поможет метод \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) - вариант посложнее с использованием всех возможностей ядра D7.
  • Если вам необходимо наладить механизм автоматического отслеживания идентификаторов отправления (трэкинг-номеров), то используйте как пример службу доставки СПСР: \Sale\Handlers\Delivery\SpsrTracking.
  • Для запросов к сервису службы доставки рекомендуется использовать встроенный класс \Bitrix\Main\Web\HttpClient вместо сторонних расширений, например curl. Оптимальный формат обмена - json, так как возможно использовать встроенный класс \Bitrix\Main\Web\Json.
  • При обмене информацией с сервисами служб доставок зачастую необходимо передавать идентификаторы местоположений. Сопоставление идентификаторов местоположений интернет-магазина с идентификаторами местоположений служб доставок - задача нетривиальная. Как пример можно использовать \Sale\Handlers\Delivery\Spsr\Location::mapStepless();
  • Чтобы не порождать лишних запросов к службе доставки и не замедлять работу сайта, желательно по возможности кешировать полученную от сервисов служб доставок информацию. Однако, делать это надо аккуратно во избежание побочных эффектов. Как пример: \Sale\Handlers\Delivery\Spsr\Cache.
  • В случае возникновения ошибок и для отладки желательно иметь возможность записывать события, связанные с получением информации от служб доставок, в системный журнал. Для этого можно воспользоваться классом \CEventLog.


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

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