Свой обработчик для службы доставки

Алексей Будагов,
Свой обработчик для службы доставки

Расчет стоимости доставки курьером по своей формуле, кратко и по шагам

  1. Идем в настройки модуля интернет-магазин (/bitrix/admin/settings.php) и меняем путь к обработчикам

    Путь к собственным обработчикам расширенных систем доставки: /local/php_interface/include/sale_delivery/
  2. Создаем файл delivery_courier.php в /local/php_interface/include/sale_delivery/. Название должно содержать id доставки после нижнего подчеркивания, не знаю для чего, видимо тут так заведено :) Пишем в файл необходимый минимум:

    CModule::IncludeModule("sale");
    
    AddEventHandler("sale", "onSaleDeliveryHandlersBuildList", array('CFTeaCourier', 'Init'));
    
    class CFTeaCourier
    {
    	function Init()
    	{
    		return array(
    			/* Основное описание */
    			"SID" => "courier",
    			"NAME" => "Доставка курьером",
    			"DESCRIPTION" => "Доставка в течении дня",
    			"DESCRIPTION_INNER" => "Доставка в течении дня",
    			"BASE_CURRENCY" => COption::GetOptionString("sale", "default_currency", "RUB"),
    			"HANDLER" => __FILE__,
    
    			/* Методы обработчика */
    			"DBGETSETTINGS" => array("CFTeaCourier", "GetSettings"),
    			"DBSETSETTINGS" => array("CFTeaCourier", "SetSettings"),
    			"GETCONFIG" => array("CFTeaCourier", "GetConfig"),
    			"COMPABILITY" => array("CFTeaCourier", "Compability"),
    			"CALCULATOR" => array("CFTeaCourier", "Calculate"),
    
    			/* Список профилей доставки */
    			"PROFILES" => array(
    				"courier" => array(
    					"TITLE" => "По городу",
    					"DESCRIPTION" => "Доставка в течении дня",
    					"RESTRICTIONS_WEIGHT" => array(0), // без ограничений
    					"RESTRICTIONS_SUM" => array(0), // без ограничений
    				),
    			)
    		);
    	}
    
    	/**
    	 * настройки обработчика
    	 */
    	function GetConfig()
    	{
    		$arConfig = array(
    			"CONFIG_GROUPS" => array(),
    			"CONFIG" => array(),
    		);
    
    		return $arConfig;
    	}
    
    	/**
    	 * подготовка настроек для занесения в базу данных
    	 */
    	function SetSettings($arSettings)
    	{
    		foreach ($arSettings as $key => $value) {
    			if (strlen($value) > 0) {
    				$arSettings[$key] = doubleval($value);
    			} else {
    				unset($arSettings[$key]);
    			}
    		}
    
    		return serialize($arSettings);
    	}
    
    	/**
    	 * подготовка настроек, полученных из базы данных
    	 */
    	function GetSettings($strSettings)
    	{
    		return unserialize($strSettings);
    	}
    
    	/**
    	 * метод проверки совместимости
    	 */
    	function Compability($arOrder, $arConfig)
    	{
    		return array('courier');
    	}
    
    	/**
    	 * собственно, рассчет стоимости
    	 */
    	function Calculate($profile, $arConfig, $arOrder, $STEP, $TEMP = false)
    	{
    		return array(
    			"RESULT" => "OK",
    			"VALUE" => 100
    		);
    	}
    }
  3. Переходим в список служб доставки (/bitrix/admin/sale_delivery_service_list.php) и добавляем новую автоматизированную доставку, обработчиком в которой будет созданная нами доставка (в delivery_courier.php)

    Получим то, что на скриншоте в шапке статьи

  4. Добавляем расчет доставки по формуле в метод Calculate. Я буду считать так: к заказу будет прибавляться такая сумма, что бы стоимость заказа была кратна 50 рублей, но минимум +20р.

    /**
     * собственно, рассчет стоимости
     */
    function Calculate($profile, $arConfig, $arOrder, $STEP, $TEMP = false)
    {
    	$sumResult = 0;
    	$sum = floatval($arOrder['PRICE']);
    	$o = $sum%50;
    	if ($o > 0)  {
    		$s = 50-$o;
    		if ($s < 20) {
    			$sumResult = $s+50;
    		} else {
    			$sumResult = $s;
    		}
    	}
    	return array(
    		"RESULT" => "OK",
    		"VALUE" => $sumResult
    	);
    }

    В итоге сумма заказа всегда "круглая"

    Пример расчета доставки
  5. На этом можно было бы закончить, но правильнее вынести значения "50" и "20" в настройки, а так же вынести текстовые фразы в lang файлы.

    Добавляем настройки в метод GetConfig:

    /**
     * настройки обработчика
     */
    function GetConfig()
    {
    	$arConfig = array(
    		"CONFIG_GROUPS" => array(
    			"all" => 'Настройки стоимости',
    		),
    		"CONFIG" => array(
    			'DELIVERY_ROUND' => array(
    				"TYPE" => "STRING",
    				"DEFAULT" => "50",
    				"TITLE" => 'Округление суммы заказа',
    				"GROUP" => "all",
    			),
    			'DELIVERY_MIN_PRICE' => array(
    				"TYPE" => "STRING",
    				"DEFAULT" => "20",
    				"TITLE" => 'Минимальная стоимость доставки',
    				"GROUP" => "all",
    			),
    		),
    	);
    
    	return $arConfig;
    }
  6. Обновляем наш метод Calculate

    /**
     * собственно, рассчет стоимости
     */
    function Calculate($profile, $arConfig, $arOrder, $STEP, $TEMP = false)
    {
    	if ($arConfig["DELIVERY_ROUND"]["VALUE"] == 0) {
    		$arConfig["DELIVERY_ROUND"]["VALUE"] = 1;
    	}
    	$sumResult = 0;
    	$sum = floatval($arOrder['PRICE']);
    	$o = $sum%$arConfig["DELIVERY_ROUND"]["VALUE"];
    	if ($o > 0)  {
    		$s = $arConfig["DELIVERY_ROUND"]["VALUE"]-$o;
    		if ($s < $arConfig["DELIVERY_MIN_PRICE"]["VALUE"]) {
    			$sumResult = $s+$arConfig["DELIVERY_ROUND"]["VALUE"];
    		} else {
    			$sumResult = $s;
    		}
    	}
    	return array(
    		"RESULT" => "OK",
    		"VALUE" => $sumResult
    	);
    }

    Получаем:

    скриншот с настройками
Опубликовано 21 Апреля 2017 | Обновлено 13 Октября 2017
делаюИМ, интернет-магазин, разработчику, API

Возврат к списку

Комментарии
Николай
11 Авг 2017
а как сделать чтобы вместо цены всегда была была надпись, к примеру: Стоимость доставки рассчитывается менеджером после оформления заказа.?
Алексей Будагов
Алексей Будагов
11 Авг 2017
Николай, нужно кастомизировать шаблон страницы заказа. Проще сделать бесплатную доставку, в описании добавить что "Стоимость доставки рассчитывается менеджером после оформления заказа." и скрыть цену (0 руб) с помощью css например.