В методы добавления/изменения/удаления добавить параметр, отключающий события.

Рейтинг: 0.1654  
Отложено
Предложил Пользователь 13767 23.09.2014 09:08:08

В методы добавления/изменения/удаления добавить параметр, отключающий события.

Несколько раз сталкивался с ситуацией, когда надо связать функционал какого-либо модуля с инфоблоками, и проще всего это сделать через обработчики событий, но тут мы можем столкнуться с зацикленностью, и вот в этой ситуации сабж. бы сильно помог.
Рейтинг: 1.158  
Ответил Жуков Евгений 23.09.2014 10:53:10
Артем, этот вопрос рассматривался неоднократно и решение давно выработано. Отключение событий невозможно - сам продукт их использует. Как избежать зацикленности - тоже известно.
Рейтинг: 1.3771  
Ответил Жуков Евгений 23.09.2014 15:17:07

Рейтинг: 0.1654  
Пользователь 13767 23.09.2014 11:02:23
Евгений, так можно же по умолчанию этот параметр сделать равным false, например для элементов ИБ добавим последним параметром bool bOffEvent = false:

int CIBlockElement::Add(
 array arFields,
 bool bWorkFlow = false,
 bool bUpdateSearch = true,
 bool bResizePictures = false,
 bool bOffEvent = false
);

CIBlockElement::Update(
 int ID,
 array arFields,
 bool bWorkFlow = false,
 bool bUpdateSearch = true,
 bool bResizePictures = false,
 bool bCheckDiskQuota = true,
 bool bOffEvent = false
);

bool CIBlockElement::Delete(
 int ID,
 bool bOffEvent = false
);
Рейтинг: 0  
Пользователь 2106 23.09.2014 11:43:38
Это сломает функционал ядра.
Рейтинг: 0  
Пользователь 191258 23.09.2014 12:21:33
При предполагаемом возникновении зацикливания можно добавлять в $arFields свои контрольные поля.
Например:

function OnAfterIBlockElementUpdate(&$arFields){
    if(!isset($arFields['STOP_API'])){
        $arSomeOtherFields=array(....);
        $arSomeOtherFields['STOP_API']='Y';
        
        $element = new CIBlockElement;        
        $element->Update($ID,$arSomeOtherFields);
    }
}

в таком случае Вы ничего не испортите, но прекратите зацикливание своего кода.
Рейтинг: 0  
Пользователь 13767 23.09.2014 14:15:09
Это сломает функционал ядра

Плохо представляю себе, каким образом?

function OnAfterIBlockElementUpdate(&$arFields){
    if(!isset($arFields['STOP_API'])){
        $arSomeOtherFields=array(....);
        $arSomeOtherFields['STOP_API']='Y';
        
        $element = new CIBlockElement;        
        $element->Update($ID,$arSomeOtherFields);
    }
}


Спасибо, что напомнили!
Рейтинг: 0  
Пользователь 50161 24.09.2014 11:03:13
за зацикливанием своего кода нужно самостоятельно следить, тем более если вы используете рекурсию, то нужно сразу четко определять условие возврата из рекурсии и что это условие на n-ой глубине рекурсии гарантированно выполнится