Вроде все правильно, делал по аналогии с . В целях отладки вызов вынесен за пределы цикла, а так подарков может быть несколько штук. Пробовал разные методы добавления в корзину и разные события, все равно не работало
Переделал, все равно не срабатывает CSaleBasket::Add($arPresentFields);
Код
AddEventHandler("sale", "OnBasketAdd", Array("Presents","AddPresentToBasket"));
class Presents
{
protected static $handlerDisallow = false;
public static function AddPresentToBasket($ID,&$arFields)
{
/* проверяем, что обработчик уже запущен */
if (self::$handlerDisallow)
return;
/* взводим флаг запуска */
self::$handlerDisallow = true;
$VALUES = array();
$res = CIBlockElement::GetProperty(PRODUCTION_IBLOCK_ID, $arFields['PRODUCT_ID'], "sort", "asc", array("CODE" => "GIFTS_ELEMENT"));
while ($ob = $res->GetNext())
{
$id_presents[] = $ob['VALUE'];
}
foreach ($id_presents as $present) {
$arPresentFields = Array (
"PRODUCT_ID" => $present,
"PRICE" => 0,
"LID" => $arFields['LID'],
"NAME" => $arFields['MAME'],
"CURRENCY"=>$arFields['CURRENCY'],
);
CSaleBasket::Add($arPresentFields);
}
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/111.txt', var_export(CSaleBasket::Add($arPresentFields),true));
/* вновь разрешаем запускать обработчик */
self::$handlerDisallow = false;
}
}
В отладку результат выполнения этой функции - 0. При этом в /bitrix/modules/sale/mysql/basket.php функция add возвращает ненулевое значение, а если добавить подарочный товар в корзину, купив его как обычный товар, цена у него 0