$DB->Commit(); } break; } } } $arLID = array(); $db_res = CLanguage::GetList($by_ = "sort", $order_ = "asc"); if ($db_res && ($res = $db_res->GetNext())) { do { $arLID[$res["LID"]] = $res["LID"]; } while ($res = $db_res->GetNext()); } $lAdmin->AddHeaders(array(array("id" => "ID", "content" => "ID", "default" => true), array("id" => "LID", "content" => Loc::getMessage("LANG"), "default" => true), array("id" => "EVENT_NAME", "content" => Loc::getMessage("EVENT_TYPE"), "sort" => "event_name", "default" => true), array("id" => "NAME", "content" => Loc::getMessage("EVENT_NAME"), "default" => true), array("id" => "DESCRIPTION", "content" => Loc::getMessage("EVENT_DESCRIPTION"), "default" => false), array("id" => "TEMPLATES", "content" => Loc::getMessage("EVENT_TEMPLATES"), "default" => false))); $resultMessageByTypeList = array(); $resultMessageByTypeDb = \Bitrix\Main\Mail\Internal\EventMessageTable::getList(array('select' => array('ID', 'EVENT_NAME'))); while ($messageByType = $resultMessageByTypeDb->fetch()) { $resultMessageByTypeList[$messageByType['EVENT_NAME']][] = $messageByType['ID']; } $resultList = array(); $runtimeList = array(); $arFilter['!EVENT_NAME'] = null; if (isset($arFilter['MESSAGE_ID'])) { $runtimeList[] = new \Bitrix\Main\Entity\ReferenceField('MESSAGE', 'Bitrix\\Main\\Mail\\Internal\\EventMessageTable', array('=this.EVENT_NAME' => 'ref.EVENT_NAME')); $arFilter['MESSAGE.ID'] = $arFilter['MESSAGE_ID']; unset($arFilter['MESSAGE_ID']); } $resultDb = \Bitrix\Main\Mail\Internal\EventTypeTable::getList(array('filter' => $arFilter, 'runtime' => $runtimeList, 'order' => array('EVENT_NAME' => strtoupper($order) == 'DESC' ? 'DESC' : 'ASC'))); $resultTypeList = $resultDb->fetchAll(); foreach ($resultTypeList as $type) { if (!isset($resultList[$type['EVENT_NAME']])) {
function GetList(&$by, &$order, $arFilter = array()) { $arSearch = array(); $arSqlSearch = array(); $strSqlSearch = ""; $bIsLang = false; if (is_array($arFilter)) { foreach ($arFilter as $key => $val) { if (is_array($val)) { if (count($val) <= 0) { continue; } } else { if (strlen($val) <= 0 || $val === "NOT_REF") { continue; } } $match_value_set = array_key_exists($key . "_EXACT_MATCH", $arFilter); $key = strtoupper($key); switch ($key) { case "ID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N"; if ($match == 'Y') { $val = '%' . $val . '%'; } $arSearch['%=' . $key] = $val; break; case "TYPE": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; if ($match == 'Y') { $val = '%' . $val . '%'; } $arSearch[] = array('LOGIC' => 'OR', 'EVENT_NAME' => $val, 'EVENT_MESSAGE_TYPE.NAME' => $val); break; case "EVENT_NAME": case "TYPE_ID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N"; if ($match == 'Y') { $val = '%' . $val . '%'; } $arSearch['%=EVENT_NAME'] = $val; break; case "TIMESTAMP_1": $arSqlSearch[] = "M.TIMESTAMP_X>=TO_DATE('" . FmtDate($val, "D.M.Y") . " 00:00:00','dd.mm.yyyy hh24:mi:ss')"; $arSearch['>=TIMESTAMP_X'] = $val . " 00:00:00"; break; case "TIMESTAMP_2": $arSqlSearch[] = "M.TIMESTAMP_X<=TO_DATE('" . FmtDate($val, "D.M.Y") . " 23:59:59','dd.mm.yyyy hh24:mi:ss')"; $arSearch['<=TIMESTAMP_X'] = $val . " 23:59:59"; break; case "LID": case "LANG": case "SITE_ID": $bIsLang = true; $arSearch["=SITE_ID"] = $val; break; case "ACTIVE": $arSearch['=' . $key] = $val; break; case "FROM": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; if ($match == 'Y') { $val = '%' . $val . '%'; } $arSearch['%=EMAIL_FROM'] = $val; break; case "TO": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; if ($match == 'Y') { $val = '%' . $val . '%'; } $arSearch['%=EMAIL_TO'] = $val; break; case "BCC": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; if ($match == 'Y') { $val = '%' . $val . '%'; } $arSearch['%=' . $key] = $val; break; case "SUBJECT": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; if ($match == 'Y') { $val = '%' . $val . '%'; } $arSearch['%=' . $key] = $val; break; case "BODY_TYPE": $arSearch[$key] = $val == "text" ? 'text' : 'html'; break; case "BODY": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y"; if ($match == 'Y') { $val = '%' . $val . '%'; } $arSearch['%=MESSAGE'] = $val; break; } } } if ($by == "id") { $strSqlOrder = "ID"; } elseif ($by == "active") { $strSqlOrder = "ACTIVE"; } elseif ($by == "event_name") { $strSqlOrder = "EVENT_NAME"; } elseif ($by == "from") { $strSqlOrder = "EMAIL_FROM"; } elseif ($by == "to") { $strSqlOrder = "EMAIL_TO"; } elseif ($by == "bcc") { $strSqlOrder = "BCC"; } elseif ($by == "body_type") { $strSqlOrder = "BODY_TYPE"; } elseif ($by == "subject") { $strSqlOrder = "SUBJECT"; } else { $strSqlOrder = "ID"; $by = "id"; } if ($order != "asc") { $strSqlOrderBy = "DESC"; $order = "desc"; } else { $strSqlOrderBy = "ASC"; $order = "asc"; } $arSelect = array('*', 'EVENT_MESSAGE_TYPE_ID' => 'EVENT_MESSAGE_TYPE.ID', 'EVENT_MESSAGE_TYPE_NAME' => 'EVENT_MESSAGE_TYPE.NAME', 'EVENT_MESSAGE_TYPE_EVENT_NAME' => 'EVENT_MESSAGE_TYPE.EVENT_NAME'); if ($bIsLang) { $arSelect['SITE_ID'] = 'EVENT_MESSAGE_SITE.SITE_ID'; } else { $arSelect['SITE_ID'] = 'LID'; } $resultDb = Mail\Internal\EventMessageTable::getList(array('select' => $arSelect, 'filter' => $arSearch, 'order' => array($strSqlOrder => $strSqlOrderBy), 'runtime' => array('EVENT_MESSAGE_TYPE' => array('data_type' => 'Bitrix\\Main\\Mail\\Internal\\EventType', 'reference' => array('=this.EVENT_NAME' => 'ref.EVENT_NAME', '=ref.LID' => new \Bitrix\Main\DB\SqlExpression('?', LANGUAGE_ID)))))); $resultDb->addFetchDataModifier(array('CEventMessage', 'GetListDataModifier')); $res = new CDBResult($resultDb); $strSqlSearch = GetFilterSqlSearch($arSqlSearch); $res->is_filtered = IsFiltered($strSqlSearch); return $res; }
/** * @return string */ public 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 \Bitrix\Main\ArgumentTypeException("FIELDS"); } $flag = static::SEND_RESULT_TEMPLATE_NOT_FOUND; // no templates $arResult = array("Success" => false, "Fail" => false, "Was" => 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 (count($arSites) <= 0) { return $flag; } // get charset and server name for languages of event $charset = false; $serverName = null; $siteDb = Main\SiteTable::getList(array('select' => array('SERVER_NAME', 'CULTURE_CHARSET' => 'CULTURE.CHARSET'), 'filter' => array('LID' => $arSites))); if ($arSiteDb = $siteDb->fetch()) { $charset = $arSiteDb['CULTURE_CHARSET']; $serverName = $arSiteDb['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 = MailInternal\EventMessageTable::getById($MESSAGE_ID); if ($eventMessageDb->Fetch()) { $arEventMessageFilter['ID'] = $MESSAGE_ID; $arEventMessageFilter['ACTIVE'] = 'Y'; } } if (count($arEventMessageFilter) == 0) { $arEventMessageFilter = array('ACTIVE' => 'Y', 'EVENT_NAME' => $arEvent["EVENT_NAME"], 'EVENT_MESSAGE_SITE.SITE_ID' => $arSites); } // get list of message templates of event $messageDb = MailInternal\EventMessageTable::getList(array('select' => array('ID'), 'filter' => $arEventMessageFilter, 'group' => array('ID'))); while ($arMessage = $messageDb->fetch()) { $eventMessage = MailInternal\EventMessageTable::getRowById($arMessage['ID']); $eventMessage['FILES'] = array(); $attachmentDb = MailInternal\EventMessageAttachmentTable::getList(array('select' => array('FILE_ID'), 'filter' => array('EVENT_MESSAGE_ID' => $arMessage['ID']))); while ($arAttachmentDb = $attachmentDb->fetch()) { $eventMessage['FILE'][] = $arAttachmentDb['FILE_ID']; } $arFields = $arEvent['FIELDS']; foreach (GetModuleEvents("main", "OnBeforeEventSend", true) as $event) { if (ExecuteModuleEventEx($event, array(&$arFields, &$eventMessage)) === 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); $message->compile(); // send mail $result = Main\Mail\Mail::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' => \Bitrix\Main\Config\Option::get("main", "mail_link_protocol", ''), 'LINK_DOMAIN' => $serverName)); 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; } else { $flag = static::SEND_RESULT_SUCCESS; } // all sent } else { if ($arResult["Fail"]) { $flag = static::SEND_RESULT_ERROR; } // all templates failed } } return $flag; }