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

добавление элемента в 2 инфоблока - проблема

00 голосов
3
Здравствуйте,
проблема такая: я создал обработчик который при добавлении элемента в любой ИБ создает элемент в специально созданном ИБ. Но почему-то при добавлении элемента - во втором ИБ начинает создаваться бесконечное множество элементов пока не нажать "отменить"..

Вот код в init.php:
Код
<?// регистрируем обработчик
AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("MyClass", "OnAfterIBlockElementAddHandler"));
class MyClass
{
    // создаем обработчик события "OnAfterIBlockElementAdd"
    function OnAfterIBlockElementAddHandler(&$arFields)
    {
                       if (CModule::IncludeModule("iblock")) 
                         { 

$el = new CIBlockElement;
$arLoadProductArray = Array(
  "IBLOCK_SECTION_ID" => 0,          // элемент лежит в корне раздела  
  "IBLOCK_ID"      => 20,  
  "NAME"           => "Элемент",  
  "ACTIVE"         => "Y",            // активен  
  "PREVIEW_TEXT"   => "текст для списка элементов",  
  "DETAIL_TEXT"    => "текст для детального просмотра"  
);
$PRODUCT_ID = $el->Add($arLoadProductArray, true);
   }
  }
}
?>


Подскажите где я что не так сделал(
спросил 02 Май, 13 от Rogarond (820 баллов)

3 Ответы

00 голосов
Традионно принято валить все такое на модуль документооборота. :D
ответил 02 Май, 13 от ZakonD3D (600 баллов)
00 голосов
Функция CIBlockElement:Add() так же вызывает событие OnAfterIBlockElementAdd - у вас получается бесконечная рекурсия. Достаточно модифицировать первый ИФ до вида
Код
if($arFields["ID"] > 0 && $arFields["IBLOCK_ID"] != 20)

ИД ваше "специально созданного инфоблока" равен 20, исходя из кода добавления элемента, значит логично предположить, что в него его-же елементы дублировать не нужно, поэтому добавляем условие $arFields["IBLOCK_ID"] != 20 и рекурсии больше не будет.
Использовать в условии if (CModule::IncludeModule("iblock")) глупо, потомучто раз вызывается событие, значит модуль уже включен. Нужно проверять на $arFields["ID"]>0, поскольку событие вызывается даже тогда, когда произошла ошибка и элемент не добавлен: если элемент добавлен в $arFields["ID"] будет его ИД, а если не добавился то будет 0.
ответил 02 Май, 13 от LaVeLaS (140 баллов)
00 голосов
Цитата
Иван Курза пишет:
Функция CIBlockElement:Add() так же вызывает событие OnAfterIBlockElementAdd - у вас получается бесконечная рекурсия. Достаточно модифицировать первый ИФ до вида



Код


if($arFields["ID"] > 0 && $arFields["IBLOCK_ID"] != 20)
ИД ваше "специально созданного инфоблока" равен 20, исходя из кода добавления элемента, значит логично предположить, что в него его-же елементы дублировать не нужно, поэтому добавляем условие $arFields["IBLOCK_ID"] != 20 и рекурсии больше не будет.
Использовать в условии if (CModule::IncludeModule("iblock")) глупо, потомучто раз вызывается событие, значит модуль уже включен. Нужно проверять на $arFields["ID"]>0, поскольку событие вызывается даже тогда, когда произошла ошибка и элемент не добавлен: если элемент добавлен в $arFields["ID"] будет его ИД, а если не добавился то будет 0.



Спасибо, тоже дошел до такого же решения =)
ответил 03 Июль, 13 от Rogarond (820 баллов)

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

0 голосов
2 ответов
0 голосов
3 ответов
0 голосов
6 ответов
спросил 04 Окт, 13 от UGeen (140 баллов)
0 голосов
1 ответ
спросил 05 Авг, 13 от TeoRex (280 баллов)