• Модуль: sender
  • Путь к файлу: ~/bitrix/modules/sender/lib/mailing.php
  • Класс: Bitrix\Sender\MailingTable
  • Вызов: MailingTable::updateChainTrigger
static function updateChainTrigger($id)
{
	// get first item of chain
	$chainDb = MailingChainTable::getList(array(
		'select' => array('ID', 'TRIGGER_FIELDS' => 'MAILING.TRIGGER_FIELDS'),
		'filter' => array('=MAILING_ID' => $id, '=IS_TRIGGER' => 'Y', '=PARENT_ID' => null),
	));

	$chain = $chainDb->fetch();
	if(!$chain) return;
	$chainId = $chain['ID'];

	// get trigger settings from mailing
	$triggerFields = $chain['TRIGGER_FIELDS'];
	if(!is_array($triggerFields))
		$triggerFields = array();

	// init TriggerSettings objects
	$settingsList = array();
	foreach($triggerFields as $key => $point)
	{
		if(empty($point['CODE'])) continue;

		$point['IS_EVENT_OCCUR'] = true;
		$point['IS_PREVENT_EMAIL'] = false;
		$point['SEND_INTERVAL_UNIT'] = 'M';
		$point['IS_CLOSED_TRIGGER'] = ($point['IS_CLOSED_TRIGGER'] == 'Y' ? true : false);

		switch($key)
		{
			case 'END':
				$point['IS_TYPE_START'] = false;
				break;

			case 'START':
			default:
				$point['IS_TYPE_START'] = true;
		}

		$settingsList[] = new Trigger\Settings($point);
	}


	// prepare fields for save
	$mailingTriggerList = array();
	foreach($settingsList as $settings)
	{
		/* @var \Bitrix\Sender\Trigger\Settings $settings */
		$trigger = Trigger\Manager::getOnce($settings->getEndpoint());
		if($trigger)
		{
			$triggerFindId = $trigger->getFullEventType() . "/" .((int) $settings->isTypeStart());
			$mailingTriggerList[$triggerFindId] = array(
				'IS_TYPE_START' => $settings->isTypeStart(),
				'NAME' => $trigger->getName(),
				'EVENT' => $trigger->getFullEventType(),
				'ENDPOINT' => $settings->getArray(),
			);
		}
	}


	// add new, update exists, delete old rows
	$triggerDb = MailingTriggerTable::getList(array(
		'select' => array('EVENT', 'MAILING_CHAIN_ID', 'IS_TYPE_START'),
		'filter' => array('=MAILING_CHAIN_ID' => $chainId)
	));
	while($trigger = $triggerDb->fetch())
	{
		$triggerFindId = $trigger['EVENT'] . "/" . ((int) $trigger['IS_TYPE_START']);
		if(!isset($mailingTriggerList[$triggerFindId]))
		{
			MailingTriggerTable::delete($trigger);
		}
		else
		{
			MailingTriggerTable::update($trigger, $mailingTriggerList[$triggerFindId]);
			unset($mailingTriggerList[$triggerFindId]);
		}
	}

	foreach($mailingTriggerList as $triggerFindId => $settings)
	{
		/** @var array $settings */
		$settings['MAILING_CHAIN_ID'] = $chainId;
		MailingTriggerTable::add($settings);
	}

	Trigger\Manager::actualizeHandlerForChild();
}