Свой обработчик для службы доставки
Расчет стоимости доставки курьером по своей формуле, кратко и по шагам
-
Идем в настройки модуля интернет-магазин (/bitrix/admin/settings.php) и меняем путь к обработчикам
Путь к собственным обработчикам расширенных систем доставки: /local/php_interface/include/sale_delivery/
-
Создаем файл 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 ); } }
-
Переходим в список служб доставки (/bitrix/admin/sale_delivery_service_list.php) и добавляем новую автоматизированную доставку, обработчиком в которой будет созданная нами доставка (в delivery_courier.php)
Получим то, что на скриншоте в шапке статьи
-
Добавляем расчет доставки по формуле в метод 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 ); }
На этом можно было бы закончить, но правильнее вынести значения "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; }
Обновляем наш метод 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 ); }
Получаем:
Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.