• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/mail/eventmanager.php
  • Класс: BitrixMainMailEventManager
  • Вызов: EventManager::executeEvents
static function executeEvents()
{
	$manage_cache = MainApplication::getInstance()->getManagedCache();

	$bulk = intval(MainConfigOption::get("main", "mail_event_bulk", 5));
	if($bulk <= 0)
		$bulk = 5;

	$rsMails = null;

	$connection = MainApplication::getConnection();
	$helper = $connection->getSqlHelper();

	$strSql= "SELECT 'x' FROM b_event WHERE SUCCESS_EXEC='N' LIMIT 1";
	$resultEventDb = $connection->query($strSql);
	if($resultEventDb->fetch())
	{
		if(!$connection->lock('event'))
			return "";
	}
	else
	{
		if(CACHED_b_event!==false)
			$manage_cache->set("events", true);

		return "";
	}

	$strSql = "
		SELECT ID, C_FIELDS, EVENT_NAME, MESSAGE_ID, LID,
			" . $helper->formatDate('DD.MM.YYYY HH24:MI:SS', 'DATE_INSERT') . " as DATE_INSERT,
			DUPLICATE, LANGUAGE_ID
		FROM b_event
		WHERE SUCCESS_EXEC='N'
		ORDER BY ID
		LIMIT ".$bulk;

	$rsMails = $connection->query($strSql);

	if ($rsMails)
	{
		$arCallableModificator = array();
		$cnt = 0;
		foreach(InternalEventTable::getFetchModificatorsForFieldsField() as $callableModificator)
		{
			if(is_callable($callableModificator))
			{
				$arCallableModificator[] = $callableModificator;
			}
		}
		while($arMail = $rsMails->fetch())
		{
			foreach($arCallableModificator as $callableModificator)
				$arMail['C_FIELDS'] = call_user_func_array($callableModificator, array($arMail['C_FIELDS']));

			$arFiles = array();
			$fileListDb = InternalEventAttachmentTable::getList(array(
				'select' => array('FILE_ID'),
				'filter' => array('=EVENT_ID' => $arMail["ID"])
			));
			while($file = $fileListDb->fetch())
			{
				$arFiles[] = $file['FILE_ID'];
			}
			$arMail['FILE'] = $arFiles;

			if(!is_array($arMail['C_FIELDS']))
			{
				$arMail['C_FIELDS'] = array();
			}
			try
			{
				$flag = Event::handleEvent($arMail);
				InternalEventTable::update($arMail["ID"], array('SUCCESS_EXEC' => $flag, 'DATE_EXEC' => new MainTypeDateTime));
			}
			catch (Exception $e)
			{
				InternalEventTable::update($arMail["ID"], array('SUCCESS_EXEC' => "E", 'DATE_EXEC' => new MainTypeDateTime));

				$application = MainApplication::getInstance();
				$exceptionHandler = $application->getExceptionHandler();
				$exceptionHandler->writeToLog($e);

				break;
			}

			$cnt++;
			if($cnt >= $bulk)
				break;
		}
	}

	$connection->unlock('event');

	if($cnt === 0 && CACHED_b_event !== false)
		$manage_cache->set("events", true);

	return null;
}