static function handleEvent(array $arEvent)
{
if(!isset($arEvent['FIELDS']) && isset($arEvent['C_FIELDS']))
$arEvent['FIELDS'] = $arEvent['C_FIELDS'];
if(!is_array($arEvent['FIELDS']))
throw new MainArgumentTypeException("FIELDS" );
$flag = static::SEND_RESULT_TEMPLATE_NOT_FOUND; // no templates
$arResult = array(
"Success" => false,
"Fail" => false,
"Was" => false,
"Skip" => false,
);
$trackRead = null;
$trackClick = null;
if(array_key_exists('TRACK_READ', $arEvent))
$trackRead = $arEvent['TRACK_READ'];
if(array_key_exists('TRACK_CLICK', $arEvent))
$trackClick = $arEvent['TRACK_CLICK'];
$arSites = explode(",", $arEvent["LID"]);
if(empty($arSites))
{
return $flag;
}
// get charset and server name for languages of event
// actually it's one of the sites (let it be the first one)
$charset = false;
$serverName = null;
static $sites = array();
$infoSite = reset($arSites);
if(!isset($sites[$infoSite]))
{
$siteDb = MainSiteTable::getList(array(
'select' => array('SERVER_NAME', 'CULTURE_CHARSET'=>'CULTURE.CHARSET'),
'filter' => array('=LID' => $infoSite)
));
$sites[$infoSite] = $siteDb->fetch();
}
if(is_array($sites[$infoSite]))
{
$charset = $sites[$infoSite]['CULTURE_CHARSET'];
$serverName = $sites[$infoSite]['SERVER_NAME'];
}
if(!$charset)
{
return $flag;
}
// get filter for list of message templates
$arEventMessageFilter = array();
$MESSAGE_ID = intval($arEvent["MESSAGE_ID"]);
if($MESSAGE_ID > 0)
{
$eventMessageDb = MailInternalEventMessageTable::getById($MESSAGE_ID);
if($eventMessageDb->Fetch())
{
$arEventMessageFilter['=ID'] = $MESSAGE_ID;
$arEventMessageFilter['=ACTIVE'] = 'Y';
}
}
if(empty($arEventMessageFilter))
{
$arEventMessageFilter = array(
'=ACTIVE' => 'Y',
'=EVENT_NAME' => $arEvent["EVENT_NAME"],
'=EVENT_MESSAGE_SITE.SITE_ID' => $arSites,
);
if($arEvent["LANGUAGE_ID"] <> '')
{
$arEventMessageFilter[] = array(
"LOGIC" => "OR",
array("=LANGUAGE_ID" => $arEvent["LANGUAGE_ID"]),
array("=LANGUAGE_ID" => null),
);
}
}
// get list of message templates of event
$messageDb = MailInternalEventMessageTable::getList(array(
'select' => array('ID'),
'filter' => $arEventMessageFilter,
'group' => array('ID')
));
while($arMessage = $messageDb->fetch())
{
$eventMessage = MailInternalEventMessageTable::getRowById($arMessage['ID']);
$eventMessage['FILE'] = array();
$attachmentDb = MailInternalEventMessageAttachmentTable::getList(array(
'select' => array('FILE_ID'),
'filter' => array('=EVENT_MESSAGE_ID' => $arMessage['ID']),
));
while($arAttachmentDb = $attachmentDb->fetch())
{
$eventMessage['FILE'][] = $arAttachmentDb['FILE_ID'];
}
$context = new Context();
$arFields = $arEvent['FIELDS'];
foreach (GetModuleEvents("main", "OnBeforeEventSend", true) as $event)
{
if(ExecuteModuleEventEx($event, array(&$arFields, &$eventMessage, $context, &$arResult)) === false)
{
continue 2;
}
}
// get message object for send mail
$arMessageParams = array(
'EVENT' => $arEvent,
'FIELDS' => $arFields,
'MESSAGE' => $eventMessage,
'SITE' => $arSites,
'CHARSET' => $charset,
);
$message = EventMessageCompiler::createInstance($arMessageParams);
try
{
$message->compile();
}
catch(StopException $e)
{
$arResult["Was"] = true;
$arResult["Fail"] = true;
continue;
}
// send mail
$result = MainMailMail::send(array(
'TO' => $message->getMailTo(),
'SUBJECT' => $message->getMailSubject(),
'BODY' => $message->getMailBody(),
'HEADER' => $message->getMailHeaders(),
'CHARSET' => $message->getMailCharset(),
'CONTENT_TYPE' => $message->getMailContentType(),
'MESSAGE_ID' => $message->getMailId(),
'ATTACHMENT' => $message->getMailAttachment(),
'TRACK_READ' => $trackRead,
'TRACK_CLICK' => $trackClick,
'LINK_PROTOCOL' => ConfigOption::get("main", "mail_link_protocol", ''),
'LINK_DOMAIN' => $serverName,
'CONTEXT' => $context,
));
if($result)
$arResult["Success"] = true;
else
$arResult["Fail"] = true;
$arResult["Was"] = true;
}
if($arResult["Was"])
{
if($arResult["Success"])
{
if($arResult["Fail"])
$flag = static::SEND_RESULT_PARTLY; // partly sent
else
$flag = static::SEND_RESULT_SUCCESS; // all sent
}
else
{
if($arResult["Fail"])
$flag = static::SEND_RESULT_ERROR; // all templates failed
}
}
elseif($arResult["Skip"])
{
$flag = static::SEND_RESULT_NONE; // skip this event
}
return $flag;
}