Столкнулся с довольно странным поведением (сначала думал) продукта, убил прилично времени. Так что, поделюсь этими граблями. Грабли относятся к БД с транзакциями (INNODB в MySQL, в частности).
Имеем простейший обработчик:
Суть - пытаемся записать в Журнал сообщение при добавлении поста в форум. В данном виде все отлично работает. Но стоит нам откомментировать две нижние строчки, как ничего не добавляется - автоинкремент таблицы Журнала увеличивается, но лог не пишется. Это сейчас на простейшем обработчике 2 + 2 связываются легко, но стоило времени дойти до этого 
В чем магия? Дело в том, что добавление постов в форум (а может и в блоги) окружено такой конструкцией в компонентах:
Для непосвященных, основная фишка транзаций - все-все что мы делаем после StartTransaction, упадет в базу только после Commit. Если же делается RollBack, то ничего не добавится. Вообще ничего.
И вот в эти грабли я и попал - в AddMessage генерировалась ошибка, а далее (в компоненте) делался RollBack. Соответственно, запись не ложилась в таблицу.
А теперь вопрос
как туда все же записать?
Кроме такого грязного хака я не нашел решения:
Плохо искал, пробелы в знаниях?
Имеем простейший обработчик:
AddEventHandler('forum', 'onBeforeMessageAdd', 'onBeforeMessageAddHandler'); function onBeforeMessageAddHandler($arFields) { CEventLog::Add(array( 'SEVERITY' => 'NOTICE', 'AUDIT_TYPE_ID' => 'MODERATE_BLOCKED_MESSAGE', 'MODULE_ID' => 'asd.moderator', 'ITEM_ID' => 'NEW', 'DESCRIPTION' => 'Tratata', )); //$GLOBALS['APPLICATION']->ThrowException('Fatal error'); //return false; } |

В чем магия? Дело в том, что добавление постов в форум (а может и в блоги) окружено такой конструкцией в компонентах:
StartTransaction AddMessage() Commit OR RollBack |
И вот в эти грабли я и попал - в AddMessage генерировалась ошибка, а далее (в компоненте) делался RollBack. Соответственно, запись не ложилась в таблицу.
А теперь вопрос

Кроме такого грязного хака я не нашел решения:
$GLOBALS['DB']->RollBack(); CEventLog::Add(array( |