Евгений Жуков, спасибо. Так вот, наверно, почему не работает переопределение цены/скидки в OnGetOptimalPriceHandler? Пытаюсь скормить ему такой массив (return массива внутри обработчика)
А он все равно применяет все известные ему скидки согласно своим правилам:
Во-первых, я не вижу ключа RESULT_PRICE Во-вторых, в описании скидки уже ошибка - DISCOUNT_VALUE у вас 0, вместо 30 (если судить по названию) В-третьих (но это основное) - обработчик OnGetOptimalPrice не используется в публичке. Он будет задействован только в провайдере и выгрузке в Яндекс. Для публички (каталог товаров) используйте событие OnGetDiscount, которое возвращает список скидок
Не надо сверлить зубы через задний проход дрелью от Сваровски
Что то я совсем запутался. Изначально я искал информацию как изменить цену товара при добавлении его в корзину. Как сейчас это можно сделать? Есть работающий пример?
Евгений Жуков, спасибо за комментарии. 1) Как раз сейчас добавила RESULT_PRICE, но это ничего не изменило. 2) Массив в таком виде почему-то возвращает мне \Bitrix\Sale\Internals\DiscountTable (видела в документации, что это подкласс для внутреннего использования, но аналога ему не нашла).
3) и самая главная боль... с удовольствием использовала onGetDiscount на прошлой неделе, и всё прекрасно работало. Но на новых скидках это событие исчезло. При обращении в техподдержку мне посоветовали в качестве "аналога" использовать именно onGetOptimalPrice. Поэтому вторую неделю сижу и переписываю, чтобы вся эта схема работала с галкой "использовать только правила корзины".
Александра Плотникова написал: При обращении в техподдержку мне посоветовали в качестве "аналога" использовать именно onGetOptimalPrice.
Для страниц каталога не подходит.
Цитата
Александра Плотникова написал: Массив в таком виде почему-то возвращает мне \Bitrix\Sale\Internals\DiscountTable
Его надо привести к формату скидок торгового каталога. Вообще, какую задачу вы решаете? Если вы отдаете существующие скидки, может, проще их настроить?
Цитата
Дмитрий Дмитрук написал: Что то я совсем запутался. Изначально я искал информацию как изменить цену товара при добавлении его в корзину. Как сейчас это можно сделать? Есть работающий пример?
Если цена зависит только от товара - через свой провайдер. Если требуются данные корзины - надо делать через правила корзины (для корзины и оформления заказа - самый правильный вариант в любом случае).
Не надо сверлить зубы через задний проход дрелью от Сваровски
Евгений Жуков написал: Вообще, какую задачу вы решаете? Если вы отдаете существующие скидки, может, проще их настроить?
Должен получиться некий гибрид скидки на товар и накопительной системы. У клиента в зависимости от определенного свойства товара разные пороги скидок. То есть, например, на кошельки:
для клиентов с суммой заказов (+ текущая корзина) от 15000 скидка 20%
от 20000 30% и так далее.
Для "женских сумок" другие пороги. Кроме того, самому клиенту может быть присвоен порог скидки вручную для каждой категории (вне зависимости от суммы заказов). Сумму заказов (с учетом текущей корзины) и скидку, которую необходимо применить (из существующих), я определяю. Но применить её не получается. Причем изменение цены (в том числе при наполнении текущей корзины) должно сразу отображаться в карточке товара.
В обработчике onGetDiscountResult это работало примерно так:
Код
//до этого в OnGetDiscount мы получили цену товара и его категорию, от которой зависит тип скидки
public function OnGetDiscountResult(&$arResult){
if(self::$productPrice === null) return;
if(is_array(self::$productPrice)
&& isset(self::$productPrice['PRICE'])
&& self::$productPrice['PRICE'] > 0){
$price = new \MyNamespace\Classes\Handlers\Price();
self::$discountId = $price->getDiscount(self::$productCategory);
foreach($arResult as $key_discount => $discount){
if ($discount['ID']==self::$discountId) {
$needDiscount[0] = $discount;
$arResult = $needDiscount;
break;
}
}
}
self::$productPrice = null;
}
Этот код работал до переключения на "только правила корзины". Теперь, даже когда я отключаю эту галочку, создаваемые по старой схеме "Скидки на товар" вообще не применяются к товарам в каталоге.
Подскажите пожалуйста, тогда как быть, если нужно реализовать система нештатных скидок. Список скидок хранятся в инфоблоке, скидки с привязкой к элементам каталога.
Вопрос в том, каким методом я могу по всему сайту применять эти скидки или задавать другие цены товара?
Как я понял, OnGetOptimalPrice - работает только в корзине и при оформлении заказа (проверял, цены изменялись только там, в карточке товара и в списке товаров компонента catalog цены никак не изменялись).
Подскажите пожалуйста какими события или методами воспользоваться?
Если кому интересно, здесь есть пример использования провайдера совместно с обработчиком "OnGetOptimalPrice" для добавления в корзину с определенным типом цены (а не с наименьшей ценой из всех типов, как по умолчанию): http://estrin.pw/bitrix-d7-snippets/s/sale-add-to-basket-catalog-group/