• Модуль: 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;
}