• Модуль: sender
  • Путь к файлу: ~/bitrix/modules/sender/lib/mailingtrigger.php
  • Класс: Bitrix\Sender\MailingTriggerTable
  • Вызов: MailingTriggerTable::actualizeHandlers
static function actualizeHandlers($chainId, array $fieldsNew = null, array $fieldsOld = null)
{
	$settingsNew = null;
	$settingsOld = null;

	if($fieldsNew)
		$settingsNew = new Trigger\Settings($fieldsNew);
	if($fieldsOld)
		$settingsOld = new Trigger\Settings($fieldsOld);


	// if old item was closed trigger
	if($settingsOld && $settingsOld->isClosedTrigger())
	{
		// delete agent
		$agentName = Trigger\Manager::getClosedEventAgentName(
			$settingsOld->getEventModuleId(),
			$settingsOld->getEventType(),
			$chainId
		);

		$agent = new \CAgent;
		$agentListDb = $agent->GetList(array(), array('MODULE_ID' => 'sender', 'NAME' => $agentName));
		while($agentItem = $agentListDb->Fetch())
			$agent->Delete($agentItem['ID']);
	}


	// if new item is closed trigger
	if($settingsNew && $settingsNew->isClosedTrigger())
	{
		// check active state of mailing
		$chainDb = MailingChainTable::getList(array(
			'select' => array('ID'),
			'filter' => array('=ID' => $chainId, '=MAILING.ACTIVE' => 'Y')
		));
		if(!$chainDb->fetch())
			return;

		// add new agent
		$agentName = Trigger\Manager::getClosedEventAgentName(
			$settingsNew->getEventModuleId(),
			$settingsNew->getEventType(),
			$chainId
		);

		// set date of next exec
		$agentTime = $settingsNew->getClosedTriggerTime();
		$agentInterval = $settingsNew->getClosedTriggerInterval();
		if($agentInterval <= 0) $agentInterval = 1440;

		$agentTimeArray = explode(":", $agentTime);
		$agentDate = new DateTime;
		$agentDate->setTime((int)$agentTimeArray[0], (int)$agentTimeArray[1]);

		// set next exec on next day if exec was today
		if($agentDate->getTimestamp() < time())
			$agentDate->add("1 days");

		// add agent
		$agent = new \CAgent;
		$agent->AddAgent($agentName, 'sender', 'N', $agentInterval*60, '', 'Y', $agentDate->toString());

		return;
	}

	// actualize deleted/changed event
	if($settingsOld && !$settingsOld->isClosedTrigger() && $settingsOld->getFullEventType())
	{
		// if delete operation(no the NEW)
		// or change operation(the NEW is not equal to the OLD)
		if(!$settingsNew || $settingsOld->getFullEventType() != $settingsNew->getFullEventType())
		{
			Trigger\Manager::actualizeHandler(array(
				'MODULE_ID' => $settingsOld->getEventModuleId(),
				'EVENT_TYPE' => $settingsOld->getEventType(),
				'CALLED_BEFORE_CHANGE' => true
			));
		}
	}

	// actualize new event
	if($settingsNew && $settingsNew->getFullEventType())
	{
		$calledBeforeChange = ($fieldsOld ?  false : true);
		Trigger\Manager::actualizeHandler(array(
			'MODULE_ID' => $settingsNew->getEventModuleId(),
			'EVENT_TYPE' => $settingsNew->getEventType(),
			'CALLED_BEFORE_CHANGE' => $calledBeforeChange
		));
	}
}