Зациклящи манипулатори на събития
Задача: когато променяте елемент на информационен блок, модифицирайте друг елемент. Случаят може да бъде всякакъв - това е регистриране и деактивиране на основния продукт, когато няма активни оферти, и промяна на датата на активност на свързания елемент. Ако създадете манипулатор, който използва метода CIBlockElement::Update и го закачите на събитията OnBeforeIBlockElementUpdate / OnAfterIBlockElementUpdate, тогава:
Причината е, че има рекурсивно извикване на манипулатора. По-долу е кодът, който се отървава от тези проблеми. МанипулаторътOnAfterIBlockElementUpdateе взет като пример.
Обяснение. Класът е взет като основа, тъй като такива решения се използват главно в техните собствени модули. Класът има статична булева променлива -$handlerDisallow. По подразбиране е зададено на false - без забрана. В самото начало на манипулатора трябва да проверите неговата стойност. Ако манипулаторът вече работи, той ще бъде верен и изпълнението трябва да бъде прекратено. Ако можете да стартирате манипулатора, трябва да зададете тази променлива на true за продължителността на целия манипулатор. В края трябва да нулирате флага ($handlerDisallow), в противен случай вашият манипулатор няма да бъде изпълнен отново до края на удара.
Ако използвате обикновена функция като манипулатор, а не клас, тогава създайте статична променлива във функцията.
Можете да допълните класа с възможността да блокирате работата на манипулатора "отвън". За да направите това, променете типа на променливата и добавете три метода: