и посмотрите как меняется цена у добавляемого товара. Структуру массива arFields при добавлении в корзину не помню, но сдается мне что вы не там цену меняете
Ваша задача не решается через использование событий корзины. После Ваших изменений $arFields все равно будет вызвана callback-функция для получения актуальной цены. Или писать свои callback-функции, или вешать свой обработчик события на OnGetOptimalPrice.
Не надо сверлить зубы через задний проход дрелью от Сваровски
Евгений Жуков, раз уж вы здесь, подскажите пожалуйста наиболее "правильную" реализацию механизма бандлов. Или возможно это уже появилось в функционале битрикса или уже находится в планах?
You must have chaos within you to give birth to a dancing star. Friedrich Nietzsche
Евгений Жуков, ситуация: Торговое предложение кладется в корзину с другой ценой если покупается вкупе с другим (или с несколькими другими) товарным предложением. Другие товарные предложения тоже кладутся с другой ценой (меньшей). Динамически создавать скидки очень неудобно. Нужно именно класть в корзину с другой ценой а скидку формировать именно на весь заказ (а не на каждое товарное предложение). Разумеется должно учитываться и количество товара. (например покупаем ноутбук, чем больше аксов к нему покупаем - тем дешевле цена ноутбука, тем дешевле сами аксы и тем больше скидка на весь заказ)/
Например, такие связки товаров организованы отдельным инфоблоком условно назовем его B. инфоблок ноутбуков (N) со свойством привязка к иблоку B. Иблок B имеет множ свойство - привязка к элементам иблока аксессуаров (A), где у каждого аксессуара в свойствах указан фиксированный размер скидки который он дает и на сам ноутбук и на самого себя.
на мой взгляд это решается либо: 1 обработчик OnGetOptimalPrice (если это возможно) 2 Свои колбек-функции 3 Заранее подготавливать в некой отдельной "корзине" товары бандла, и класть их в основную корзину по очереди через CSaleBasket::Add() с новыми ценами и DISCOUNT_PRICE, уникальным свойством (о котором чуть ниже), игнорируя колбеки.
первые два способа неудобны тем, что нужно выдергивать корзину, узнавая какие там товары лежат и я думаю куча других подводных камней.
В компоненте корзины, при ее редактировании пользователем, распозновать такие товары по уникальному служебному свойству товара (timestamp к примеру), если покупатель хочет изменить количество или удалить какой-то товар из корзины купленный через "отдельную корзину бандла".
минус 3го способа в том, что товары нужно класть в основную корзину одновременно. И если покупатель положит товары в корзину с отдельных страниц сайта, то будут куплены по обычной цене.
и еще один - минус в игнорировании как раз колбек-функции, то есть товар (или его цена) может оказаться неактуальным при долгой сессии и т.д.
You must have chaos within you to give birth to a dancing star. Friedrich Nietzsche
Евгений Жуков пишет: Ваша задача не решается через использование событий корзины. После Ваших изменений $arFields все равно будет вызвана callback-функция для получения актуальной цены. Или писать свои callback-функции, или вешать свой обработчик события на OnGetOptimalPrice.
Делая через OnGetOptimalPrice не получается при добавлении в корзину передать дополнительные параметры.
Тема конечно древняя но задача попалась похожая. Настроил единицы измерения товара как килограммы, добавляю товар один и тот же 2 раза по килограмму, в корзине вижу 1 позицию на 2 кг http://joxi.ru/KAxew4JsMnv9Xr а надо 2 по 1 кг (захотел купить я два торта по килограмму а тут засада). Добавил торговым предложениям новое свойство типа строка 'BASKET_HASHCODE' хэш позиции в корзине. В настройках комплексного компонента указал чтобы это свойство передавалось в корзину. Теперь вот таким кодом (в init.php) в момент добавления товара пытаюсь "уникализировать" переданную позицию.