Для разработчиков

СобытиеВызываетсяС версии
getModuleParametersпри инициализации модуля на странице заказа1.0.6
OnYandexBeforeCalculatePriceв начале расчета стоимости доставки1.2.0
OnYandexAfterCalculatePriceв конце расчета стоимости доставки1.2.0

События изменения параметров модуля

getModuleParameters

C помощью данного события можно корректировать геолокацию выдаваемых подсказок по местоположению.

Коды можно взять на сайте https://kladr-rf.ru/

Bitrix\Main\EventManager::getInstance()->addEventHandler("corsik.yadelivery", "getModuleParameters", 'newModuleParameters');
function newModuleParameters(&$arOptions)
{
    $arOptions['dadata']['geoLocation'] = [["kladr_id" => "50"], ["kladr_id" => "77"]];
}

События расчета стоимости доставки

Пример данных, приходящих в $data

$data = [
    'id' => 17,
    'action' => 'calculate',
    'delivery' => [
        'warehouse' => 'sklad',
        'start' => 'bolee-20-km-ot-mkad',
        'stop' => false,
    ],
    'order' => [
        'price' => 18473,
        'weight' => 2,
    ],
    'distance' => 29671.23991394043,
    'type' => 'out',
];
OnYandexBeforeCalculatePrice

С помощью данного события вы можете получить и изменить данные до начала расчета.

Bitrix\Main\EventManager::getInstance()->addEventHandler("corsik.yadelivery", "OnYandexBeforeCalculatePrice", 'onBeforeCalculate');
function onBeforeCalculate(&$data)
{
    $data['order']['price'] = $data['order']['weight'] > 10000 ? 500 : 500 * 0.1;
}
OnYandexAfterCalculatePrice

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

Для того, чтобы модуль выдал предупреждение и не продолжал дальнейший расчет стоимости необходимо выполнить следующие действия:

в переменнyю $price передать -1, а в $params массив с errors и вашим текстом ошибки.

Bitrix\Main\EventManager::getInstance()->addEventHandler("corsik.yadelivery", "OnYandexAfterCalculatePrice", 'onAfterCalculate');
function onAfterCalculate(&$price, $data, &$params)
{
 
    $lineDistance = $data['greatCircleDistance'] / 1000; // Линейное расстояние от начала зоны доставки до точки доставки
    $typeDelivery = $data['type']; // Тип доставки in - внутри зона, out - за пределами зон
    $deliveryDistance = $data['distance'] / 1000; // Получаем длина маршрута в километрах
    $deliveryPolygon = $data['delivery']['stop']; // Зон куда прошла доставка
    $orderPrice = $data['order']['price']; // Сумма заказа
 
    /**
     * Ограничение по минимальной стоимости заказа
     */
 
    if ($typeDelivery === 'in') {
        $minimalPrice = 0;
 
        if ($deliveryPolygon === 'do-10-km-ot-mkad' && $orderPrice < 500) {
            $price = -1;
            $minimalPrice = 500;
        }
 
        if ($deliveryPolygon === '10-20-km-ot-mkad' && $orderPrice < 800) {
            $price = -1;
            $minimalPrice = 800;
        }
 
        if ($price < 0) {
            $errorText = "<p>Доставка в выбранную зону осуществляется при заказа от <b>$minimalPrice</b> рублей</p>";
            $params = [
                'errors' => [
                    'modal' => $errorText,
                    'checkout' => $errorText
                ]
            ];
        }
    }
 
    /**
     * Ограничение по максимальной отдалённости за пределы зон
     */
    if ($typeDelivery === 'out' && $lineDistance > 30) {
        $price = -1;
        $errorText = "<p>К сожалению так далеко мы не доставляем</p>";
        $params = [
            'errors' => [
                'modal' => $errorText,
                'checkout' => $errorText
            ]
        ];
    }
}