Current Path : /var/www/html/clients/old.e-nkama.ru/e-nkama_bitrix/bitrix/modules/main/classes/general/ |
Current File : /var/www/html/clients/old.e-nkama.ru/e-nkama_bitrix/bitrix/modules/main/classes/general/event.php |
<? ############################################## # Bitrix: SiteManager # # Copyright (c) 2002-2005 Bitrix # # http://www.bitrixsoft.com # # mailto:admin@bitrixsoft.com # ############################################## IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/classes/general/event.php"); global $BX_EVENT_SITE_PARAMS; $BX_EVENT_SITE_PARAMS = Array(); class CAllEvent { function SendImmediate($event, $lid, $arFields, $Duplicate = "Y", $message_id="") { $flds = ""; if(is_array($arFields)) { foreach($arFields as $key => $value) { if($flds) $flds .= "&"; $flds .= CEvent::fieldencode($key)."=".CEvent::fieldencode($value); } } $arLocalFields = array( "EVENT_NAME" => $event, "C_FIELDS" => $flds, "LID" => is_array($lid)? implode(",", $lid): $lid, "DUPLICATE" => $Duplicate != "N"? "Y": "N", "MESSAGE_ID" => intval($message_id) > 0? intval($message_id): "", "DATE_INSERT" => GetTime(time(), "FULL"), "ID" => "0", ); CEvent::HandleEvent($arLocalFields); } function Send($event, $lid, $arFields, $Duplicate = "Y", $message_id="") { global $DB; $events = GetModuleEvents("main", "OnBeforeEventAdd"); while ($arEvent = $events->Fetch()) ExecuteModuleEventEx($arEvent, array(&$event, &$lid, &$arFields)); $flds = ""; if(is_array($arFields)) { foreach($arFields as $key => $value) { if($flds) $flds .= "&"; $flds .= CEvent::fieldencode($key)."=".CEvent::fieldencode($value); } } $arLocalFields = array( "EVENT_NAME" => $event, "C_FIELDS" => $flds, "LID" => is_array($lid)? implode(",", $lid): $lid, "DUPLICATE" => $Duplicate != "N"? "Y": "N", "~DATE_INSERT" => $DB->CurrentTimeFunction(), ); if(intval($message_id) > 0) $arLocalFields["MESSAGE_ID"] = intval($message_id); $fname = $_SERVER["DOCUMENT_ROOT"].BX_PERSONAL_ROOT."/managed_cache/".$DB->type."/b_event"; if(CACHED_b_event!==false && file_exists($fname)) unlink($fname); return $DB->Add("b_event", $arLocalFields, Array("C_FIELDS")); } function fieldencode($s) { if(is_array($s)) { $ret_val = ''; foreach($s as $v) $ret_val .= ($ret_val <> ''? ', ':'').CEvent::fieldencode($v); } else { $ret_val = str_replace("%", "%2", $s); $ret_val = str_replace("&","%1", $ret_val); $ret_val = str_replace("=", "%3", $ret_val); } return $ret_val; } function ExtractMailFields($str) { $ar=explode("&", $str); $newar=Array(); while (list ($key, $val) = each ($ar)) { $val=str_replace("%1","&",$val); $tar=explode("=", $val); $key=$tar[0]; $val=$tar[1]; $key=str_replace("%3","=",$key); $val=str_replace("%3","=",$val); $key=str_replace("%2","%",$key); $val=str_replace("%2","%",$val); if($key!="") $newar[$key]=$val; } return $newar; } function GetSiteFieldsArray($site_id) { global $BX_EVENT_SITE_PARAMS; if($site_id !== false && isset($BX_EVENT_SITE_PARAMS[$site_id])) return $BX_EVENT_SITE_PARAMS[$site_id]; $SITE_NAME = COption::GetOptionString("main", "site_name", $GLOBALS["SERVER_NAME"]); $SERVER_NAME = COption::GetOptionString("main", "server_name", $GLOBALS["SERVER_NAME"]); $DEFAULT_EMAIL_FROM = COption::GetOptionString("main", "email_from", "admin@".$GLOBALS["SERVER_NAME"]); if(strlen($site_id)>0) { $dbSite = CSite::GetByID($site_id); if($arSite = $dbSite->Fetch()) { $BX_EVENT_SITE_PARAMS[$site_id] = array( "SITE_NAME" => ($arSite["SITE_NAME"]<>''? $arSite["SITE_NAME"] : $SITE_NAME), "SERVER_NAME" => ($arSite["SERVER_NAME"]<>''? $arSite["SERVER_NAME"] : $SERVER_NAME), "DEFAULT_EMAIL_FROM" => ($arSite["EMAIL"]<>''? $arSite["EMAIL"] : $DEFAULT_EMAIL_FROM) ); return $BX_EVENT_SITE_PARAMS[$site_id]; } } return array( "SITE_NAME" => $SITE_NAME, "SERVER_NAME" => $SERVER_NAME, "DEFAULT_EMAIL_FROM" => $DEFAULT_EMAIL_FROM ); } function ReplaceTemplate($str, $ar) { $str = str_replace("%", "%2", $str); foreach($ar as $key=>$val) { $val = str_replace("%", "%2", $val); $val = str_replace("#", "%1", $val); $str = str_replace("#".$key."#", $val, $str); } $str = str_replace("%1", "#", $str); $str = str_replace("%2", "%", $str); return $str; } function Is8Bit($str) { for($i=0; $i<strlen($str); $i++) if(ord($str[$i])>>7) return true; return false; } function EncodeMimeString($text, $charset) { if(!CEvent::Is8Bit($text)) return $text; //$maxl = IntVal((76 - strlen($charset) + 7)*0.4); $res = ""; $maxl = 40; $eol = CEvent::GetMailEOL(); $len = strlen($text); for($i=0; $i<$len; $i=$i+$maxl) { if($i>0) $res .= $eol."\t"; $res .= "=?".$charset."?B?".base64_encode(substr($text, $i, $maxl))."?="; } return $res; } function EncodeSubject($text, $charset) { return "=?".$charset."?B?".base64_encode($text)."?="; } function EncodeHeaderFrom($text, $charset) { $i = strlen($text); while($i > 0) { if(ord(substr($text, $i-1, 1))>>7) break; $i--; } if($i==0) return $text; else return "=?".$charset."?B?".base64_encode(substr($text, 0, $i))."?=".substr($text, $i); } function GetMailEOL() { static $eol = false; if($eol!==false) return $eol; if(strtoupper(substr(PHP_OS,0,3)=='WIN')) $eol="\r\n"; elseif(strtoupper(substr(PHP_OS,0,3)!='MAC')) $eol="\n"; //unix else $eol="\r"; return $eol; } function HandleEvent($arEvent) { global $DB; $flag = "0"; // íåò øàáëîíîâ $arResult = array( "Success" => false, "Fail" => false, "Was" => false, ); $eol = CAllEvent::GetMailEOL(); $ar = CAllEvent::ExtractMailFields($arEvent["C_FIELDS"]); $arSites = explode(",", $arEvent["LID"]); foreach($arSites as $key => $value) { $value = trim($value); if(strlen($value) > 0) $arSites[$key] = "'".$DB->ForSql($value, 2)."'"; else unset($arSites[$key]); } if(count($arSites) <= 0) return $flag; $strSites = implode(", ", $arSites); $strSql = "SELECT CHARSET FROM b_lang WHERE LID IN (".$strSites.") ORDER BY DEF DESC, SORT"; $dbCharset = $DB->Query($strSql, false, "FILE: ".__FILE__."<br>LINE: ".__LINE__); $arCharset = $dbCharset->Fetch(); if(!$arCharset) return $flag; $charset = $arCharset["CHARSET"]; $strWhere = ""; $MESSAGE_ID = intval($arEvent["MESSAGE_ID"]); if($MESSAGE_ID > 0) { $strSql = "SELECT 'x' FROM b_event_message M WHERE M.ID=$MESSAGE_ID"; $z = $DB->Query($strSql); if($z->Fetch()) $strWhere = "WHERE M.ID=$MESSAGE_ID and M.ACTIVE='Y'"; } $strSql = " SELECT DISTINCT ID FROM b_event_message M ".($strWhere == ""? ", b_event_message_site MS WHERE M.ID=MS.EVENT_MESSAGE_ID AND M.ACTIVE='Y' AND M.EVENT_NAME='".$DB->ForSql($arEvent["EVENT_NAME"])."' AND MS.SITE_ID IN (".$strSites.")" : $strWhere )." "; $db_mail_result = $DB->Query($strSql); while($db_mail_result_array = $db_mail_result->Fetch()) { $rsMail = $DB->Query(" SELECT ID, SUBJECT, MESSAGE, EMAIL_FROM, EMAIL_TO, BODY_TYPE, BCC, CC, REPLY_TO, IN_REPLY_TO, PRIORITY, FIELD1_NAME, FIELD1_VALUE, FIELD2_NAME, FIELD2_VALUE FROM b_event_message M WHERE M.ID = ".intval($db_mail_result_array["ID"])." "); $db_mail_result_array = $rsMail->Fetch(); if(!$db_mail_result_array) continue; $strSqlMLid = " SELECT MS.SITE_ID FROM b_event_message_site MS WHERE MS.EVENT_MESSAGE_ID = ".$db_mail_result_array["ID"]." AND MS.SITE_ID IN (".$strSites.") "; $dbr_mlid = $DB->Query($strSqlMLid); if($ar_mlid = $dbr_mlid->Fetch()) $arFields = $ar + CAllEvent::GetSiteFieldsArray($ar_mlid["SITE_ID"]); else $arFields = $ar + CAllEvent::GetSiteFieldsArray(false); $events = GetModuleEvents("main", "OnBeforeEventSend"); while ($event = $events->Fetch()) ExecuteModuleEventEx($event, array(&$arFields, &$db_mail_result_array)); $arMailFields = Array(); $arMailFields["From"] = CAllEvent::ReplaceTemplate($db_mail_result_array["EMAIL_FROM"], $arFields); if($db_mail_result_array["BCC"]!='') { $bcc = CAllEvent::ReplaceTemplate($db_mail_result_array["BCC"], $arFields); if(strpos($bcc, "@")!==false) $arMailFields["BCC"] = $bcc; } if($db_mail_result_array["CC"]!='') $arMailFields["CC"] = CAllEvent::ReplaceTemplate($db_mail_result_array["CC"], $arFields); if($db_mail_result_array["REPLY_TO"]!='') $arMailFields["Reply-To"] = CAllEvent::ReplaceTemplate($db_mail_result_array["REPLY_TO"], $arFields); else $arMailFields["Reply-To"] = preg_replace("/(.*)\<(.*)\>/i", '$2', $arMailFields["From"]); if($db_mail_result_array["IN_REPLY_TO"]!='') $arMailFields["In-Reply-To"] = CAllEvent::ReplaceTemplate($db_mail_result_array["IN_REPLY_TO"], $arFields); if($db_mail_result_array['FIELD1_NAME']!='' && $db_mail_result_array['FIELD1_VALUE']!='') $arMailFields[$db_mail_result_array['FIELD1_NAME']] = CAllEvent::ReplaceTemplate($db_mail_result_array["FIELD1_VALUE"], $arFields); if($db_mail_result_array['FIELD2_NAME']!='' && $db_mail_result_array['FIELD2_VALUE']!='') $arMailFields[$db_mail_result_array['FIELD2_NAME']] = CAllEvent::ReplaceTemplate($db_mail_result_array["FIELD2_VALUE"], $arFields); if($db_mail_result_array["PRIORITY"]!='') $arMailFields["X-Priority"] = CAllEvent::ReplaceTemplate($db_mail_result_array["PRIORITY"], $arFields); else $arMailFields["X-Priority"] = '3 (Normal)'; foreach($ar as $f=>$v) { if(substr($f, 0, 1) == "=") $arMailFields[substr($f, 1)] = $v; } foreach($arMailFields as $k=>$v) $arMailFields[$k] = Trim($v, "\r\n"); //åñëè åñòü æåëàþùèå ïîëó÷àòü âñþ ïî÷òó, äîáàâèì èõ... if($arEvent["DUPLICATE"]=="Y") { $all_bcc = COption::GetOptionString("main", "all_bcc", ""); if(strpos($all_bcc, "@")!==false) $arMailFields["BCC"] .= (strlen($all_bcc)>0?(strlen($arMailFields["BCC"])>0?",":"").$all_bcc:""); } $email_to = CAllEvent::ReplaceTemplate($db_mail_result_array["EMAIL_TO"], $arFields); $subject = CAllEvent::ReplaceTemplate($db_mail_result_array["SUBJECT"], $arFields); if(COption::GetOptionString("main", "convert_mail_header", "Y")=="Y") { foreach($arMailFields as $k=>$v) if($k == 'From') $arMailFields[$k] = CAllEvent::EncodeHeaderFrom($v, $charset); else $arMailFields[$k] = CAllEvent::EncodeMimeString($v, $charset); $email_to = CAllEvent::EncodeMimeString($email_to, $charset); $subject = CAllEvent::EncodeSubject($subject, $charset); } if(defined("BX_MS_SMTP") && BX_MS_SMTP===true) { $email_to = preg_replace("/(.*)\<(.*)\>/i", '$2', $email_to); if($arMailFields["From"]!='') $arMailFields["From"] = preg_replace("/(.*)\<(.*)\>/i", '$2', $arMailFields["From"]); if($arMailFields["To"]!='') $arMailFields["To"] = preg_replace("/(.*)\<(.*)\>/i", '$2', $arMailFields["To"]); } if(COption::GetOptionString("main", "fill_to_mail", "N")=="Y") $arMailFields["To"] = $email_to; $header = ""; foreach($arMailFields as $k=>$v) $header .= $k.': '.$v.$eol; $header .= "X-MID: ".$arEvent["ID"].".".$db_mail_result_array["ID"]." (".$arEvent["DATE_INSERT"].")".$eol. "X-EVENT_NAME: ".$arEvent["EVENT_NAME"].$eol. ($db_mail_result_array["BODY_TYPE"]=="html" ? "Content-Type: text/html; charset=".$charset.$eol : "Content-Type: text/plain; charset=".$charset.$eol ). "Content-Transfer-Encoding: 8bit"; $message = CAllEvent::ReplaceTemplate($db_mail_result_array["MESSAGE"], $arFields); if(COption::GetOptionString("main", "send_mid", "N")=="Y") $message .= ($db_mail_result_array["BODY_TYPE"]=="html"?"<br><br>":"\n\n")."MID #".$arEvent["ID"].".".$db_mail_result_array["ID"]." (".$arEvent["DATE_INSERT"].")\n"; $message = str_replace("\r\n", "\n", $message);//óäàëèòü ýòó ñòðîêó ïðè âîçíèêíîâåíèè ïðîáëåì ñ íîâûìè ñòðîêàìè â ïèñüìàõ if(COption::GetOptionString("main", "CONVERT_UNIX_NEWLINE_2_WINDOWS", "N")=="Y") $message = str_replace("\n", "\r\n", $message); if(defined("ONLY_EMAIL") && $email_to!=ONLY_EMAIL) $arResult["Success"] = true; elseif(bxmail($email_to, $subject, $message, $header, COption::GetOptionString("main", "mail_additional_parameters", ""))) $arResult["Success"] = true; else $arResult["Fail"] = true; $arResult["Was"] = true; } if($arResult["Was"]) { if($arResult["Success"]) { if($arResult["Fail"]) $flag = "P"; // ÷àñòè÷íî îòïðàâëåíû else $flag = "Y"; // âñå îòïðàâëåíû } else { if($arResult["Fail"]) $flag = "F"; // íè ïî îäíîìó èç øàáëîíîâ íå áûëî óñïåøíîé îòïðàâêè ïèñüìà } } return $flag; } } class CAllEventMessage { function CheckFields($arFields, $ID=false) { global $DB; $this->LAST_ERROR = ""; $arMsg = Array(); if(is_set($arFields, "EMAIL_FROM") && strlen($arFields["EMAIL_FROM"])<3) { $this->LAST_ERROR .= GetMessage("BAD_EMAIL_FROM")."<br>"; $arMsg[] = array("id"=>"EMAIL_FROM", "text"=> GetMessage("BAD_EMAIL_FROM")); } if(is_set($arFields, "EMAIL_TO") && strlen($arFields["EMAIL_TO"])<3) { $this->LAST_ERROR .= GetMessage("BAD_EMAIL_TO")."<br>"; $arMsg[] = array("id"=>"EMAIL_TO", "text"=> GetMessage("BAD_EMAIL_TO")); } if($ID===false && !is_set($arFields, "EVENT_NAME")) { $this->LAST_ERROR .= GetMessage(GetMessage("MAIN_BAD_EVENT_NAME_NA"))."<br>"; $arMsg[] = array("id"=>"EVENT_NAME", "text"=> GetMessage("MAIN_BAD_EVENT_NAME_NA")); } if(is_set($arFields, "EVENT_NAME")) { $r = CEventType::GetListEx(array(), array("EVENT_NAME"=>$arFields["EVENT_NAME"]), array("type"=>"none")); if(!$r->Fetch()) { $this->LAST_ERROR .= GetMessage("BAD_EVENT_TYPE")."<br>"; $arMsg[] = array("id"=>"EVENT_NAME", "text"=> GetMessage("BAD_EVENT_TYPE")); } } if( ($ID===false && !is_set($arFields, "LID")) || (is_set($arFields, "LID") && ( (is_array($arFields["LID"]) && count($arFields["LID"])<=0) || (!is_array($arFields["LID"]) && strlen($arFields["LID"])<=0) ) ) ) { $this->LAST_ERROR .= GetMessage("MAIN_BAD_SITE_NA")."<br>"; $arMsg[] = array("id"=>"LID", "text"=> GetMessage("MAIN_BAD_SITE_NA")); } elseif(is_set($arFields, "LID")) { if(!is_array($arFields["LID"])) $arFields["LID"] = Array($arFields["LID"]); foreach($arFields["LID"] as $v) { $r = CSite::GetByID($v); if(!$r->Fetch()) { $this->LAST_ERROR .= "'".$v."' - ".GetMessage("MAIN_EVENT_BAD_SITE")."<br>"; $arMsg[] = array("id"=>"LID", "text"=> GetMessage("MAIN_EVENT_BAD_SITE")); } } } if(!empty($arMsg)) { $e = new CAdminException($arMsg); $GLOBALS["APPLICATION"]->ThrowException($e); } if(strlen($this->LAST_ERROR)>0) return false; return true; } /////////////////////////////////////////////////////////////////// // New event message template /////////////////////////////////////////////////////////////////// function Add($arFields) { global $DB; unset($arFields["ID"]); if(!$this->CheckFields($arFields)) return false; if(is_set($arFields, "ACTIVE") && $arFields["ACTIVE"]!="Y") $arFields["ACTIVE"]="N"; $arLID = Array(); if(is_set($arFields, "LID")) { if(is_array($arFields["LID"])) $arLID = $arFields["LID"]; else $arLID[] = $arFields["LID"]; $arFields["LID"] = false; $str_LID = "''"; foreach($arLID as $v) { $arFields["LID"] = $v; $str_LID .= ", '".$DB->ForSql($v)."'"; } } $ID = CDatabase::Add("b_event_message", $arFields, Array("MESSAGE")); if(count($arLID)>0) { $strSql = "DELETE FROM b_event_message_site WHERE EVENT_MESSAGE_ID=".$ID; $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); $strSql = "INSERT INTO b_event_message_site(EVENT_MESSAGE_ID, SITE_ID) ". "SELECT ".$ID.", LID ". "FROM b_lang ". "WHERE LID IN (".$str_LID.") "; $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); } return $ID; } function Update($ID, $arFields) { global $DB; if(!$this->CheckFields($arFields, $ID)) return false; if(is_set($arFields, "ACTIVE") && $arFields["ACTIVE"]!="Y") $arFields["ACTIVE"]="N"; $arLID = Array(); if(is_set($arFields, "LID")) { if(is_array($arFields["LID"])) $arLID = $arFields["LID"]; else $arLID[] = $arFields["LID"]; $arFields["LID"] = false; $str_LID = "''"; foreach($arLID as $v) { $arFields["LID"] = $v; $str_LID .= ", '".$DB->ForSql($v)."'"; } } $ID = IntVal($ID); $strUpdate = $DB->PrepareUpdate("b_event_message", $arFields); $strSql = "UPDATE b_event_message SET ".$strUpdate." WHERE ID=".$ID; $arBinds=Array(); if(is_set($arFields, "MESSAGE")) $arBinds["MESSAGE"] = $arFields["MESSAGE"]; $DB->QueryBind($strSql, $arBinds); if(count($arLID)>0) { $strSql = "DELETE FROM b_event_message_site WHERE EVENT_MESSAGE_ID=".$ID; $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); $strSql = "INSERT INTO b_event_message_site(EVENT_MESSAGE_ID, SITE_ID) ". "SELECT ".$ID.", LID ". "FROM b_lang ". "WHERE LID IN (".$str_LID.") "; $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); } return true; } /////////////////////////////////////////////////////////////////// // Query /////////////////////////////////////////////////////////////////// function GetByID($ID) { return CEventMessage::GetList($o, $b, Array("ID"=>$ID)); } function GetSite($event_message_id) { global $DB; $strSql = "SELECT L.*, MS.* FROM b_event_message_site MS, b_lang L WHERE L.LID=MS.SITE_ID AND MS.EVENT_MESSAGE_ID=".IntVal($event_message_id); return $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); } function GetLang($event_message_id) { return CEventMessage::GetSite($event_message_id); } function Delete($ID) { global $DB; $ID = Intval($ID); $bCanDelete = true; $db_events = GetModuleEvents("main", "OnBeforeEventMessageDelete"); while($arEvent = $db_events->Fetch()) if(ExecuteModuleEventEx($arEvent, array($ID))===false) { $err = GetMessage("MAIN_BEFORE_DEL_ERR").' '.$arEvent['TO_NAME']; if($ex = $APPLICATION->GetException()) $err .= ': '.$ex->GetString(); $APPLICATION->throwException($err); return false; } @set_time_limit(600); //check module event for OnDelete $events = GetModuleEvents("main", "OnEventMessageDelete"); while($arEvent = $events->Fetch()) ExecuteModuleEventEx($arEvent, array($ID)); $DB->Query("DELETE FROM b_event_message_site WHERE EVENT_MESSAGE_ID=".$ID, true); return $DB->Query("DELETE FROM b_event_message WHERE ID=".$ID, true); } } class CEventType { function CheckFields($arFields = array(), $action = "ADD", $ID = array()) { $arFilter = array(); $res = array(); $aMsg = array(); //ID, LID, EVENT_NAME, NAME, DESCRIPTION, SORT if ($action == "ADD") { if (empty($arFields["EVENT_NAME"])) $aMsg[] = array("id"=>"EVENT_NAME_EMPTY", "text"=>GetMessage("EVENT_NAME_EMPTY")); if(!is_set($arFields, "LID") && is_set($arFields, "SITE_ID")) $arFields["LID"] = $arFields["SITE_ID"]; if (is_set($arFields, "LID") && empty($arFields["LID"])) $aMsg[] = array("id"=>"LID_EMPTY", "text"=>GetMessage("LID_EMPTY")); if (empty($aMsg)) { $db_res = CEventType::GetList(array("LID" => $arFields["LID"], "EVENT_NAME" => $arFields["EVENT_NAME"])); if ($db_res && $res = $db_res->Fetch()) $aMsg[] = array("id"=>"EVENT_NAME_EXIST", "text"=>str_replace( array("#SITE_ID#", "#EVENT_NAME#"), array($arFields["LID"], $arFields["EVENT_NAME"]), GetMessage("EVENT_NAME_EXIST"))); } } elseif ($action == "UPDATE") { if (empty($ID) && (empty($ID["ID"]) || (empty($ID["EVENT_NAME"])))) { if (empty($ID)) $aMsg[] = array("id"=>"EVENT_ID_EMPTY", "text"=>GetMessage("EVENT_ID_EMPTY")); else $aMsg[] = array("id"=>"EVENT_NAME_LID_EMPTY", "text"=>GetMessage("EVENT_ID_EMPTY")); } if (empty($aMsg) && is_set($arFields, "EVENT_NAME") && (is_set($arFields, "LID"))) { if (is_set($arFields, "EVENT_NAME")) $arFilter["EVENT_NAME"] = $arFields["EVENT_NAME"]; if (is_set($arFields, "LID")) $arFilter["LID"] = $arFields["LID"]; if (!empty($arFilter) && (count($arFilter) < 2) && is_set($arFilter, "LID")) { unset($arFields["LID"]); } else { $db_res = CEventType::GetList($arFilter); if ($db_res && $res = $db_res->Fetch()) { if (($action == "UPDATE") && ((is_set($ID, "EVENT_NAME") && is_set($ID, "LID") && (($res["EVENT_NAME"] != $ID["EVENT_NAME"]) || ($res["LID"] != $ID["LID"]))) || (is_set($ID, "ID") && $res["ID"] != $ID["ID"]) || (is_set($ID, "EVENT_NAME") && ($res["EVENT_NAME"] != $ID["EVENT_NAME"])))) { $aMsg[] = array("id"=>"EVENT_NAME_EXIST", "text"=>str_replace( array("#SITE_ID#", "#EVENT_NAME#"), array($arFields["LID"], $arFields["EVENT_NAME"]), GetMessage("EVENT_NAME_EXIST"))); } } } } } else $aMsg[] = array("id"=>"ACTION_EMPTY", "text"=>GetMessage("ACTION_EMPTY")); if(!empty($aMsg)) { $e = new CAdminException($aMsg); $GLOBALS["APPLICATION"]->ThrowException($e); return false; } return true; } function Add($arFields) { global $DB; if(!is_set($arFields, "LID") && is_set($arFields, "SITE_ID")) $arFields["LID"] = $arFields["SITE_ID"]; if (CEventType::CheckFields($arFields)) { return $DB->Add("b_event_type", $arFields, Array("DESCRIPTION")); } return false; } function Update($arID = array(), $arFields = array()) { global $DB; $strSql = ""; $ID = array(); $arFieldsTemplates = array(); // îáðàòèòüñÿ ê òèïó ïî÷òîâîãî ñîáûòèÿ ìîæíî êàê ïî ID, òàê è ïî èíäåêñó (LID+EVENT_NAME) if (is_array($arID) && !empty($arID)) { foreach ($arID as $key => $val) { if (in_array($key, array("ID", "LID", "EVENT_NAME"))) $ID[$key] = $val; } } if (!empty($ID) && CEventType::CheckFields($arFields, "UPDATE", $ID)) { foreach ($ID as $key => $val) $ID[$key] = $key."='".$DB->ForSql($val)."'"; $db_res = CEventType::GetList($ID); $res = $db_res->Fetch(); $arBinds = array(); if (is_set($arFields, "DESCRIPTION")) $arBinds["DESCRIPTION"] = $arFields["DESCRIPTION"]; unset($arFields["ID"]); return $DB->QueryBind( "UPDATE b_event_type SET ".$DB->PrepareUpdate("b_event_type", $arFields)." WHERE (".implode(") AND (", $ID).")", $arBinds, false); } return false; } function Delete($arID) { global $DB; $ID = array(); if (!is_array($arID)) $arID = array("EVENT_NAME" => $arID); foreach ($arID as $k => $v) { if (!in_array(strToUpper($k), array("ID", "LID", "EVENT_NAME", "NAME", "SORT"))) continue; $ID[] = $k."='".$DB->ForSQL($v)."'"; } if (!empty($ID)) { return $DB->Query("DELETE FROM b_event_type WHERE ".implode(" AND ", $ID), true); } return false; } function GetList($arFilter=Array()) { global $DB; $arSqlSearch = Array(); $filter_keys = array_keys($arFilter); for($i=0; $i<count($filter_keys); $i++) { $val = $DB->ForSql($arFilter[$filter_keys[$i]]); if(strlen($val)<=0) continue; switch(strtoupper($filter_keys[$i])) { case "EVENT_NAME": case "TYPE_ID": $arSqlSearch[] = "ET.EVENT_NAME = '".$val."'"; break; case "LID": $arSqlSearch[] = "ET.LID = '".$val."'"; break; case "ID": $arSqlSearch[] = "ET.ID=".IntVal($val); break; } } $strSqlSearch = ""; for($i=0; $i<count($arSqlSearch); $i++) { if($i>0) $strSqlSearch .= " AND "; else $strSqlSearch = " WHERE "; $strSqlSearch .= " (".$arSqlSearch[$i].") "; } $strSql = "SELECT ID, LID, EVENT_NAME, NAME, DESCRIPTION, SORT ". "FROM b_event_type ET ".$strSqlSearch." ORDER BY ID"; $res = $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); return $res; } function GetListEx($arOrder = array(), $arFilter = array(), $arParams = array()) { global $DB; $arSqlSearch = array(); $strSqlSearch = ""; $arSqlOrder = array(); $strSqlOrder = ""; $filter_keys = array_keys($arFilter); for($i=0; $i<count($filter_keys); $i++) { $val = $DB->ForSql($arFilter[$filter_keys[$i]]); if(strlen($val)<=0) continue; $key = $filter_keys[$i]; $key_res = CEventType::GetFilterOperation($key); $key = strToUpper($key_res["FIELD"]); $strNegative = $key_res["NEGATIVE"]; $strOperation = $key_res["OPERATION"]; switch($key) { case "EVENT_NAME": case "TYPE_ID": if ($strOperation == "LIKE") $val = "%".$val."%"; $arSqlSearch[] = ($strNegative=="Y"?" #TABLE_ID#.EVENT_NAME IS NULL OR NOT ":"")."(#TABLE_ID#.EVENT_NAME ".$strOperation." '".$val."' )"; break; case "DESCRIPTION": case "NAME": if ($strOperation == "LIKE") $val = "%".$val."%"; $arSqlSearch[] = ($strNegative=="Y"?" ET.".$key." IS NULL OR NOT ":"")."(ET.".$key." ".$strOperation." '".$val."' )"; break; case "LID": $arSqlSearch[] = ($strNegative=="Y"?" ET.".$key." IS NULL OR NOT ":"")."(ET.".$key." ".$strOperation." '".$val."' )"; break; case "ID": $arSqlSearch[] = ($strNegative=="Y"?" ET.".$key." IS NULL OR NOT ":"")."(ET.".$key." ".$strOperation." ".intVal($val)." )"; break; case "MESSAGE_ID": $arSqlSearch[] = ($strNegative=="Y"?" ET.ID IS NULL OR NOT ":"")."(EM.ID ".$strOperation." ".intVal($val)." )"; break; } } if (count($arSqlSearch) > 0) $strSqlSearch = "WHERE (".implode(") AND (", $arSqlSearch).") "; if (is_array($arOrder) && count($arOrder) > 0) { foreach ($arOrder as $by=>$order) { $by = strtoupper($by); $order = strtoupper($order); $order != "ASC" ? "DESC" : "ASC"; if (in_array($by, array("EVENT_NAME", "ID"))) $arSqlOrder["EVENT_NAME"] = "EVENT_NAME ".$order; } if (empty($arSqlOrder)) $arSqlOrder["EVENT_NAME"] = "EVENT_NAME DESC"; if(count($arSqlOrder) > 0) $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder); } $strSql = " SELECT EM.EVENT_NAME AS ID, EM.EVENT_NAME AS EVENT_NAME FROM b_event_message EM LEFT JOIN b_event_type ET ON (ET.EVENT_NAME = EM.EVENT_NAME) ".str_replace("#TABLE_ID#", "EM", $strSqlSearch)." UNION SELECT ET.EVENT_NAME AS ID, ET.EVENT_NAME FROM b_event_type ET LEFT JOIN b_event_message EM ON (ET.EVENT_NAME = EM.EVENT_NAME) ".str_replace("#TABLE_ID#", "ET", $strSqlSearch)." ".$strSqlOrder; $db_res = $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); $db_res = new _CEventTypeResult($db_res, $arParams); return $db_res; } /////////////////////////////////////////////////////////////////// // selecting type /////////////////////////////////////////////////////////////////// function GetByID($ID, $LID) { global $DB; $strSql = "SELECT ET.* ". "FROM b_event_type ET ". "WHERE ET.EVENT_NAME = '".$DB->ForSql($ID)."' ". " AND ET.LID = '".$DB->ForSql($LID)."'"; $res = $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); return $res; } function GetFilterOperation($key) { $strNegative = "N"; if (substr($key, 0, 1)=="!") { $key = subStr($key, 1); $strNegative = "Y"; } $strOrNull = "N"; if (subStr($key, 0, 1)=="+") { $key = subStr($key, 1); $strOrNull = "Y"; } if (subStr($key, 0, 2)==">=") { $key = subStr($key, 2); $strOperation = ">="; } elseif (subStr($key, 0, 1)==">") { $key = subStr($key, 1); $strOperation = ">"; } elseif (subStr($key, 0, 2)=="<=") { $key = subStr($key, 2); $strOperation = "<="; } elseif (subStr($key, 0, 1)=="<") { $key = subStr($key, 1); $strOperation = "<"; } elseif (subStr($key, 0, 1)=="@") { $key = subStr($key, 1); $strOperation = "IN"; } elseif (subStr($key, 0, 1)=="~") { $key = subStr($key, 1); $strOperation = "LIKE"; } elseif (subStr($key, 0, 1)=="%") { $key = subStr($key, 1); $strOperation = "QUERY"; } else { $strOperation = "="; } return array("FIELD" => $key, "NEGATIVE" => $strNegative, "OPERATION" => $strOperation, "OR_NULL" => $strOrNull); } } class _CEventTypeResult extends CDBResult { var $type = "type"; var $LID = LANGUAGE_ID; var $SITE_ID = SITE_ID; function _CEventTypeResult($res, $arParams = array()) { $this->type = empty($arParams["type"]) ? "type" : $arParams["type"]; $this->LID = empty($arParams["LID"]) ? LANGUAGE_ID : $arParams["LID"]; $this->SITE_ID = empty($arParams["SITE_ID"]) ? SITE_ID : $arParams["SITE_ID"]; parent::CDBResult($res); } function Fetch() { global $DB; $arr = array(); $arr_lid = array(); $arr_lids = array(); if($res = parent::Fetch()) { if ($this->type != "none") { $db_res_ = CEventType::GetList(array("EVENT_NAME" => $res["EVENT_NAME"])); if ($db_res_ && $res_ = $db_res_->Fetch()) { do { $arr[$res_["ID"]] = $res_; $arr_lid[] = $res_["LID"]; $arr_lids[$res_["LID"]] = $res_; }while($res_ = $db_res_->Fetch()); } $res["ID"] = array_keys($arr); $res["LID"] = $arr_lid; $res["NAME"] = empty($arr_lids[$this->LID]["NAME"]) ? $arr_lids["en"]["NAME"] : $arr_lids[$this->LID]["NAME"]; $res["SORT"] = empty($arr_lids[$this->LID]["SORT"]) ? $arr_lids["en"]["SORT"] : $arr_lids[$this->LID]["SORT"]; $res["DESCRIPTION"] = empty($arr_lids[$this->LID]["DESCRIPTION"]) ? $arr_lids["en"]["DESCRIPTION"] : $arr_lids[$this->LID]["DESCRIPTION"]; $res["TYPE"] = $arr; if ($this->type != "type") { $arr = array(); $db_res_ = CEventMessage::GetList(($sort = "sort"), ($by = "asc"), array("EVENT_NAME" => $res["EVENT_NAME"])); if ($db_res_ && $res_ = $db_res_->Fetch()) { do { $arr[$res_["ID"]] = $res_; }while($res_ = $db_res_->Fetch()); } $res["TEMPLATES"] = $arr; } } } return $res; } } ?>