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

Почему не работает обработчик события изменения элемента инфоблока?

00 голосов
7
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", 'iteamoOnAfterIBlockElementUpdate');
AddEventHandler("iblock", "OnAfterIBlockElementAdd", 'iteamoOnAfterIBlockElementUpdate');
/**
*
*/
function iteamoOnAfterIBlockElementUpdate(&$arFields)
{
// ELEMENT ID
$PRODUCT_ID = $arFields['ID'];
$PRODUCT_IBLOCK_ID = $arFields['IBLOCK_ID'];

// GET WEIGHT PROPERTY VALUE
$arWeightProperty['CODE'] = 'weight'; // Код // IN KILOGRAMS
$arWeightProperty['VALUE'] = array_pop($arFields['PROPERTY_VALUES']['384']);
$arWeightProperty['VALUE'] = $arWeightProperty['VALUE']['VALUE'];
$arWeightProperty['VALUE'] = $arWeightProperty['VALUE'] * 1000; // TRANSLATION INTO GRAMS

// WEIGHT CATALOG FIELD UPDATE
CCatalogProduct::Update($PRODUCT_ID, Array("WEIGHT" => $arWeightProperty['VALUE']));
$_POST['CAT_BASE_WEIGHT'] = $_REQUEST['CAT_BASE_WEIGHT'] = $arWeightProperty['VALUE'];
global $DB;
$strSql ="UPDATE `b_catalog_product` SET `WEIGHT` ='" . $arWeightProperty['VALUE'] . "' WHERE `ID` =" . $PRODUCT_ID . " LIMIT 1";
$res = $DB->Query($strSql, false, $err_mess.__LINE__);

return $arFields;
}
спросил 25 Май, 13 от M0rB (160 баллов)

7 Ответы

00 голосов
У Вас не подключен в обработчике модуль торгового каталога - не отработает класс CCatalogProduct. Да и прямые запросы к базе могут привести к потере данных.
ответил 25 Май, 13 от Pomnep (13,960 баллов)
00 голосов
Или потому что закомментированы строки:
Код
// AddEventHandler("iblock", "OnAfterIBlockElementUpdate", 'iteamoOnAfterIBlockElementUpdate');
// AddEventHandler("iblock", "OnAfterIBlockElementAdd", 'iteamoOnAfterIBlockElementUpdate'); 
ответил 26 Май, 13 от JIETYHOK (2,260 баллов)
00 голосов
Цитата
Михаил Митрофанов пишет:
Или потому что закомментированы строки:

Код
// AddEventHandler("iblock", "OnAfterIBlockElementUpdate", 'iteamoOnAfterIBlockElementUpdate');

// AddEventHandler("iblock", "OnAfterIBlockElementAdd", 'iteamoOnAfterIBlockElementUpdate'); 


В коде все норм) После мучений уже заккоментировал, так что дело не в этом.
ответил 19 Авг, 13 от M0rB (160 баллов)
00 голосов
Цитата
Евгений Жуков пишет:
У Вас не подключен в обработчике модуль торгового каталога - не отработает класс CCatalogProduct. Да и прямые запросы к базе могут привести к потере данных.

Подключал модуль Sale!
Да и без него работает строка
CCatalogProduct::Update($PRODUCT_ID, Array("WEIGHT" => $arWeightProperty['VALUE']));
ПРоверено!
Если в конце функции обработчика вставить die(), то все работает при возвращении на страницу!
В этом то и загадка.
ответил 19 Ноя, 13 от M0rB (160 баллов)
00 голосов
Цитата
Алексей Тертых пишет:
Если в конце функции обработчика вставить die(), то все работает при возвращении на страницу!

Не понял.
ответил 27 Фев, 14 от Pomnep (13,960 баллов)
00 голосов
Цитата
Алексей Тертых пишет:
Если в конце функции обработчика вставить die(), то все работает при возвращении на страницу!

Значит обработчик работает, проблема в Вашем коде, отлаживайте его работу вне обработчика.
ответил 19 Июнь, 14 от JIETYHOK (2,260 баллов)
00 голосов
Алексей, а у вас вот прямо всегда происходит изменение элемента инфоблока со всеми перечисленными в обработчике полями? Уверен, что нет. Т.е. нужно добавить как минимум проверку на необходимость внесения изменений в элемент торгового каталога.

Также непонятен смысл прямого запроса. Или это вы уже начали экспериментировать?
И еще мелочь, но $arFields возвращать не нужно, его от вас никто не ждет, плюс ко всему $arFields передан в обработчик по ссылке.
ответил 18 Окт, 14 от Delp (7,220 баллов)

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

0 голосов
1 ответ
0 голосов
2 ответов
спросил 03 Дек, 13 от XIDAN (620 баллов)
0 голосов
8 ответов
спросил 15 Июнь, 13 от Asteria (1,840 баллов)
0 голосов
2 ответов
спросил 05 Апр, 14 от Valera21 (100 баллов)
0 голосов
5 ответов