Для добавления выбранных значений множественного свойства в корзину с пересчетом цены в системе 1C-Bitrix необходимо выполнить следующие шаги:
1. Получить выбранные значения множественного свойства.
Для этого можно использовать методы класса CIBlockElement или CIBlockPropertyEnum, в зависимости от того, где хранятся значения свойства (в элементе инфоблока или в отдельной таблице).
Пример получения выбранных значений множественного свойства с использованием CIBlockElement:
$elementId = 123; // ID элемента инфоблока $propertyCode = "PROPERTY_CODE"; // символьный код свойства $selectedValues = array(); $rsProp = CIBlockElement::GetPropertyValues( CIBlock::GetByID($elementId)->Fetch()['IBLOCK_ID'], array('ID' => $elementId), true, array('ID', $propertyCode) ); while ($arProp = $rsProp->Fetch()) { if (isset($arProp[$propertyCode]) && is_array($arProp[$propertyCode])) { foreach ($arProp[$propertyCode] as $value) { $selectedValues[] = $value; } } }
2. Пересчитать цену, учитывая выбранные значения свойства.
Для этого можно использовать событие "OnSaleComponentOrderOneStepOrderProps" или "OnSaleComponentOrderProperties" и добавить в обработчик расчет стоимости дополнительных опций, основываясь на выбранных значениях множественного свойства.
Пример обработчика события "OnSaleComponentOrderOneStepOrderProps":
AddEventHandler("sale", "OnSaleComponentOrderOneStepOrderProps", "calculatePropertyPrice"); function calculatePropertyPrice(&$arUserResult, $arParams) { $propertyCode = "PROPERTY_CODE"; // символьный код свойства $selectedValues = $arUserResult['ORDER_PROP'][$propertyCode]; $additionalPrice = 100; // дополнительная цена за каждое выбранное значение if (is_array($selectedValues)) { $additionalCost = count($selectedValues) * $additionalPrice; $arUserResult['ORDER_PRICE'] += $additionalCost; $arUserResult['ORDER_TOTAL_PRICE'] += $additionalCost; } }
В данном примере мы получаем выбранные значения свойства из массива $arUserResult['ORDER_PROP']. Затем, если значения являются массивом, мы считаем дополнительную стоимость, умножая количество выбранных значений на цену за каждое значение. После этого мы добавляем эту стоимость к общей цене заказа ($arUserResult['ORDER_PRICE'] и $arUserResult['ORDER_TOTAL_PRICE']).
3. Отобразить пересчитанную цену в корзине.
Для этого можно модифицировать шаблон компонента корзины или использовать событие "OnSaleBasketItemRefresh".
Пример модификации шаблона компонента корзины:
$basketItems = CSaleBasket::GetList( array(), array('FUSER_ID' => CSaleBasket::GetBasketUserID(), 'LID' => SITE_ID, 'ORDER_ID' => 'NULL'), false, false, array('ID', 'PRODUCT_ID', 'NAME', 'PRICE', 'QUANTITY') ); while ($item = $basketItems->Fetch()) { $basketProperty = CSaleBasket::GetPropsList( array('SORT' => 'ASC'), array('BASKET_ID' => $item['ID']) ); while ($property = $basketProperty->Fetch()) { if ($property['CODE'] == 'PROPERTY_CODE') { $item['PRICE'] += $additionalPrice * count($property['VALUE']); break; } } // Вывод информации о товаре: $item['NAME'], $item['PRICE'], $item['QUANTITY'] }
В данном примере мы получаем список товаров в корзине и проходим по каждому товару. Затем, используя метод CSaleBasket::GetPropsList, получаем значения свойств товара и находим нужное свойство по его коду. Если свойство найдено, мы изменяем цену товара, прибавляя к ней дополнительную стоимость, умноженную на количество выбранных значений свойства.
Приведенные примеры являются общими и должны быть адаптированы в зависимости от специфики вашего проекта и требований. Необходимо заменить "PROPERTY_CODE" на символьный код свойства, а также установить правильные значения дополнительной цены.