Сумма из свойства товаров в корзине и установка стоимости доставки при выборе доставки в 1С-Битрикс
Объясняю и показываю примеры решений разных задач с которыми сталкивался и сталкиваюсь в процессе работыСумма из свойства товаров в корзине и установка стоимости доставки при выборе доставки в 1С-Битрикс
Объясняю и показываю примеры решений разных задач с которыми сталкивался и сталкиваюсь в процессе работы
📅 14 ноября 2023
👁🗨 410
Решение выполнено на готовом решении Аспро: Лайтшоп версии 1.1.5
Используя событие компонента оформления заказа "OnSaleComponentOrderDeliveriesCalculated" в файле init.php напишем свой обработчик для изменения стоимости доставки при выборе конкретного способа доставки представленного в виде определенного района.
use Bitrix\Main\EventManager;
$eventManager = EventManager::getInstance();
$eventManager->addEventHandler('sale', 'OnSaleComponentOrderDeliveriesCalculated', 'calcDistrict');
function calcDistrict($order) {
$basket = $order->getBasket(); // Получаем корзину
foreach ($basket as $basket_item) {
$productIds[] = $basket_item->getProductId(); // Получаем ID всех товаров в корзине
}
$getElementsFromBasket = CIBlockElement::GetList(
false,
[
'IBLOCK_ID' => 48,
'ID' => $productIds
],
false,
false,
[
'PROPERTY_STORE'
]
);
while ($elementsFromBasket = $getElementsFromBasket->Fetch()) {
$arResultInit[] = $elementsFromBasket['PROPERTY_STORE_VALUE']; // Получаем ID магазинов из всех товаров в корзине
}
foreach ($arResultInit as $item) {
$getElements = CIBlockElement::GetList(
false,
[
'IBLOCK_ID' => 76,
'PROPERTY_STORE' => $item,
'ACTIVE' => 'Y'
],
false,
false,
[
'ID',
'NAME',
'PROPERTY_PRICE',
'PROPERTY_DISTRICT'
]
);
while ($elements = $getElements->Fetch()) {
if (empty($arResultInitDistrict[$elements['ID']])) {
$arResultInitDistrict[$elements['ID']] = $elements; // Получаем районы магазинов из всех товаров в корзине
}
}
}
$deliveryID = $order->getDeliveryIdList(); // Получаем ID выбранного способа доставки
switch ($deliveryID['0']) {
case '12':
$districtSelect = 'octiabrski';
break;
case '6':
$districtSelect = 'sovetskiy';
break;
case '7':
$districtSelect = 'dyemskiy';
break;
case '9':
$districtSelect = 'kirovskiy';
break;
case '10':
$districtSelect = 'kalininskiy';
break;
case '11':
$districtSelect = 'ordzhonikidzevskiy';
break;
case '13':
$districtSelect = 'leninskiy';
break;
}
foreach ($arResultInitDistrict as $district) {
if ($district['PROPERTY_DISTRICT_VALUE'] == $districtSelect) {
$sumDelivery += $district['PROPERTY_PRICE_VALUE'];
}
}
$shipmentCollection = $order->getShipmentCollection(); // Получаем все отгрузки
$shipment = $shipmentCollection->createItem(); // Добавляем отгрузку
$shipment->setBasePriceDelivery($sumDelivery); // Устанавливаем стоимость доставки
$order->doFinalAction(true); // Делаем перерасчет
}