Событие "Сохранение элемента инфоблока в админке" (и в публичке в режиме правки)

Рейтинг: 0  
Внедрено
Предложил Аглеримов Александр 27.02.2019 14:59:46

Событие "Сохранение элемента инфоблока в админке" (и в публичке в режиме правки)

Это необходимо когда у товара есть свойство "Цена в долларах" и цену товара в рублях нужно формировать на основе значения этого свойства.

Сейчас приходится задавать цену товара в обработчике события "Bitrix\Catalog\Model\Price::OnAfterUpdate". При этом приходится делать дополнительную работу -- получать текущую цену товара и сравнивать с той ценой, которую мы собираемся установить. Это необходимо делать для того, чтобы не возникала бесконечная рекурсия. При этом, если допустить ошибку в этом обработчике, то бесконечная рекурсия всё равно может наступить и сайт перестанет работать. Это неудобно и опасно.

Рейтинг: 0.8902  
Жуков Евгений 27.02.2019 15:15:48
Сейчас приходится задавать цену товара в обработчике события "Bitrix\Catalog\Model\Price::OnAfterUpdate".
Это ошибочное решение. Для модификации цены необходимо использовать событие Bitrix\Catalog\Model\Price::OnBeforeUpdate.
Это необходимо делать для того, чтобы не возникала бесконечная рекурсия
Изложите вашу реализацию подробней, пожалуйста.
Рейтинг: 0  
Аглеримов Александр 27.02.2019 15:26:40
Это ошибочное решение. Для модификации цены необходимо использовать событие Bitrix\Catalog\Model\Price::OnBeforeUpdate.
В обработчике события Bitrix\Catalog\Model\Price::OnBeforeUpdate можно изменить устанавливаемую цену?
Изложите вашу реализацию подробней, пожалуйста.
В обработчике события Bitrix\Catalog\Model\Price::OnAfterUpdate я делаю так:
1) получаю текущую цену товара
2) вычисляю новую цену на основе свойства Цена в долларах
3) сравниваю, не равны ли они (текущая и новая), если равны, то ничего не делаю
4) если не равны, то задаю цену функцией CPrice::SetBasePrice
Рейтинг: 0.8902  
Жуков Евгений 27.02.2019 15:31:49
В обработчике события Bitrix\Catalog\Model\Price::OnBeforeUpdate можно изменить устанавливаемую цену?
Да. Это обработчик, позволяющий модифицировать данные перед сохранением.
В обработчике события Bitrix\Catalog\Model\Price::OnAfterUpdate я делаю так:
1) получаю текущую цену товара
2) вычисляю цену на основе свойства Цена в долларах
3) сравниваю, не равны ли они, если равны, то ничего не делаю
4) если не равны, то задаю цену функцией CPrice::SetBasePrice
Рекомендую изучить https://dev.1c-bitrix.ru/community/blogs/vws/looping-event-handlers.php для понимания причин возникающей рекурсии.

Что касается вашего обработчика, то на событии OnBeforeUpdate вам нужно просто в любом случае модифицировать цену, не проверяя текущую.