Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Изменить цену

00 голосов
6
Код из init.php Не работает. Само событие срабатывает, но цена не изменяется.
Код
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", Array("MyClass", "OnAfterIBlockElementUpdateHandler"));
class MyClass
{
    function OnAfterIBlockElementUpdateHandler(&$arFields)
    {
        CModule::IncludeModule("catalog");
        CModule::IncludeModule("sale");
        CPrice::Update(31294, array("PRICE" => '2000.00'));  
    }  
}
Хотя в Командной строке PHP, в админке битрикса, три строчки кода, которые изменяют цену, работают:
Код
CModule::IncludeModule("catalog");
CModule::IncludeModule("sale");
CPrice::Update(31294, array("PRICE" => '2000.00'));
В чем дело? Полно примеров нашел подобного кода - должно работать, а у меня не работает.
спросил 18 Окт, 13 от ister14ka (160 баллов)

6 Ответы

00 голосов
У изменения цены своё событие: OnBeforePriceUpdate
ответил 11 Ноя, 13 от Euphemiya (100 баллов)
00 голосов
Цитата
xdypx пишет:
Само событие срабатывает, но цена не изменяется
При этом элемент инфоблока Вы правите из админки или из скрипта?
ответил 18 Фев, 14 от Pomnep (13,960 баллов)
00 голосов
Цитата
Евгений Жуков пишет:
Цитата
xdypx пишет:
Само событие срабатывает, но цена не изменяется
При этом элемент инфоблока Вы правите из админки или из скрипта?
А разве есть разница? По-моему, строка
Код
CPrice::Update(31294, array("PRICE" => '2000.00'));
в любом случае не поменяет цену, т.к. после события OnAfterIBlockElementUpdate будет вызвано событие OnBeforePriceUpdate и перепишет цену
ответил 09 Июнь, 14 от Euphemiya (100 баллов)
00 голосов
Есть. Работа с ценами в форме редактирования инфоблока.
Цитата
Mikhail Petrov пишет:
в любом случае не поменяет цену, т.к. после события OnAfterIBlockElementUpdate будет вызвано событие OnBeforePriceUpdate и перепишет цену
Не обязательно. Только в том случае, если на OnBeforePriceUpdate тоже есть свой обработчик.
ответил 07 Окт, 14 от Pomnep (13,960 баллов)
00 голосов
Цитата
Евгений Жуков пишет:
Есть. Работа с ценами в форме редактирования инфоблока .
Цитата
Mikhail Petrov пишет:
в любом случае не поменяет цену, т.к. после события OnAfterIBlockElementUpdate будет вызвано событие OnBeforePriceUpdate и перепишет цену
Не обязательно. Только в том случае, если на OnBeforePriceUpdate тоже есть свой обработчик.
Тогда у меня возник вопрос:
Выгрузка из 1С на сайт.
Я создаю обработчик события OnBeforeIBlockElementUpdate, там с помощью функции  CPrice::Update задаю цену , исходя из свойств элемента инфоблока, с помощью функции CPrice::GetList смотрю, что она действительно задалась, радуюсь сему факту, а потом обнаруживаю, что в итоге цена не поменялась.
Долго гуглил, наконец, найдя событие OnBeforePriceUpdate, написал ему обработчик и всё заработало.
Исходя из этого я пришёл к выводу, что после обработки событий  OnBeforeIBlockElementUpdate/OnAfterIBlockElementUp­date вызывается обработчик, встроенный или кастомный, события OnBeforePriceUpdate и перезаписывает цену.
ответил 08 Фев, 15 от Euphemiya (100 баллов)
00 голосов
Нет. В импорте та же последовательность действий, что и в форме - обработка полей и свойств элемента через CIBlockElement, затем - обработка цен через CPrice. Соответственно, для каждого класса вызываются свои обработчики.
Вообще вешать на события инфоблока обработчики, изменяющие цены можно только в одном случае - если Вы точно уверены, что следом не будет вызван CPrice.
ответил 20 Май, 15 от Pomnep (13,960 баллов)

Похожие вопросы

+1 голос
2 ответов
спросил 03 Авг, 17 от аноним
0 голосов
1 ответ
спросил 29 Сен, 16 от loony (540 баллов)
0 голосов
3 ответов
спросил 17 Март, 14 от Vofka (100 баллов)