В битриксе есть два типа служб доставки: настраиваемые и автоматизированные. В статье будет описано создание обработчика автоматизированной службы доставки.
Что такое этот автоматизированный обработчик
Все предустановленные обработчики располагаются в папке /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"));
?>
В обрабочике есть код который считает содержимое корзины и в зависимости от цены предлагает разную стоимость доставки.
Взято отсюда и дополнено.