%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/sender/lib/trigger/ |
Current File : /home/bitrix/www/bitrix/modules/sender/lib/trigger/manager.php |
<?php /** * Bitrix Framework * @package bitrix * @subpackage sender * @copyright 2001-2012 Bitrix */ namespace Bitrix\Sender\Trigger; use Bitrix\Main\Event; use Bitrix\Main\EventManager; use Bitrix\Main\EventResult; use Bitrix\Main\Type\DateTime; use Bitrix\Main\Diag\Debug; use Bitrix\Sender\ContactTable; use Bitrix\Sender\Recipient; use Bitrix\Sender\Subscription; use Bitrix\Sender\MailEventHandler; use Bitrix\Sender\MailingTable; use Bitrix\Sender\MailingChainTable; use Bitrix\Sender\MailingTriggerTable; use Bitrix\Sender\PostingTable; use Bitrix\Sender\PostingRecipientTable; use Bitrix\Sender\Integration; class Manager { public static $debug = false; public static $postingId = null; /** * @param mixed * @return void */ public static function handleEvent() { $args = func_get_args(); if (isset($args[0]) && $args[0] instanceof Event) { $event = $args[0]; /* @var Event $event */ $moduleId = $event->getModuleId(); $eventType = $event->getEventType(); $eventData = $event->getParameters(); } else { global $BX_MODULE_EVENT_LAST; $moduleId = $BX_MODULE_EVENT_LAST['FROM_MODULE_ID']; $eventType = $BX_MODULE_EVENT_LAST['MESSAGE_ID']; $eventData = $args; } static::processEvent(array( 'MODULE_ID' => $moduleId, 'EVENT_TYPE' => $eventType, 'EVENT_DATA' => $eventData, 'FILTER' => array(), )); } /** * @param array $params * @return void */ protected 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; } /** * @param array $chain * @param array $data * @param bool $setGoal * @return void */ protected static function stop($chain, $data, $setGoal) { // if mailing continue, then stop it $recipientDb = PostingRecipientTable::getList(array( 'select' => array('ID', 'ROOT_ID', 'POSTING_ID', 'STATUS', 'POSTING_STATUS' => 'POSTING.STATUS'), 'filter' => array( '=CONTACT_ID' => $data['CONTACT_ID'], '=POSTING.MAILING_ID' => $chain['MAILING_ID'], '=STATUS' => array( PostingRecipientTable::SEND_RESULT_NONE, PostingRecipientTable::SEND_RESULT_WAIT, ) ), 'limit' => 1 )); if($recipient = $recipientDb->fetch()) { // if mailing continue, then stop it and the next was riched $updateFields = array('STATUS' => PostingRecipientTable::SEND_RESULT_DENY); PostingRecipientTable::update(array('ID' => $recipient['ID']), $updateFields); // change status of posting if all emails sent if(!in_array($recipient['POSTING_STATUS'], array(PostingTable::STATUS_NEW, PostingTable::STATUS_PART))) { $recipientCountDb = PostingRecipientTable::getList(array( 'select' => array('POSTING_ID'), 'filter' => array( '=POSTING_ID' => $recipient['POSTING_ID'], '=STATUS' => array( PostingRecipientTable::SEND_RESULT_NONE, PostingRecipientTable::SEND_RESULT_WAIT, ) ), 'limit' => 1 )); if(!$recipientCountDb->fetch()) { PostingTable::update(array('ID' => $recipient['POSTING_ID']), array('STATUS' => PostingTable::STATUS_SENT)); } } } if(!$setGoal) { return; } // set flag of taking the goal to last success sending $recipientDb = PostingRecipientTable::getList(array( 'select' => array('ID', 'DATE_DENY'), 'filter' => array( '=CONTACT_ID' => $data['CONTACT_ID'], '=POSTING.MAILING_ID' => $chain['MAILING_ID'], '=STATUS' => array( PostingRecipientTable::SEND_RESULT_SUCCESS ) ), 'order' => array('DATE_SENT' => 'DESC', 'ID' => 'DESC'), 'limit' => 1 )); if($recipient = $recipientDb->fetch()) { if(empty($recipient['DATE_DENY'])) PostingRecipientTable::update(array('ID' => $recipient['ID']), array('DATE_DENY' => new DateTime)); } } /** * @param array $chain * @return void */ protected static function send($chain) { // set send status if(empty($chain['ID'])) return; if(empty($chain['POSTING_ID'])) { if(empty(static::$postingId)) { return; } $updateFields['POSTING_ID'] = static::$postingId; } $updateFields = array(); if($chain['STATUS'] == MailingChainTable::STATUS_WAIT) { $autoSendTime = new DateTime; $autoSendTime->add($chain['TIME_SHIFT'] . ' minutes'); $updateFields['STATUS'] = MailingChainTable::STATUS_SEND; $updateFields['AUTO_SEND_TIME'] = $autoSendTime; } else { $updateFields['AUTO_SEND_TIME'] = $chain['AUTO_SEND_TIME']; $updateFields['STATUS'] = $chain['STATUS']; } if(count($updateFields) > 0) { MailingChainTable::update(array('ID' => $chain['ID']), $updateFields); } } /** * @param array $emailEvent * @return void */ protected static function preventMailEvent(array $emailEvent) { if(isset($emailEvent['EVENT_NAME']) && strlen($emailEvent['EVENT_NAME'])>0) { if(!empty($emailEvent['FILTER']) && is_array($emailEvent['FILTER'])) { MailEventHandler::prevent($emailEvent['EVENT_NAME'], $emailEvent['FILTER']); } } } /** * @param array $chain * @param Settings $settings * @param array $data * @return void */ protected static function addRecipient($chain, $settings, $data) { if(!$data || empty($data['EMAIL'])) { return; } $code = $data['EMAIL']; $typeId = Recipient\Type::detect($data['EMAIL']); $code = Recipient\Normalizer::normalize($code, $typeId); // check email to unsubscription if(Subscription::isUnsubscibed($chain['MAILING_ID'], $code)) { return; } // if this is event for child if(!empty($chain['PARENT_ID'])) { $recipientDb = PostingRecipientTable::getList(array( 'select' => array('ID', 'STATUS'), 'filter' => array( '=CONTACT.CODE' => $code, '=CONTACT.TYPE_ID' => $typeId, '=POSTING.MAILING_CHAIN_ID' => $chain['ID'], '=POSTING.STATUS' => array(PostingTable::STATUS_NEW, PostingTable::STATUS_PART) ) )); while($recipient = $recipientDb->fetch()) { // check if event should came or didn't came $statusNew = null; if($settings->isEventOccur() && $recipient['STATUS'] == PostingRecipientTable::SEND_RESULT_WAIT) { $statusNew = PostingRecipientTable::SEND_RESULT_NONE; } elseif(!$settings->isEventOccur() && $recipient['STATUS'] == PostingRecipientTable::SEND_RESULT_NONE) { $statusNew = PostingRecipientTable::SEND_RESULT_WAIT; } if($statusNew !== null) { PostingRecipientTable::update( array('ID' => $recipient['ID']), array('STATUS' => $statusNew) )->isSuccess(); } } } else { // check email to have not finished mailing $recipientExistsDb = PostingRecipientTable::getList(array( 'select' => array('ID'), 'filter' => array( '=CONTACT.CODE' => $code, '=CONTACT.TYPE_ID' => $typeId, '=POSTING.MAILING_ID' => $chain['MAILING_ID'], '=STATUS' => array( PostingRecipientTable::SEND_RESULT_NONE, PostingRecipientTable::SEND_RESULT_WAIT, ) ), 'limit' => 1 )); if($recipientExistsDb->fetch()) { return; } if(static::$postingId) { $postingId = static::$postingId; } else { $postingAddDb = PostingTable::add(array( 'MAILING_ID' => $chain['MAILING_ID'], 'MAILING_CHAIN_ID' => $chain['ID'], )); if(!$postingAddDb->isSuccess()) return; $postingId = $postingAddDb->getId(); static::$postingId = $postingId; } $contact = ContactTable::getRow(['filter' => [ '=CODE' => $code, '=TYPE_ID' => $typeId, ]]); if (!$contact) { $contact = [ 'CODE' => $code, 'TYPE_ID' => $typeId, 'NAME' => !empty($data['NAME']) ? $data['NAME'] : null, 'USER_ID' => !empty($data['USER_ID']) ? $data['USER_ID'] : null, ]; $contact['ID'] = ContactTable::add($contact)->getId(); } PostingRecipientTable::add([ 'POSTING_ID' => $postingId, 'CONTACT_ID' => $contact['ID'], 'FIELDS' => !empty($data['FIELDS']) ? $data['FIELDS'] : null, 'USER_ID' => !empty($data['USER_ID']) ? $data['USER_ID'] : null, ])->isSuccess(); } } /** * @param bool $activate * @return void */ public static function activateAllHandlers($activate = true) { static::actualizeHandlerForChild($activate); $itemDb = MailingTriggerTable::getList(array( 'select' => array('ENDPOINT', 'MAILING_CHAIN_ID'), 'filter' => array( '=MAILING_CHAIN.IS_TRIGGER' => 'Y', '=MAILING_CHAIN.MAILING.ACTIVE' => 'Y', ) )); while($item = $itemDb->fetch()) { if(!is_array($item['ENDPOINT'])) { continue; } if($activate) { MailingTriggerTable::actualizeHandlers($item['MAILING_CHAIN_ID'], $item['ENDPOINT'], null); } else { MailingTriggerTable::actualizeHandlers($item['MAILING_CHAIN_ID'], null, $item['ENDPOINT']); } $settings = new Settings($item['ENDPOINT']); if(!$settings->isClosedTrigger() && $settings->getEventModuleId() && $settings->getEventType()) { static::actualizeHandler( array('MODULE_ID' => $settings->getEventModuleId(), 'EVENT_TYPE' => $settings->getEventType()), $activate ); } } } /** * @param array $params * @param bool $activate * @return void */ public static function actualizeHandler(array $params, $activate = null) { $moduleId = $params['MODULE_ID']; $eventType = $params['EVENT_TYPE']; $calledBeforeChange = $params['CALLED_BEFORE_CHANGE']; if($params['IS_CLOSED_TRIGGER']) { return; } if($activate === null) { // if actualizing will be called before deleting record (or updating record with clearing field), // query will select this record. // In this reason, it should be considered - check if more 1 or 0 selected rows. if($calledBeforeChange) $minRowsCount = 1; else $minRowsCount = 0; $existsDb = MailingTriggerTable::getList(array( 'select' => array('MAILING_CHAIN_ID'), 'filter' => array( '=EVENT' => $moduleId.'/'.$eventType, '=MAILING_CHAIN.IS_TRIGGER' => 'Y', '=MAILING_CHAIN.MAILING.ACTIVE' => 'Y', //'=STATUS' => array(MailingChainTable::STATUS_WAIT, MailingChainTable::STATUS_SEND) ), 'group' => array('MAILING_CHAIN_ID'), 'limit' => 2 )); $rowsCount = 0; while($existsDb->fetch()) $rowsCount++; if($rowsCount > $minRowsCount) { $activate = true; } else { $activate = false; } } if($activate) { EventManager::getInstance()->registerEventHandler( $moduleId, $eventType, 'sender', __CLASS__, 'handleEvent' ); } else { EventManager::getInstance()->unRegisterEventHandler( $moduleId, $eventType, 'sender', __CLASS__, 'handleEvent' ); } } /** * @param array $endpointList * @return array */ public static function getFieldsFromEndpoint(array $endpointList) { $resultList = array(); foreach($endpointList as $endpoint) { $resultList[$endpoint['MODULE_ID']][$endpoint['CODE']][] = $endpoint['FIELDS']; } return $resultList; } /** * @param array $fields * @return array|null */ public static function getEndpointFromFields(array $fields) { $endpointList = null; $fieldsTmp = array(); foreach($fields as $moduleId => $connectorSettings) { if (is_numeric($moduleId)) { $moduleId = ''; } foreach($connectorSettings as $connectorCode => $connectorFields) { foreach($connectorFields as $k => $fields) { if (isset($fieldsTmp[$moduleId][$connectorCode][$k]) && is_array($fields)) $fieldsTmp[$moduleId][$connectorCode][$k] = array_merge($fieldsTmp[$moduleId][$connectorCode][$k], $fields); else $fieldsTmp[$moduleId][$connectorCode][$k] = $fields; } } } foreach($fieldsTmp as $moduleId => $connectorSettings) { if(is_numeric($moduleId)) $moduleId = ''; foreach($connectorSettings as $connectorCode => $connectorFields) { foreach($connectorFields as $fields) { $endpoint = array(); $endpoint['MODULE_ID'] = $moduleId; $endpoint['CODE'] = $connectorCode; $endpoint['FIELDS'] = $fields; $endpointList[] = $endpoint; } } } return $endpointList; } /** * Return array of instances of connector by endpoints array. * * @param array * @return Base[] */ public static function getList(array $endpointList = null) { $triggerList = array(); $classList = static::getClassList($endpointList); foreach($classList as $classDescription) { /** @var Base $trigger */ $trigger = new $classDescription['CLASS_NAME']; $trigger->setModuleId($classDescription['MODULE_ID']); $triggerList[] = $trigger; } return $triggerList; } /** * Return instance of trigger by endpoint array. * * @param array * @return Base|null */ public static function getOnce(array $endpoint) { $trigger = null; $triggerList = static::getList(array($endpoint)); /** @var Base $trigger */ foreach($triggerList as $trigger) { break; } return $trigger; } /** * Return array of triggers information by endpoints array. * * @param array $endpointList * @return array */ public static function getClassList(array $endpointList = null) { $resultList = array(); $moduleIdFilter = null; $moduleConnectorFilter = null; if($endpointList) { $moduleIdFilter = array(); foreach($endpointList as $endpoint) { $moduleIdFilter[] = $endpoint['MODULE_ID']; $moduleConnectorFilter[$endpoint['MODULE_ID']][] = $endpoint['CODE']; } } $data = array(); $event = new Event('sender', 'OnTriggerList', array($data), $moduleIdFilter); $event->send(); foreach ($event->getResults() as $eventResult) { if ($eventResult->getType() == EventResult::ERROR) { continue; } $eventResultParameters = $eventResult->getParameters(); if($eventResultParameters && array_key_exists('TRIGGER', $eventResultParameters)) { $connectorClassNameList = $eventResultParameters['TRIGGER']; if(!is_array($connectorClassNameList)) $connectorClassNameList = array($connectorClassNameList); foreach($connectorClassNameList as $connectorClassName) { if(!is_subclass_of($connectorClassName, '\Bitrix\Sender\Trigger')) { continue; } $connectorCode = call_user_func(array($connectorClassName, 'getCode')); if($moduleConnectorFilter && !in_array($connectorCode, $moduleConnectorFilter[$eventResult->getModuleId()])) { continue; } $isClosedTrigger = false; if(is_subclass_of($connectorClassName, '\Bitrix\Sender\TriggerConnectorClosed')) $isClosedTrigger = true; $connectorName = call_user_func(array($connectorClassName, 'getName')); $connectorRequireConfigure = call_user_func(array($connectorClassName, 'requireConfigure')); $resultList[] = array( 'MODULE_ID' => $eventResult->getModuleId(), 'CLASS_NAME' => $connectorClassName, 'CODE' => $connectorCode, 'NAME' => $connectorName, 'REQUIRE_CONFIGURE' => $connectorRequireConfigure, 'IS_CLOSED' => $isClosedTrigger, ); } } } if(!empty($resultList)) usort($resultList, array(__CLASS__, 'sort')); return $resultList; } /** * @param array $a * @param array $b * @return int */ public static function sort($a, $b) { if ($a['NAME'] == $b['NAME']) return 0; return ($a['NAME'] < $b['NAME']) ? -1 : 1; } /** * @param string $mess * @return void */ public static function debug($mess) { if(static::$debug) { Debug::writeToFile($mess, "", "__bx_sender_trigger.log"); } } /** * @param string $moduleId * @param string $eventType * @param int $chainId * @return string */ public static function getClosedEventAgentName($moduleId, $eventType, $chainId) { return '\Bitrix\Sender\TriggerManager::fireClosedEventAgent("' . $moduleId . '","' . $eventType .'","' . $chainId .'");'; } /** * @param string $moduleId * @param string $eventType * @param int $chainId * @return string */ public static function fireClosedEventAgent($moduleId, $eventType, $chainId) { if(!empty($moduleId) && !empty($eventType) && !empty($chainId)) { static::processEvent(array( 'MODULE_ID' => $moduleId, 'EVENT_TYPE' => $eventType, 'EVENT_DATA' => array(), 'FILTER' => array( '=MAILING_CHAIN.ID' => $chainId ), )); return static::getClosedEventAgentName($moduleId, $eventType, $chainId); } else { return ''; } } /** * @param bool $activate * @return void */ public static function actualizeHandlerForChild($activate = null) { $eventHandlerList = array( array( 'sender', 'OnAfterMailingChainSend', 'sender', __CLASS__, 'onAfterMailingChainSend' ), array( 'sender', 'OnAfterPostingSendRecipient', 'sender', __CLASS__, 'onAfterPostingSendRecipient' ) ); if($activate === null) { $existsDb = MailingChainTable::getList(array( 'select' => array('ID'), 'filter' => array( '!PARENT_ID' => null, '=IS_TRIGGER' => 'Y', '=MAILING.ACTIVE' => 'Y', //'=STATUS' => array(MailingChainTable::STATUS_WAIT, MailingChainTable::STATUS_SEND) ), 'limit' => 1 )); if($existsDb->fetch()) { $activate = true; } else { $activate = false; } } if($activate === true) { $eventManager = EventManager::getInstance(); foreach($eventHandlerList as $h) $eventManager->registerEventHandler($h[0],$h[1],$h[2],$h[3],$h[4]); } elseif($activate === false) { $eventManager = EventManager::getInstance(); foreach($eventHandlerList as $h) $eventManager->unRegisterEventHandler($h[0],$h[1],$h[2],$h[3],$h[4]); } } /** * @param Event $event * @return void */ public static function onAfterMailingChainSend(Event $event) { $data = $event->getParameter(0); if(!$data || empty($data['MAILING_CHAIN']['ID'])) return; $childChainDb = MailingChainTable::getList(array( 'select' => array( 'ID', 'MAILING_ID', 'PARENT_ID', 'POSTING_ID', 'STATUS', 'TIME_SHIFT' ), 'filter' => array( '=MAILING.ACTIVE' => 'Y', '=IS_TRIGGER' => 'Y', '=STATUS' => MailingChainTable::STATUS_WAIT, '=PARENT_ID' => $data['MAILING_CHAIN']['ID'] ) )); while($childChain = $childChainDb->fetch()) { $isSend = false; $settings = new Settings(); if(strlen($settings->getEndpoint('CODE')) <= 0) { // send certainly $isSend = true; } elseif($settings->isEventOccur()) { // send if event occur } else { // send if event not occur } if(empty($childChain['POSTING_ID']) || $childChain['STATUS'] != MailingChainTable::STATUS_WAIT) { $isSend = false; } if($isSend) { static::send($childChain); } } } /** * @param \Bitrix\Main\Event $event * @return void */ public static function onAfterPostingSendRecipient(Event $event) { $data = $event->getParameter(0); if(!$data || !$data['SEND_RESULT'] || empty($data['POSTING']['MAILING_CHAIN_ID'])) return; $chainId = $data['POSTING']['MAILING_CHAIN_ID']; $dataRecipient = $data['RECIPIENT']; static $mailingParams = array(); if(!isset($mailingParams[$chainId])) { $mailingParams[$chainId] = array(); $childChainDb = MailingChainTable::getList(array( 'select' => array( 'ID', 'MAILING_ID', 'PARENT_ID', 'POSTING_ID' ), 'filter' => array( '=MAILING.ACTIVE' => 'Y', '=IS_TRIGGER' => 'Y', '=STATUS' => array(MailingChainTable::STATUS_WAIT, MailingChainTable::STATUS_SEND), '=PARENT_ID' => $chainId ) )); while($childChain = $childChainDb->fetch()) { // add posting $postingAddDb = PostingTable::add(array( 'MAILING_ID' => $childChain['MAILING_ID'], 'MAILING_CHAIN_ID' => $childChain['ID'], )); if(!$postingAddDb->isSuccess()) { continue; } $mailingParams[$chainId][] = array( 'POSTING_ID' => $postingAddDb->getId(), 'CHAIN' => $childChain, ); } } if(empty($mailingParams[$chainId])) { return; } foreach($mailingParams[$chainId] as $mailingParamsItem) { $postingId = $mailingParamsItem['POSTING_ID']; $childChain = $mailingParamsItem['CHAIN']; // check email as unsubscribed // TODO: modify to accept RID if(Subscription::isUnsubscibed($childChain['MAILING_ID'], $data['RECIPIENT']['EMAIL'])) continue; $recipient = array('POSTING_ID' => $postingId); $recipient['STATUS'] = PostingRecipientTable::SEND_RESULT_NONE; $recipient['CONTACT_ID'] = $dataRecipient['CONTACT_ID']; if(!empty($dataRecipient['FIELDS'])) { $recipient['FIELDS'] = $dataRecipient['FIELDS']; } if(!empty($dataRecipient['ROOT_ID'])) { $recipient['ROOT_ID'] = $dataRecipient['ROOT_ID']; } else { $recipient['ROOT_ID'] = $dataRecipient['ID']; } if(!empty($dataRecipient['USER_ID'])) { $recipient['USER_ID'] = $dataRecipient['USER_ID']; } // add recipient PostingTable::addRecipient($recipient, true); if(empty($mailingParams[$chainId]['CHAIN']['POSTING_ID'])) { $chainUpdateDb = MailingChainTable::update(array('ID' => $childChain['ID']), array('POSTING_ID' => $postingId)); if($chainUpdateDb->isSuccess()) { $mailingParams[$chainId]['CHAIN']['POSTING_ID'] = $postingId; } } } } /** * @param array $data * @return void */ public static function onAfterRecipientUnsub($data) { static::stop( array('MAILING_ID' => $data['MAILING_ID']), array( 'RECIPIENT_ID' => $data['RECIPIENT_ID'], 'CONTACT_ID' => $data['CONTACT_ID'], ), false ); } /** * @param array $data * @return array */ public static function onTriggerList($data) { return Integration\EventHandler::onTriggerList($data); } }