- Модуль: tasks
- Путь к файлу: ~/bitrix/modules/tasks/lib/item/task.php
- Класс: BitrixTasksItemTask
- Вызов: Task::fireLegacyEvent
private function fireLegacyEvent($state, $isBefore = true)
{
$result = $state->getResult();
$before = $isBefore ? 'Before' : '';
$canAlterData = false;
$arFields = $arFieldsSource = array();
if($state->isModeCreate())
{
$name = 'On'.$before.'TaskAdd';
$unknownErrorMessage = GetMessage("TASKS_UNKNOWN_ADD_ERROR");
$arFields = $arFieldsSource = $this->prepareLegacyData();
if($isBefore)
{
$arguments = array(&$arFields);
$canAlterData = true;
}
else
{
$arguments = array($this->getId(), &$arFields);
}
}
elseif($state->isModeUpdate())
{
$name = 'On'.$before.'TaskUpdate';
$unknownErrorMessage = GetMessage("TASKS_UNKNOWN_UPDATE_ERROR");
$arFields = $arFieldsSource = $this->prepareLegacyData(false, true);
$arTaskCopy = $this->prepareLegacyData(true);
$arguments = array($this->getId(), &$arFields, &$arTaskCopy);
$canAlterData = true;
}
elseif($state->isModeDelete())
{
$name = 'On'.$before.'TaskDelete';
$unknownErrorMessage = 'Unknown delete error';
$arTaskCopy = $this->prepareLegacyData(true);
$arguments = array($this->getId(), &$arTaskCopy);
}
else
{
return true;
}
global $APPLICATION;
$executedOnce = false;
foreach(GetModuleEvents('tasks', $name, true) as $event)
{
$executedOnce = true;
$execResult = 0;
if(array_key_exists('CALLBACK', $event))
{
$handlerName = 'Closure';
}
else
{
$handlerName = $event['TO_CLASS'].'::'.$event['TO_METHOD'].'();';
}
try
{
$execResult = ExecuteModuleEventEx($event, $arguments);
}
catch(Exception $e)
{
$result->addException($e, 'Exception in event handler: '.$handlerName);
}
if($execResult === false)
{
$e = $APPLICATION->getException();
$hasExplanation = false;
if($e instanceof CAdminException)
{
if (is_array($e->messages))
{
foreach($e->messages as $msg)
{
$hasExplanation = true;
$result->addError('EVENT_HANDLER_ERROR', $msg);
}
}
}
else
{
$hasExplanation = true;
$result->addError('EVENT_HANDLER_ERROR.'.$e->getId(), $e->getString());
}
if(!$hasExplanation)
{
$result->addError('EVENT_HANDLER_ERROR', $unknownErrorMessage);
}
return false;
}
}
if($canAlterData && $executedOnce)
{
// find difference between $arFields and $arFieldsSource, and update $this
foreach($arFields as $key => $newValue)
{
// key was added or changed
if(!array_key_exists($key, $arFieldsSource) || $arFields[$key] != $arFieldsSource[$key])
{
$this[$key] = $newValue;
}
}
foreach($arFieldsSource as $key => $oldValue)
{
// key was removed
if(!array_key_exists($key, $arFields))
{
$this[$key] = null;
}
}
}
return true;
}