Бортовой журнал Ктулху

Битрикс: создание обработчика автоматизированной службы доставки

В битриксе есть два типа служб доставки: настраиваемые и автоматизированные. В статье будет описано создание обработчика автоматизированной службы доставки.

Что такое этот автоматизированный обработчик

Все предустановленные обработчики располагаются в папке /bitrix/modules/sale/lang/ru/delivery/ . Свои обработчики следует располагать в папке /bitrix/php_interface/include/sale_delivery/ (этот путь можно изменить в свойствах модуля интернет-магазина).

Обработчик представляет собой класс определенной структуры со строкой подключения обработчика доставки по событию onSaleDeliveryHandlersBuildList.

Класс обработчика доставки должен иметь ряд методов, типы действий которых, описываются в методе Init класса.

Методы:

1. Init — происходит инициализации основных полей.

2. DBGETSETTINGS — метод считывания значений параметров.

3. DBSETSETTINGS — метод установки значений параметров.

4. GETCONFIG — определение конфигурации настроек (их можно разбить на табы).

5. COMPABILITY — проверка совместимости профилей обработчика с заказом.

6. CALCULATOR — расчет стоимости доставки.

Поля:

1. SID — Уникальный строковой идентификатор обработчика.
2. NAME — Название обработчика.
3. DESCRIPTION — Текстовое описание обработчика
4. DESCRIPTION_INNER — Внутреннее описание обработчика, отображаемое при конфигурации обработчика в Панели Управления.
5. BASE_CURRENCY — Идентификатор базовой валюты обработчика
6. HANDLER — Путь к файлу обработчика. Нужен для корректного автоматического копирования обработчика (ещё не реализовано). В подавляющем большинстве случаев достаточно значения __FILE__

битрикс автоматизированный обработчик доставки

битрикс автоматизированный обработчик доставки

Также должен быть задан хотя бы один профиль доставки.

<?
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("sale");
CModule::IncludeModule("iblock");
 
Class CDeliveryPlain 
{

 /**
 * Описние обработчика
 */
 function Init()
 {
 //настройки
 return array(
 "SID" => "Plain", // Идентификатор службы доставки
 "NAME" => "Курьер Красная Пресня",
 "DESCRIPTION" => "Описание его для клиентов сайта",
 "DESCRIPTION_INNER" => "Описание для администраторов сайта",
 "BASE_CURRENCY" => "RUR",
"HANDLER" => __FILE__,
/* Определение методов */
 "DBGETSETTINGS" => array("CDeliveryPlain", "GetSettings"),
 "DBSETSETTINGS" => array("CDeliveryPlain", "SetSettings"),
 "GETCONFIG" => array("CDeliveryPlain", "GetConfig"),
"COMPABILITY" => array("CDeliveryPlain", "Compability"),
 "CALCULATOR" => array("CDeliveryPlain", "Calculate"),
/* Список профилей */
 "PROFILES" => array(
 "all" => array(
 "TITLE" => "Без ограничений",
 "DESCRIPTION" => "Профиль доставки без каких-либо ограничений",
"RESTRICTIONS_WEIGHT" => array(0),
 "RESTRICTIONS_SUM" => array(0),
 ),
 )
 );
 }
/* Установка параметров */
 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 GetConfig()
 {
 $arConfig = array(
 "CONFIG_GROUPS" => array(
 "all" => "Параметры",
 ),
"CONFIG" => array(
 "DELIVERY_PRICE" => array(
 // "TYPE" => "STRING",
 // "DEFAULT" => '200',
 // "TITLE" => "Стоимость доставки",
 // "GROUP" => "all",
 )
 ),
 );
return $arConfig;
 }
/* Проверка соответствия профиля доставки заказу */
 function Compability($arOrder, $arConfig)
 {
 return array("all");
 }

 /* Калькуляция стоимости доставки*/
 function Calculate($profile, $arConfig, $arOrder, $STEP, $TEMP = false) 
 {
 // получать стоимость корзины
 // Выведем актуальную корзину для текущего пользователя
$arBasketItems = array();
$dbBasketItems = CSaleBasket::GetList(
 array(
 "NAME" => "ASC",
 "ID" => "ASC"
 ),
 array(
 "FUSER_ID" => CSaleBasket::GetBasketUserID(),
 "LID" => SITE_ID,
 "ORDER_ID" => "NULL"
 ),
 false,
 false,
 array("ID", "CALLBACK_FUNC", "MODULE", 
 "PRODUCT_ID", "QUANTITY", "DELAY", 
 "CAN_BUY", "PRICE", "QUANTITY")
 );
 while ($arItems = $dbBasketItems->Fetch())
 {
 if (strlen($arItems["CALLBACK_FUNC"]) > 0)
 {
 CSaleBasket::UpdatePrice($arItems["ID"], 
 $arItems["CALLBACK_FUNC"], 
 $arItems["MODULE"], 
 $arItems["PRODUCT_ID"], 
 $arItems["QUANTITY"]);
 $arItems = CSaleBasket::GetByID($arItems["ID"]);
 }
$arBasketItems[] = $arItems;
 }
// Печатаем массив, содержащий актуальную на текущий момент корзину
 foreach ($arBasketItems as $num => $item) {
 $TotalSumArr[] = $item['PRICE']*$item['QUANTITY']; 
 }
// сумма всех товаров с учетом количества
 $TotalSum = array_sum($TotalSumArr);
 // в зависимости от суммы делать наценку за доставку
 // от 1500 до 5000 доставка 750руб
 if($TotalSum >= 1500 && $TotalSum <= 5000)
 $DeliveryCost = 750;
 elseif($TotalSum >= 5000)
 $DeliveryCost = 0;
return array(
 "RESULT" => "OK",
 "VALUE" => $_SESSION['ORDER_DELIVERY_PRICE'],
 "VALUE" => $DeliveryCost
 );
 }
}
AddEventHandler("sale", "onSaleDeliveryHandlersBuildList", array("CDeliveryPlain", "Init"));
?>

В обрабочике есть код который считает содержимое корзины и в зависимости от цены предлагает разную стоимость доставки.

Взято отсюда и дополнено.