%PDF- %PDF-
Direktori : /proc/self/root/home/bitrix/www/bitrix/modules/subscribe/classes/general/ |
Current File : //proc/self/root/home/bitrix/www/bitrix/modules/subscribe/classes/general/template.php |
<? IncludeModuleLangFile(__FILE__); class CPostingTemplate { var $LAST_ERROR = ""; //Get list public static function GetList() { $io = CBXVirtualIo::GetInstance(); $arTemplates = array(); $dir = substr(getLocalPath("php_interface/subscribe/templates", BX_PERSONAL_ROOT), 1); //cut leading slash $abs_dir = $_SERVER["DOCUMENT_ROOT"]."/".$dir; if ($io->DirectoryExists($abs_dir)) { $d = $io->GetDirectory($abs_dir); foreach ($d->GetChildren() as $dir_entry) { if ($dir_entry->IsDirectory()) { $arTemplates[] = $dir."/".$dir_entry->GetName(); } } } return $arTemplates; } public static function GetByID($path="") { global $MESS; if(!CPostingTemplate::IsExists($path)) return false; $arTemplate = array(); $strFileName= $_SERVER["DOCUMENT_ROOT"]."/".$path."/lang/".LANGUAGE_ID."/description.php"; if(file_exists($strFileName)) include($strFileName); $strFileName= $_SERVER["DOCUMENT_ROOT"]."/".$path."/description.php"; if(file_exists($strFileName)) include($strFileName); $arTemplate["PATH"] = $path; return $arTemplate; } public static function IsExists($path="") { $io = CBXVirtualIo::GetInstance(); $dir = substr(getLocalPath("php_interface/subscribe/templates", BX_PERSONAL_ROOT), 1); if (strpos($path, $dir."/") === 0) { $template = substr($path, strlen($dir) + 1); if( strpos($template, "\0") !== false || strpos($template, "\\") !== false || strpos($template, "/") !== false || strpos($template, "..") !== false ) { return false; } return $io->DirectoryExists($_SERVER["DOCUMENT_ROOT"]."/".$path); } return false; } public static function Execute() { $rubrics = CRubric::GetList(array(), array("ACTIVE"=>"Y", "AUTO"=>"Y")); $current_time = time(); $time_of_exec = false; $result = ""; while(($arRubric=$rubrics->Fetch()) && $time_of_exec===false) { if ($arRubric["LAST_EXECUTED"] == '') continue; $last_executed = MakeTimeStamp(ConvertDateTime($arRubric["LAST_EXECUTED"], "DD.MM.YYYY HH:MI:SS"), "DD.MM.YYYY HH:MI:SS"); if ($last_executed <= 0) continue; //parse schedule $arDoM = CPostingTemplate::ParseDaysOfMonth($arRubric["DAYS_OF_MONTH"]); $arDoW = CPostingTemplate::ParseDaysOfWeek($arRubric["DAYS_OF_WEEK"]); $arToD = CPostingTemplate::ParseTimesOfDay($arRubric["TIMES_OF_DAY"]); if($arToD) sort($arToD, SORT_NUMERIC); //sdate = truncate(last_execute) $arSDate = localtime($last_executed); $sdate = mktime(0, 0, 0, $arSDate[4]+1, $arSDate[3], $arSDate[5]+1900); while($sdate < $current_time && $time_of_exec===false) { $arSDate = localtime($sdate); if($arSDate[6]==0) $arSDate[6]=7; //determine if date is good for execution if($arDoM) { $flag = array_search($arSDate[3], $arDoM); if($arDoW) $flag = array_search($arSDate[6], $arDoW); } elseif($arDoW) $flag = array_search($arSDate[6], $arDoW); else $flag=false; if($flag!==false && $arToD) foreach($arToD as $intToD) { if($sdate+$intToD > $last_executed && $sdate+$intToD <= $current_time) { $time_of_exec = $sdate+$intToD; break; } } $sdate = mktime(0, 0, 0, date("m",$sdate), date("d",$sdate)+1, date("Y",$sdate));//next day } if($time_of_exec!==false) { $arRubric["START_TIME"] = ConvertTimeStamp($last_executed, "FULL"); $arRubric["END_TIME"] = ConvertTimeStamp($time_of_exec, "FULL"); $arRubric["SITE_ID"] = $arRubric["LID"]; CPostingTemplate::AddPosting($arRubric); } $result = "CPostingTemplate::Execute();"; } return $result; } public static function AddPosting($arRubric) { global $DB, $USER, $MESS; if(!is_object($USER)) $USER = new CUser; //Include language file for template.php $rsSite = CSite::GetByID($arRubric["SITE_ID"]); $arSite = $rsSite->Fetch(); $rsLang = CLanguage::GetByID($arSite["LANGUAGE_ID"]); $arLang = $rsLang->Fetch(); $strBody=""; $arFields=false; if(CPostingTemplate::IsExists($arRubric["TEMPLATE"])) { $strFileName= $_SERVER["DOCUMENT_ROOT"]."/".$arRubric["TEMPLATE"]."/lang/".$arSite["LANGUAGE_ID"]."/template.php"; if(file_exists($strFileName)) include($strFileName); //Execute template $strFileName= $_SERVER["DOCUMENT_ROOT"]."/".$arRubric["TEMPLATE"]."/template.php"; if(file_exists($strFileName)) { ob_start(); $arFields = @include($strFileName); $strBody = ob_get_contents(); ob_end_clean(); } } $ID = false; //If there was an array returned then add posting if(is_array($arFields)) { $arFields["BODY"] = $strBody; $cPosting=new CPosting; $arFields["AUTO_SEND_TIME"]=$arRubric["END_TIME"]; $arFields["RUB_ID"]=array($arRubric["ID"]); $arFields["MSG_CHARSET"] = $arLang["CHARSET"]; $ID = $cPosting->Add($arFields); if($ID) { if(array_key_exists("FILES", $arFields)) { foreach($arFields["FILES"] as $arFile) $cPosting->SaveFile($ID, $arFile); } if(!array_key_exists("DO_NOT_SEND", $arFields) || $arFields["DO_NOT_SEND"]!="Y") { $cPosting->ChangeStatus($ID, "P"); if(COption::GetOptionString("subscribe", "subscribe_auto_method")!=="cron") CAgent::AddAgent("CPosting::AutoSend(".$ID.",true,\"".$arRubric["LID"]."\");", "subscribe", "N", 0, $arRubric["END_TIME"], "Y", $arRubric["END_TIME"]); } } } //Update last execution time mark $strSql = "UPDATE b_list_rubric SET LAST_EXECUTED=".$DB->CharToDateFunction($arRubric["END_TIME"])." WHERE ID=".intval($arRubric["ID"]); $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); return $ID; } public static function ParseDaysOfMonth($strDaysOfMonth) { $arResult=array(); if(strlen($strDaysOfMonth) > 0) { $arDoM = explode(",", $strDaysOfMonth); $arFound = array(); foreach($arDoM as $strDoM) { if(preg_match("/^(\d{1,2})$/", trim($strDoM), $arFound)) { if(intval($arFound[1]) < 1 || intval($arFound[1]) > 31) return false; else $arResult[]=intval($arFound[1]); } elseif(preg_match("/^(\d{1,2})-(\d{1,2})$/", trim($strDoM), $arFound)) { if(intval($arFound[1]) < 1 || intval($arFound[1]) > 31 || intval($arFound[2]) < 1 || intval($arFound[2]) > 31 || intval($arFound[1]) >= intval($arFound[2])) return false; else for($i=intval($arFound[1]);$i<=intval($arFound[2]);$i++) $arResult[]=intval($i); } else return false; } } else return false; return $arResult; } public static function ParseDaysOfWeek($strDaysOfWeek) { if(strlen($strDaysOfWeek) <= 0) return false; $arResult = array(); $arDoW = explode(",", $strDaysOfWeek); foreach($arDoW as $strDoW) { $arFound = array(); if( preg_match("/^(\d)$/", trim($strDoW), $arFound) && $arFound[1] >= 1 && $arFound[1] <= 7 ) { $arResult[]=intval($arFound[1]); } else { return false; } } return $arResult; } public static function ParseTimesOfDay($strTimesOfDay) { if(strlen($strTimesOfDay) <= 0) return false; $arResult = array(); $arToD = explode(",", $strTimesOfDay); foreach($arToD as $strToD) { $arFound = array(); if( preg_match("/^(\d{1,2}):(\d{1,2})$/", trim($strToD), $arFound) && $arFound[1] <= 23 && $arFound[2] <= 59 ) { $arResult[]=intval($arFound[1])*3600+intval($arFound[2])*60; } else { return false; } } return $arResult; } } ?>