• Модуль: sender
  • Путь к файлу: ~/bitrix/modules/sender/lib/trigger/manager.php
  • Класс: BitrixSenderTriggerManager
  • Вызов: Manager::processEvent
static function processEvent($params)
{
	$moduleId = $params['MODULE_ID'];
	$eventType = $params['EVENT_TYPE'];
	$eventData = $params['EVENT_DATA'];

	$filter = array(
		'=MAILING_CHAIN.MAILING.ACTIVE' => 'Y',
		'=MAILING_CHAIN.IS_TRIGGER' => 'Y',
		'=MAILING_CHAIN.STATUS' => array(MailingChainTable::STATUS_WAIT, MailingChainTable::STATUS_SEND),
		'=EVENT' => $moduleId.'/'.$eventType
	);
	if(isset($params['FILTER']) && is_array($params['FILTER']))
	{
		$filter = $filter + $params['FILTER'];
	}

	$chainDb = MailingTriggerTable::getList(array(
		'select' => array(
			'ENDPOINT',
			'SITE_ID' => 'MAILING_CHAIN.MAILING.SITE_ID',
			'ID' => 'MAILING_CHAIN.ID',
			'MAILING_ID' => 'MAILING_CHAIN.MAILING_ID',
			'PARENT_ID' => 'MAILING_CHAIN.PARENT_ID',
			'POSTING_ID' => 'MAILING_CHAIN.POSTING_ID',
			'TIME_SHIFT' => 'MAILING_CHAIN.TIME_SHIFT',
			'STATUS' => 'MAILING_CHAIN.STATUS',
			'AUTO_SEND_TIME' => 'MAILING_CHAIN.AUTO_SEND_TIME'
		),
		'filter' => $filter,
		'order' => array('MAILING_CHAIN_ID' => 'ASC', 'IS_TYPE_START' => 'ASC')
	));
	while($chain = $chainDb->fetch())
	{
		$settings = new Settings($chain['ENDPOINT']);
		$trigger = static::getOnce($settings->getEndpoint());
		if(!$trigger) continue;

		$trigger->setSiteId($chain['SITE_ID']);
		$trigger->setFields($settings->getFields());
		$trigger->setParams(array('CHAIN' => $chain, 'EVENT' => $eventData));

		// mark trigger as first run for process old data
		$runForOldData = ($trigger->canRunForOldData() && $settings->canRunForOldData() && !$settings->wasRunForOldData());
		$trigger->setRunForOldData($runForOldData);

		// run trigger filter
		if(!$trigger->filter()) continue;

		//add recipient to posting
		static::$postingId = null;
		$recipientDb = $trigger->getRecipientResult();
		while($recipient = $recipientDb->fetch())
		{
			if($settings->isTypeStart())
			{
				static::addRecipient($chain, $settings, $recipient);
			}
			else
			{
				static::stop($chain, $recipient, true);
			}
		}

		// mark mailing trigger fields as first run for process old data
		if($runForOldData)
		{
			MailingTable::setWasRunForOldData($chain['MAILING_ID'], $runForOldData);
		}

		if($settings->isTypeStart())
		{
			// prevent email event
			if($settings->isPreventEmail())
			{
				static::preventMailEvent($trigger->getMailEventToPrevent());
			}

			//start sending of mailing chain
			static::send($chain);
		}

	}

	//return $data;
}