Скидка с ID=2 существует. Но, открывая товар и в корзине вижу старую цену без скидки. Если менять цену товара "PRICE" => 100, цена меняется... А скидки ,независимо от заполнения массива DISCOUNT не появляется.
Ссылка на документацию блог на который меня перекинули в задаче форума ведет на список аж 6 ти !!! событий работы со скидкой, но нигде нет описание или примера как это все использовать.
когда только вышла 12 версия битрикса, у меня всё сломалось. я написал в ТП, мне подсказали вышеописанный синтаксис и сказали, что инфу в документации обновят позднее.
в итоге во-первых, у меня такой синтаксис работает во-вторых, похоже год это недостаточно позднее
Mikhail Petrov написал: когда только вышла 12 версия битрикса, у меня всё сломалось. я написал в ТП, мне подсказали вышеописанный синтаксис и сказали, что инфу в документации обновят позднее.
в итоге во-первых, у меня такой синтаксис работает во-вторых, похоже год это недостаточно позднее
Что именно не обновили? Сейчас на странице метода актуальная информация как о структуре возвращаемых данных, так и о параметрах. Что касается обработчиков событий метода - больше года внутри метода результаты обработчиков приводятся к требуемому формату (если это вообще возможно).
Не надо сверлить зубы через задний проход дрелью от Сваровски
Александра Плотникова написал: не хватает описания формата массивов для полей PRICE, DISCOUNT, DISCOUNT_LIST
Документация будет дополнена. Сразу могу сказать, что ключи PRICE и DISCOUNT устарели и нами в продукте больше не используются. PRICE - с версии catalog 15.0.2, DISCOUNT - с catalog 12.5.0
Не надо сверлить зубы через задний проход дрелью от Сваровски
Евгений Жуков, спасибо. Так вот, наверно, почему не работает переопределение цены/скидки в 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/