Current Path : /var/www/www-root/data/webdav/www/www.monolith-realty.ru/bitrix/modules/main/ |
Current File : /var/www/www-root/data/webdav/www/www.monolith-realty.ru/bitrix/modules/main/tools.php |
<?php /** * Bitrix Framework * @package bitrix * @subpackage main * @copyright 2001-2023 Bitrix */ use Bitrix\Main; use Bitrix\Main\Diag; use Bitrix\Main\Config\Configuration; use Bitrix\Main\Text; use Bitrix\Main\Application; use Bitrix\Main\Context; use Bitrix\Main\Security; use Bitrix\Main\SystemException; /** * @deprecated Use microtime(true) * @return float */ function getmicrotime() { return microtime(true); } /** * HTML form elements */ /** * Returns HTML "input" */ function InputType($strType, $strName, $strValue, $strCmp, $strPrintValue=false, $strPrint="", $field1="", $strId="") { $bCheck = false; if($strValue <> '') { if(is_array($strCmp)) $bCheck = in_array($strValue, $strCmp); elseif($strCmp <> '') $bCheck = in_array($strValue, explode(",", $strCmp)); } $bLabel = false; if ($strType == 'radio') $bLabel = true; $bId = true; if($strType == 'radio' || $strType == 'checkbox') { $bId = !preg_match('/^id="/', $field1) && !preg_match('/\sid="/', $field1); } return ($bLabel? '<label>': '').'<input type="'.$strType.'" '.$field1.' name="'.$strName.'"'. ($bId ? ' id="'.($strId <> ''? $strId : $strName).'"' : ''). ' value="'.$strValue.'"'. ($bCheck? ' checked':'').'>'.($strPrintValue? $strValue:$strPrint).($bLabel? '</label>': ''); } /** * Returns HTML "select" * * @param string $strBoxName Input name * @param CDBResult $a DB result with items * @param string $strDetText Empty item text * @param string $strSelectedVal Selected item value * @param string $field1 Additional attributes * @return string */ function SelectBox($strBoxName, $a, $strDetText = "", $strSelectedVal = "", $field1="class=\"typeselect\"") { $strReturnBox = "<select ".$field1." name=\"".$strBoxName."\" id=\"".$strBoxName."\">"; if ($strDetText <> '') $strReturnBox = $strReturnBox."<option value=\"NOT_REF\">".$strDetText."</option>"; while (($ar = $a->Fetch())) { $reference_id = $ar["REFERENCE_ID"] ?? ''; $reference = $ar["REFERENCE"] ?? ''; if ($reference_id == '') $reference_id = $ar["reference_id"]; if ($reference == '') $reference = $ar["reference"]; $strReturnBox = $strReturnBox."<option "; if (strcasecmp($reference_id, $strSelectedVal) == 0) $strReturnBox = $strReturnBox." selected "; $strReturnBox = $strReturnBox."value=\"".htmlspecialcharsbx($reference_id). "\">". htmlspecialcharsbx($reference)."</option>"; } return $strReturnBox."</select>"; } /** * Returns HTML multiple "select" * * @param string $strBoxName Input name * @param CDBResult $a DB result with items * @param array $arr Selected values * @param string $strDetText Empty item text * @param bool $strDetText_selected Allow to choose an empty item * @param string $size Size attribute * @param string $field1 Additional attributes * @return string */ function SelectBoxM($strBoxName, $a, $arr, $strDetText = "", $strDetText_selected = false, $size = "5", $field1="class=\"typeselect\"") { $strReturnBox = "<select ".$field1." multiple name=\"".$strBoxName."\" id=\"".$strBoxName."\" size=\"".$size."\">"; if ($strDetText <> '') { $strReturnBox = $strReturnBox."<option "; if ($strDetText_selected) $strReturnBox = $strReturnBox." selected "; $strReturnBox = $strReturnBox." value='NOT_REF'>".$strDetText."</option>"; } while ($ar = $a->Fetch()) { $reference_id = $ar["REFERENCE_ID"]; $reference = $ar["REFERENCE"]; if ($reference_id == '') $reference_id = $ar["reference_id"]; if ($reference == '') $reference = $ar["reference"]; $sel = (is_array($arr) && in_array($reference_id, $arr)? "selected": ""); $strReturnBox = $strReturnBox."<option ".$sel; $strReturnBox = $strReturnBox." value=\"".htmlspecialcharsbx($reference_id)."\">". htmlspecialcharsbx($reference)."</option>"; } return $strReturnBox."</select>"; } /** * Returns HTML multiple "select" from array * * @param string $strBoxName Input name * @param array $a Array with items * @param array|false $arr Selected values * @param string $strDetText Empty item text * @param bool $strDetText_selected Allow to choose an empty item * @param string $size Size attribute * @param string $field1 Additional attributes * @return string */ function SelectBoxMFromArray($strBoxName, $a, $arr, $strDetText = "", $strDetText_selected = false, $size = "5", $field1="class='typeselect'") { $strReturnBox = "<select ".$field1." multiple name=\"".$strBoxName."\" id=\"".$strBoxName."\" size=\"".$size."\">"; if(array_key_exists("REFERENCE_ID", $a)) $reference_id = $a["REFERENCE_ID"]; elseif(array_key_exists("reference_id", $a)) $reference_id = $a["reference_id"]; else $reference_id = array(); if(array_key_exists("REFERENCE", $a)) $reference = $a["REFERENCE"]; elseif(array_key_exists("reference", $a)) $reference = $a["reference"]; else $reference = array(); if($strDetText <> '') { $strReturnBox .= "<option "; if($strDetText_selected) $strReturnBox .= " selected "; $strReturnBox .= " value='NOT_REF'>".$strDetText."</option>"; } foreach($reference_id as $key => $value) { $sel = (is_array($arr) && in_array($value, $arr)? "selected" : ""); $strReturnBox .= "<option value=\"".htmlspecialcharsbx($value)."\" ".$sel.">". htmlspecialcharsbx($reference[$key])."</option>"; } $strReturnBox .= "</select>"; return $strReturnBox; } /** * Returns HTML "select" from array data */ function SelectBoxFromArray( $strBoxName, $db_array, $strSelectedVal = "", $strDetText = "", $field1="class='typeselect'", $go = false, $form="form1" ) { $boxName = htmlspecialcharsbx($strBoxName); if($go) { $funName = preg_replace("/[^a-z0-9_]/i", "", $strBoxName); $jsName = CUtil::JSEscape($strBoxName); $strReturnBox = "<script type=\"text/javascript\">\n". "function ".$funName."LinkUp()\n". "{var number = document.".$form."['".$jsName."'].selectedIndex;\n". "if(document.".$form."['".$jsName."'].options[number].value!=\"0\"){ \n". "document.".$form."['".$jsName."_SELECTED'].value=\"yes\";\n". "document.".$form.".submit();\n". "}}\n". "</script>\n"; $strReturnBox .= '<input type="hidden" name="'.$boxName.'_SELECTED" id="'.$boxName.'_SELECTED" value="">'; $strReturnBox .= '<select '.$field1.' name="'.$boxName.'" id="'.$boxName.'" onchange="'.$funName.'LinkUp()" class="typeselect">'; } else { $strReturnBox = '<select '.$field1.' name="'.$boxName.'" id="'.$boxName.'">'; } if(isset($db_array["reference"]) && is_array($db_array["reference"])) $ref = $db_array["reference"]; elseif(isset($db_array["REFERENCE"]) && is_array($db_array["REFERENCE"])) $ref = $db_array["REFERENCE"]; else $ref = array(); if(isset($db_array["reference_id"]) && is_array($db_array["reference_id"])) $ref_id = $db_array["reference_id"]; elseif(isset($db_array["REFERENCE_ID"]) && is_array($db_array["REFERENCE_ID"])) $ref_id = $db_array["REFERENCE_ID"]; else $ref_id = array(); if($strDetText <> '') $strReturnBox .= '<option value="">'.$strDetText.'</option>'; foreach($ref as $i => $val) { $strReturnBox .= '<option'; if(strcasecmp($ref_id[$i], $strSelectedVal) == 0) $strReturnBox .= ' selected'; $strReturnBox .= ' value="'.htmlspecialcharsbx($ref_id[$i]).'">'.htmlspecialcharsbx($val).'</option>'; } return $strReturnBox.'</select>'; } /** * Date functions */ function Calendar($sFieldName, $sFormName="skform", $sFromName="", $sToName="") { if(defined("ADMIN_SECTION") && ADMIN_SECTION == true) return CAdminCalendar::Calendar($sFieldName, $sFromName, $sToName); static $bCalendarCode = false; $func = ""; if(!$bCalendarCode) { $bCalendarCode = true; $func = "<script type=\"text/javascript\">\n". "<!--\n". "window.Calendar = function(params, dateVal)\n". "{\n". " var left, top;\n". " var width = 180, height = 160;\n". " if('['+typeof(window.event)+']' == '[object]')\n". " {\n". " top = (window.event.screenY+20+height>screen.height-40? window.event.screenY-45-height:window.event.screenY+20);\n". " left = (window.event.screenX-width/2);\n". " }\n". " else\n". " {\n". " top = Math.floor((screen.height - height)/2-14);\n". " left = Math.floor((screen.width - width)/2-5);\n". " }\n". " window.open('/bitrix/tools/calendar.php?lang=".LANGUAGE_ID.(defined("ADMIN_SECTION") && ADMIN_SECTION===true?"&admin_section=Y":"&admin_section=N")."&'+params+'&date='+escape(dateVal)+'&initdate='+escape(dateVal),'','scrollbars=no,resizable=yes,width='+width+',height='+height+',left='+left+',top='+top);\n". "}\n". "//-->\n". "</script>\n"; } return $func."<a href=\"javascript:void(0);\" onclick=\"window.Calendar('name=".urlencode($sFieldName)."&from=".urlencode($sFromName)."&to=".urlencode($sToName)."&form=".urlencode($sFormName)."', document['".$sFormName."']['".$sFieldName."'].value);\" title=\"".GetMessage("TOOLS_CALENDAR")."\"><img src=\"".BX_ROOT."/images/icons/calendar.gif\" alt=\"".GetMessage("TOOLS_CALENDAR")."\" width=\"15\" height=\"15\" border=\"0\" /></a>"; } function CalendarDate($sFromName, $sFromVal, $sFormName="skform", $size="10", $param="class=\"typeinput\"") { if(defined("ADMIN_SECTION") && ADMIN_SECTION == true) return CAdminCalendar::CalendarDate($sFromName, $sFromVal, $size, ($size > 10)); return '<input type="text" name="'.$sFromName.'" id="'.$sFromName.'" size="'.$size.'" value="'.htmlspecialcharsbx($sFromVal).'" '.$param.' /> '."\n".Calendar($sFromName, $sFormName)."\n"; } function CalendarPeriod($sFromName, $sFromVal, $sToName, $sToVal, $sFormName="skform", $show_select="N", $field_select="class=\"typeselect\"", $field_input="class=\"typeinput\"", $size="10") { if(defined("ADMIN_SECTION") && ADMIN_SECTION == true) return CAdminCalendar::CalendarPeriod($sFromName, $sToName, $sFromVal, $sToVal, ($show_select=="Y"), $size, ($size > 10)); $arr = array(); $str = ""; $ds = ""; if ($show_select=="Y") { $sname = $sFromName."_DAYS_TO_BACK"; $str = " <script type=\"text/javascript\"> function ".$sFromName."_SetDate() { var number = document.".$sFormName.".".$sname.".selectedIndex-1; document.".$sFormName.".".$sFromName.".disabled = false; if (number>=0) { document.".$sFormName.".".$sFromName.".value = dates[number]; document.".$sFormName.".".$sFromName.".disabled = true; } } </script> "; global $$sname; $value = $$sname; if ((string)$value <> '' && $value!="NOT_REF") $ds = "disabled"; ?><script type="text/javascript"> var dates = []; <? for ($i=0; $i<=90; $i++) { $prev_date = GetTime(time()-86400*$i); ?>dates[<?=$i?>]="<?=$prev_date?>";<? if (!is_array($arr["reference"])) $arr["reference"] = array(); if (!is_array($arr["reference_id"])) $arr["reference_id"] = array(); $arr["reference"][] = $i." ".GetMessage("TOOLS_DN"); $arr["reference_id"][] = $i; } ?></script><? $str .= SelectBoxFromArray($sname, $arr, $value , " ", "onchange=\"".$sFromName."_SetDate()\" ".$field_select); $str .= " "; } $str .= '<input '.$ds.' '.$field_input.' type="text" name="'.$sFromName.'" id="'.$sFromName.'" size="'.$size.'" value="'.htmlspecialcharsbx($sFromVal).'" /> '."\n". Calendar($sFromName, $sFormName, $sFromName, $sToName).' ... '."\n". '<input '.$field_input.' type="text" name="'.$sToName.'" id="'.$sToName.'" size="'.$size.'" value="'.htmlspecialcharsbx($sToVal).'" /> '."\n". Calendar($sToName, $sFormName, $sFromName, $sToName)."\n"; return '<span style="white-space: nowrap;">'.$str.'</span>'; } /** * Checks date by format */ function CheckDateTime($datetime, $format=false) { $datetime = strval($datetime); if ($format===false && defined("FORMAT_DATETIME")) $format = FORMAT_DATETIME; $ar = ParseDateTime($datetime, $format); if ($ar === false) { return false; } $day = intval($ar["DD"]); $hour = $month = 0; if (isset($ar["MMMM"])) { if (is_numeric($ar["MMMM"])) { $month = intval($ar["MMMM"]); } else { $month = GetNumMonth($ar["MMMM"]); if (!$month) $month = intval(date('m', strtotime($ar["MMMM"]))); } } elseif (isset($ar["MM"])) { $month = intval($ar["MM"]); } elseif (isset($ar["M"])) { if (is_numeric($ar["M"])) { $month = intval($ar["M"]); } else { $month = GetNumMonth($ar["M"]); if (!$month) $month = intval(date('m', strtotime($ar["M"]))); } } $year = intval($ar["YYYY"] ?? 0); if (isset($ar["HH"])) { $hour = intval($ar["HH"]); } elseif (isset($ar["H"])) { $hour = intval($ar["H"]); } elseif (isset($ar["GG"])) { $hour = intval($ar["GG"]); } elseif (isset($ar["G"])) { $hour = intval($ar["G"]); } if (isset($ar['TT']) || isset($ar['T'])) { $middletime = $ar['TT'] ?? $ar['T']; if (strcasecmp('pm', $middletime)===0) { if ($hour < 12) $hour += 12; } else { if ($hour == 12) $hour = 0; } } $min = intval($ar["MI"] ?? 0); $sec = intval($ar["SS"] ?? 0); if (!checkdate($month, $day, $year)) return false; if ($hour>24 || $hour<0 || $min<0 || $min>59 || $sec<0 || $sec>59) return false; $s1 = preg_replace("~([^:\\\\/\\s.,0-9-]+|[^:\\\\/\\s.,a-z-]+)[\n\r\t ]*~i".BX_UTF_PCRE_MODIFIER, "P", $datetime); $s2 = preg_replace("/(DD|MMMM|MM|MI|M|YYYY|HH|H|GG|G|SS|TT|T)[\n\r\t ]*/i".BX_UTF_PCRE_MODIFIER, "P", $format); if(mb_strlen($s1) <= mb_strlen($s2)) return $s1 == mb_substr($s2, 0, mb_strlen($s1)); else return $s2 == mb_substr($s1, 0, mb_strlen($s2)); } /** * Returns the number of a month */ function GetNumMonth ($month) { global $MESS; if ($month) { for ($i = 1; $i <= 12; $i++) { if (strcasecmp($MESS['MONTH_'.$i.'_S'], $month) === 0 || strcasecmp($MESS['MON_'.$i], $month) === 0 || strcasecmp($MESS['MONTH_'.$i], $month) === 0) return $i; } } return false; } /** * Returns unix timestamp from date string */ function MakeTimeStamp($datetime, $format=false) { if($format===false && defined("FORMAT_DATETIME")) $format = FORMAT_DATETIME; $ar = ParseDateTime($datetime, $format); $day = intval($ar["DD"] ?? 0); $hour = $month = 0; if (isset($ar["MMMM"])) { if (is_numeric($ar["MMMM"])) { $month = intval($ar["MMMM"]); } else { $month = GetNumMonth($ar["MMMM"]); if (!$month) $month = intval(date('m', strtotime($ar["MMMM"]))); } } elseif (isset($ar["MM"])) { $month = intval($ar["MM"]); } elseif (isset($ar["M"])) { if (is_numeric($ar["M"])) { $month = intval($ar["M"]); } else { $month = GetNumMonth($ar["M"], true); if (!$month) $month = intval(date('m', strtotime($ar["M"]))); } } $year = intval($ar["YYYY"] ?? 0); if (isset($ar["HH"])) { $hour = intval($ar["HH"]); } elseif (isset($ar["H"])) { $hour = intval($ar["H"]); } elseif (isset($ar["GG"])) { $hour = intval($ar["GG"]); } elseif (isset($ar["G"])) { $hour = intval($ar["G"]); } if (isset($ar['TT']) || isset($ar['T'])) { $middletime = $ar['TT'] ?? $ar['T']; if (strcasecmp('pm', $middletime)===0) { if ($hour < 12) $hour += 12; } else { if ($hour == 12) $hour = 0; } } $min = intval($ar["MI"] ?? 0); $sec = intval($ar["SS"] ?? 0); if(!checkdate($month, $day, $year)) return false; if($hour>24 || $hour<0 || $min<0 || $min>59 || $sec<0 || $sec>59) return false; return mktime($hour, $min, $sec, $month, $day, $year); } /** * Parse a date into an array */ function ParseDateTime($datetime, $format=false) { if ($datetime === null) { return false; } if ($format===false && defined("FORMAT_DATETIME")) $format = FORMAT_DATETIME; $fm_args = array(); if(preg_match_all("/(DD|MI|MMMM|MM|M|YYYY|HH|H|SS|TT|T|GG|G)/i", $format , $fm_args)) { $dt_args = array(); if(preg_match_all("~([^:\\\\/\\s.,0-9-]+|[^:\\\\/\\s.,a-z-]+)~i".BX_UTF_PCRE_MODIFIER, $datetime, $dt_args)) { $arrResult = array(); foreach($fm_args[0] as $i => $v) { if (isset($dt_args[0][$i])) { if (is_numeric($dt_args[0][$i])) { $arrResult[$v] = sprintf("%0".mb_strlen($v)."d", intval($dt_args[0][$i])); } elseif(($dt_args[0][$i] == "am" || $dt_args[0][$i] == "pm") && array_search("T", $fm_args[0]) !== false) { $arrResult["T"] = $dt_args[0][$i]; } elseif(($dt_args[0][$i] == "AM" || $dt_args[0][$i] == "PM") && array_search("TT", $fm_args[0]) !== false) { $arrResult["TT"] = $dt_args[0][$i]; } else { $arrResult[$v] = $dt_args[0][$i]; } } } return $arrResult; } } return false; } /** * Adds value to the date in timestamp */ function AddToTimeStamp($arrAdd, $stmp=false) { if ($stmp === false) $stmp = time(); if (is_array($arrAdd)) { foreach($arrAdd as $key => $value) { $value = intval($value); switch ($key) { case "DD": $stmp = AddTime($stmp, $value, "D"); break; case "MM": $stmp = AddTime($stmp, $value, "MN"); break; case "YYYY": $stmp = AddTime($stmp, $value, "Y"); break; case "HH": $stmp = AddTime($stmp, $value, "H"); break; case "MI": $stmp = AddTime($stmp, $value, "M"); break; case "SS": $stmp = AddTime($stmp, $value, "S"); break; } } } return $stmp; } function ConvertDateTime($datetime, $to_format=false, $from_site=false, $bSearchInSitesOnly = false) { if ($to_format===false && defined("FORMAT_DATETIME")) $to_format = FORMAT_DATETIME; return FmtDate($datetime, $to_format, $from_site, false, $bSearchInSitesOnly); } function ConvertTimeStamp($timestamp=false, $type="SHORT", $site=false, $bSearchInSitesOnly = false) { if($timestamp === false) $timestamp = time(); return GetTime($timestamp, $type, $site, $bSearchInSitesOnly); } /** * Converts a date from site format to specified one */ function FmtDate($str_date, $format=false, $site=false, $bSearchInSitesOnly = false) { global $DB; if ($site===false && defined("SITE_ID")) $site = SITE_ID; if ($format===false && defined("FORMAT_DATETIME")) $format = FORMAT_DATETIME; return $DB->FormatDate($str_date, CSite::GetDateFormat("FULL", $site, $bSearchInSitesOnly), $format); } function _FormatDateMessage($value, $messages) { if($value < 100) $val = abs($value); else $val = abs($value % 100); $dec = $val % 10; if($val == 0) return GetMessage($messages["0"], array("#VALUE#" => $value)); elseif($val == 1) return GetMessage($messages["1"], array("#VALUE#" => $value)); elseif($val >= 10 && $val <= 20) return GetMessage($messages["10_20"], array("#VALUE#" => $value)); elseif($dec == 1) return GetMessage($messages["MOD_1"], array("#VALUE#" => $value)); elseif(2 <= $dec && $dec <= 4) return GetMessage($messages["MOD_2_4"], array("#VALUE#" => $value)); else return GetMessage($messages["MOD_OTHER"], array("#VALUE#" => $value)); } define("AM_PM_NONE", false); define("AM_PM_UPPER", 1); define("AM_PM_LOWER", 2); function IsAmPmMode($returnConst = false) { if($returnConst) { if(strpos(FORMAT_DATETIME, 'TT') !== false) { return AM_PM_UPPER; } if(strpos(FORMAT_DATETIME, 'T') !== false) { return AM_PM_LOWER; } return AM_PM_NONE; } return strpos(FORMAT_DATETIME, 'T') !== false; } function convertTimeToMilitary ($strTime, $fromFormat = 'H:MI T', $toFormat = 'HH:MI') { global $DB; $arParsedDate = ParseDateTime($strTime, $fromFormat); if (isset($arParsedDate["H"])) { $arParsedDate["HH"] = intval($arParsedDate["H"]); } elseif (isset($arParsedDate["GG"])) { $arParsedDate["HH"] = intval($arParsedDate["GG"]); } elseif (isset($arParsedDate["G"])) { $arParsedDate["HH"] = intval($arParsedDate["G"]); } if (isset($arParsedDate['TT']) || isset($arParsedDate['T'])) { $middletime = $arParsedDate['TT'] ?? $arParsedDate['T']; if (strcasecmp('pm', $middletime)===0) { if ($arParsedDate["HH"] < 12) $arParsedDate["HH"] += 12; elseif($arParsedDate["HH"] == 12) $arParsedDate["HH"] = 12; else $arParsedDate["HH"] -= 12; } } $ts = mktime($arParsedDate['HH'], $arParsedDate['MI'], ($arParsedDate['SS'] ?? 0), 3, 7, 2012); return FormatDate($DB->dateFormatToPHP($toFormat), $ts); } /** * @param string|array $format * @param int|bool|Main\Type\Date $timestamp * @param int|bool|Main\Type\Date $now * * @return string */ function FormatDate($format = "", $timestamp = false, $now = false) { global $DB; if ($timestamp === false) { $timestamp = time(); } else if ($timestamp instanceof Main\Type\Date) { $timestamp = $timestamp->getTimestamp(); } else { $timestamp = intval($timestamp); } if ($now === false) { $now = time(); } else if ($now instanceof Main\Type\Date) { $now = $now->getTimestamp(); } else { $now = intval($now); } switch($format) { case "SHORT": $format = $DB->dateFormatToPHP(FORMAT_DATE); break; case "FULL": $format = $DB->dateFormatToPHP(FORMAT_DATETIME); } if(is_array($format)) { $seconds_ago = $now - $timestamp; foreach($format as $format_interval => $format_value) { if($format_interval == "s") { if($seconds_ago < 60) return FormatDate($format_value, $timestamp, $now); } elseif(preg_match('/^s(\d+)\>?(\d+)?/', $format_interval, $match)) { if (isset($match[1]) && isset($match[2])) { if( $seconds_ago < intval($match[1]) && $seconds_ago > intval($match[2]) ) { return FormatDate($format_value, $timestamp, $now); } } else if($seconds_ago < intval($match[1])) { return FormatDate($format_value, $timestamp, $now); } } elseif($format_interval == "i") { if($seconds_ago < 60*60) return FormatDate($format_value, $timestamp, $now); } elseif(preg_match('/^i(\d+)\>?(\d+)?/', $format_interval, $match)) { if (isset($match[1]) && isset($match[2])) { if( $seconds_ago < intval($match[1])*60 && $seconds_ago > intval($match[2])*60 ) { return FormatDate($format_value, $timestamp, $now); } } else if($seconds_ago < intval($match[1])*60) { return FormatDate($format_value, $timestamp, $now); } } elseif($format_interval == "H") { if($seconds_ago < 24*60*60) return FormatDate($format_value, $timestamp, $now); } elseif(preg_match('/^H(\d+)\>?(\d+)?/', $format_interval, $match)) { if (isset($match[1]) && isset($match[2])) { if( $seconds_ago < intval($match[1])*60*60 && $seconds_ago > intval($match[2])*60*60 ) { return FormatDate($format_value, $timestamp, $now); } } else if($seconds_ago < intval($match[1])*60*60) { return FormatDate($format_value, $timestamp, $now); } } elseif($format_interval == "d") { if($seconds_ago < 31*24*60*60) return FormatDate($format_value, $timestamp, $now); } elseif(preg_match('/^d(\d+)\>?(\d+)?/', $format_interval, $match)) { if (isset($match[1]) && isset($match[2])) { if( $seconds_ago < intval($match[1])*24*60*60 && $seconds_ago > intval($match[2])*24*60*60 ) { return FormatDate($format_value, $timestamp, $now); } } else if($seconds_ago < intval($match[1])*24*60*60) { return FormatDate($format_value, $timestamp, $now); } } elseif($format_interval == "m") { if($seconds_ago < 365*24*60*60) return FormatDate($format_value, $timestamp, $now); } elseif(preg_match('/^m(\d+)\>?(\d+)?/', $format_interval, $match)) { if (isset($match[1]) && isset($match[2])) { if( $seconds_ago < intval($match[1])*31*24*60*60 && $seconds_ago > intval($match[2])*31*24*60*60 ) { return FormatDate($format_value, $timestamp, $now); } } else if($seconds_ago < intval($match[1])*31*24*60*60) { return FormatDate($format_value, $timestamp, $now); } } elseif($format_interval == "now") { if($timestamp == $now) { return FormatDate($format_value, $timestamp, $now); } } elseif($format_interval == "today") { $arNow = localtime($now); $today_1 = mktime(0, 0, 0, $arNow[4]+1, $arNow[3], $arNow[5]+1900); $today_2 = mktime(0, 0, 0, $arNow[4]+1, $arNow[3]+1, $arNow[5]+1900); if($timestamp >= $today_1 && $timestamp < $today_2) { return FormatDate($format_value, $timestamp, $now); } } elseif($format_interval == "todayFuture") { $arNow = localtime($now); $today_1 = $now; $today_2 = mktime(0, 0, 0, $arNow[4]+1, $arNow[3]+1, $arNow[5]+1900); if($timestamp >= $today_1 && $timestamp < $today_2) { return FormatDate($format_value, $timestamp, $now); } } elseif($format_interval == "yesterday") { $arNow = localtime($now); //le = number of seconds scince midnight //$le = $arSDate[0]+$arSDate[1]*60+$arSDate[2]*3600; //yesterday_1 = truncate(now)-1 $yesterday_1 = mktime(0, 0, 0, $arNow[4]+1, $arNow[3]-1, $arNow[5]+1900); //yesterday_2 = truncate(now) $yesterday_2 = mktime(0, 0, 0, $arNow[4]+1, $arNow[3], $arNow[5]+1900); if($timestamp >= $yesterday_1 && $timestamp < $yesterday_2) return FormatDate($format_value, $timestamp, $now); } elseif($format_interval == "tommorow" || $format_interval == "tomorrow") { $arNow = localtime($now); $tomorrow_1 = mktime(0, 0, 0, $arNow[4]+1, $arNow[3]+1, $arNow[5]+1900); $tomorrow_2 = mktime(0, 0, 0, $arNow[4]+1, $arNow[3]+2, $arNow[5]+1900); if($timestamp >= $tomorrow_1 && $timestamp < $tomorrow_2) return FormatDate($format_value, $timestamp, $now); } elseif($format_interval == "-") { if($seconds_ago < 0) return FormatDate($format_value, $timestamp, $now); } } return FormatDate(array_pop($format), $timestamp, $now); } $bCutZeroTime = false; if (substr($format, 0, 1) == '^') { $bCutZeroTime = true; $format = substr($format, 1); } $arFormatParts = preg_split("/(?<!\\\\)( sago|iago|isago|Hago|dago|mago|Yago| sdiff|idiff|Hdiff|ddiff|mdiff|Ydiff| sshort|ishort|Hshort|dshort|mhort|Yshort| yesterday|today|tomorrow|tommorow| X|x|j|F|f|Y|Q|M|l|D )/x", $format, 0, PREG_SPLIT_DELIM_CAPTURE); $result = ""; $currentLanguage = Main\Localization\Loc::getCurrentLang(); foreach($arFormatParts as $format_part) { switch($format_part) { case "": break; case "sago": $seconds_ago = intval($now - $timestamp); $result .= _FormatDateMessage($seconds_ago, array( "0" => "FD_SECOND_AGO_0", "1" => "FD_SECOND_AGO_1", "10_20" => "FD_SECOND_AGO_10_20", "MOD_1" => "FD_SECOND_AGO_MOD_1", "MOD_2_4" => "FD_SECOND_AGO_MOD_2_4", "MOD_OTHER" => "FD_SECOND_AGO_MOD_OTHER", )); break; case "sdiff": $seconds_ago = intval($now - $timestamp); $result .= _FormatDateMessage($seconds_ago, array( "0" => "FD_SECOND_DIFF_0", "1" => "FD_SECOND_DIFF_1", "10_20" => "FD_SECOND_DIFF_10_20", "MOD_1" => "FD_SECOND_DIFF_MOD_1", "MOD_2_4" => "FD_SECOND_DIFF_MOD_2_4", "MOD_OTHER" => "FD_SECOND_DIFF_MOD_OTHER", )); break; case "sshort": $seconds_ago = intval($now - $timestamp); $result .= GetMessage("FD_SECOND_SHORT", array("#VALUE#" => $seconds_ago)); break; case "iago": $minutes_ago = intval(($now - $timestamp) / 60); $result .= _FormatDateMessage($minutes_ago, array( "0" => "FD_MINUTE_AGO_0", "1" => "FD_MINUTE_AGO_1", "10_20" => "FD_MINUTE_AGO_10_20", "MOD_1" => "FD_MINUTE_AGO_MOD_1", "MOD_2_4" => "FD_MINUTE_AGO_MOD_2_4", "MOD_OTHER" => "FD_MINUTE_AGO_MOD_OTHER", )); break; case "idiff": $minutes_ago = intval(($now - $timestamp) / 60); $result .= _FormatDateMessage($minutes_ago, array( "0" => "FD_MINUTE_DIFF_0", "1" => "FD_MINUTE_DIFF_1", "10_20" => "FD_MINUTE_DIFF_10_20", "MOD_1" => "FD_MINUTE_DIFF_MOD_1", "MOD_2_4" => "FD_MINUTE_DIFF_MOD_2_4", "MOD_OTHER" => "FD_MINUTE_DIFF_MOD_OTHER", )); break; case "ishort": $minutes_ago = intval(($now - $timestamp) / 60); $result .= GetMessage("FD_MINUTE_SHORT", array("#VALUE#" => $minutes_ago)); break; case "isago": $minutes_ago = intval(($now - $timestamp) / 60); $result .= _FormatDateMessage($minutes_ago, array( "0" => "FD_MINUTE_0", "1" => "FD_MINUTE_1", "10_20" => "FD_MINUTE_10_20", "MOD_1" => "FD_MINUTE_MOD_1", "MOD_2_4" => "FD_MINUTE_MOD_2_4", "MOD_OTHER" => "FD_MINUTE_MOD_OTHER", )); $result .= " "; $seconds_ago = intval($now - $timestamp)-($minutes_ago*60); $result .= _FormatDateMessage($seconds_ago, array( "0" => "FD_SECOND_AGO_0", "1" => "FD_SECOND_AGO_1", "10_20" => "FD_SECOND_AGO_10_20", "MOD_1" => "FD_SECOND_AGO_MOD_1", "MOD_2_4" => "FD_SECOND_AGO_MOD_2_4", "MOD_OTHER" => "FD_SECOND_AGO_MOD_OTHER", )); break; case "Hago": $hours_ago = intval(($now - $timestamp) / 60 / 60); $result .= _FormatDateMessage($hours_ago, array( "0" => "FD_HOUR_AGO_0", "1" => "FD_HOUR_AGO_1", "10_20" => "FD_HOUR_AGO_10_20", "MOD_1" => "FD_HOUR_AGO_MOD_1", "MOD_2_4" => "FD_HOUR_AGO_MOD_2_4", "MOD_OTHER" => "FD_HOUR_AGO_MOD_OTHER", )); break; case "Hdiff": $hours_ago = intval(($now - $timestamp) / 60 / 60); $result .= _FormatDateMessage($hours_ago, array( "0" => "FD_HOUR_DIFF_0", "1" => "FD_HOUR_DIFF_1", "10_20" => "FD_HOUR_DIFF_10_20", "MOD_1" => "FD_HOUR_DIFF_MOD_1", "MOD_2_4" => "FD_HOUR_DIFF_MOD_2_4", "MOD_OTHER" => "FD_HOUR_DIFF_MOD_OTHER", )); break; case "Hshort": $hours_ago = intval(($now - $timestamp) / 60 / 60); $result .= GetMessage("FD_HOUR_SHORT", array("#VALUE#" => $hours_ago)); break; case "yesterday": $result .= GetMessage("FD_YESTERDAY"); break; case "today": $result .= GetMessage("FD_TODAY"); break; case "tommorow": // grammar error :) case "tomorrow": $result .= GetMessage("FD_TOMORROW"); break; case "dago": $days_ago = intval(($now - $timestamp) / 60 / 60 / 24); $result .= _FormatDateMessage($days_ago, array( "0" => "FD_DAY_AGO_0", "1" => "FD_DAY_AGO_1", "10_20" => "FD_DAY_AGO_10_20", "MOD_1" => "FD_DAY_AGO_MOD_1", "MOD_2_4" => "FD_DAY_AGO_MOD_2_4", "MOD_OTHER" => "FD_DAY_AGO_MOD_OTHER", )); break; case "ddiff": $days_ago = intval(($now - $timestamp) / 60 / 60 / 24); $result .= _FormatDateMessage($days_ago, array( "0" => "FD_DAY_DIFF_0", "1" => "FD_DAY_DIFF_1", "10_20" => "FD_DAY_DIFF_10_20", "MOD_1" => "FD_DAY_DIFF_MOD_1", "MOD_2_4" => "FD_DAY_DIFF_MOD_2_4", "MOD_OTHER" => "FD_DAY_DIFF_MOD_OTHER", )); break; case "dshort": $days_ago = intval(($now - $timestamp) / 60 / 60 / 24); $result .= GetMessage("FD_DAY_SHORT", array("#VALUE#" => $days_ago)); break; case "mago": $months_ago = intval(($now - $timestamp) / 60 / 60 / 24 / 31); $result .= _FormatDateMessage($months_ago, array( "0" => "FD_MONTH_AGO_0", "1" => "FD_MONTH_AGO_1", "10_20" => "FD_MONTH_AGO_10_20", "MOD_1" => "FD_MONTH_AGO_MOD_1", "MOD_2_4" => "FD_MONTH_AGO_MOD_2_4", "MOD_OTHER" => "FD_MONTH_AGO_MOD_OTHER", )); break; case "mdiff": $months_ago = intval(($now - $timestamp) / 60 / 60 / 24 / 31); $result .= _FormatDateMessage($months_ago, array( "0" => "FD_MONTH_DIFF_0", "1" => "FD_MONTH_DIFF_1", "10_20" => "FD_MONTH_DIFF_10_20", "MOD_1" => "FD_MONTH_DIFF_MOD_1", "MOD_2_4" => "FD_MONTH_DIFF_MOD_2_4", "MOD_OTHER" => "FD_MONTH_DIFF_MOD_OTHER", )); break; case "mshort": $months_ago = intval(($now - $timestamp) / 60 / 60 / 24 / 31); $result .= GetMessage("FD_MONTH_SHORT", array("#VALUE#" => $months_ago)); break; case "Yago": $years_ago = intval(($now - $timestamp) / 60 / 60 / 24 / 365); $result .= _FormatDateMessage($years_ago, array( "0" => "FD_YEARS_AGO_0", "1" => "FD_YEARS_AGO_1", "10_20" => "FD_YEARS_AGO_10_20", "MOD_1" => "FD_YEARS_AGO_MOD_1", "MOD_2_4" => "FD_YEARS_AGO_MOD_2_4", "MOD_OTHER" => "FD_YEARS_AGO_MOD_OTHER", )); break; case "Ydiff": $years_ago = intval(($now - $timestamp) / 60 / 60 / 24 / 365); $result .= _FormatDateMessage($years_ago, array( "0" => "FD_YEARS_DIFF_0", "1" => "FD_YEARS_DIFF_1", "10_20" => "FD_YEARS_DIFF_10_20", "MOD_1" => "FD_YEARS_DIFF_MOD_1", "MOD_2_4" => "FD_YEARS_DIFF_MOD_2_4", "MOD_OTHER" => "FD_YEARS_DIFF_MOD_OTHER", )); break; case "Yshort": $years_ago = intval(($now - $timestamp) / 60 / 60 / 24 / 365); $result .= _FormatDateMessage($years_ago, array( "0" => "FD_YEARS_SHORT_0", "1" => "FD_YEARS_SHORT_1", "10_20" => "FD_YEARS_SHORT_10_20", "MOD_1" => "FD_YEARS_SHORT_MOD_1", "MOD_2_4" => "FD_YEARS_SHORT_MOD_2_4", "MOD_OTHER" => "FD_YEARS_SHORT_MOD_OTHER", )); break; case "F": if($currentLanguage == "en") $result .= date($format_part, $timestamp); else $result .= GetMessage("MONTH_".date("n", $timestamp)."_S"); break; case "f": if($currentLanguage == "en") $result .= date("F", $timestamp); else $result .= GetMessage("MONTH_".date("n", $timestamp)); break; case "M": if($currentLanguage == "en") $result .= date($format_part, $timestamp); else $result .= GetMessage("MON_".date("n", $timestamp)); break; case "l": if($currentLanguage == "en") $result .= date($format_part, $timestamp); else $result .= GetMessage("DAY_OF_WEEK_".date("w", $timestamp)); break; case "D": if($currentLanguage == "en") $result .= date($format_part, $timestamp); else $result .= GetMessage("DOW_".date("w", $timestamp)); break; case "j": $dayOfMonth = date("j", $timestamp); $dayPattern = GetMessage("DOM_PATTERN"); if ($dayPattern) { $result .= str_replace("#DAY#", $dayOfMonth, $dayPattern); } else { $result .= $dayOfMonth; } break; case "Y": $year = date("Y", $timestamp); $yearPattern = GetMessage("YEAR_PATTERN"); if ($yearPattern) { $result .= str_replace("#YEAR#", $year, $yearPattern); } else { $result .= $year; } break; case "x": $ampm = IsAmPmMode(true); $timeFormat = ($ampm === AM_PM_LOWER? "g:i a" : ($ampm === AM_PM_UPPER? "g:i A" : "H:i")); $formats = array(); $formats["tomorrow"] = "tomorrow, ".$timeFormat; $formats["-"] = preg_replace('/:s/', '', $DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))); $formats["s"] = "sago"; $formats["i"] = "iago"; $formats["today"] = "today, ".$timeFormat; $formats["yesterday"] = "yesterday, ".$timeFormat; $formats[""] = preg_replace('/:s/', '', $DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))); $result .= FormatDate($formats, $timestamp, $now); break; case "X": $day = FormatDate(array( "tomorrow" => "tomorrow", "-" => $DB->DateFormatToPHP(CSite::GetDateFormat("SHORT")), "today" => "today", "yesterday" => "yesterday", "" => $DB->DateFormatToPHP(CSite::GetDateFormat("SHORT")), ), $timestamp, $now); $ampm = IsAmPmMode(true); $timeFormat = ($ampm === AM_PM_LOWER? "g:i a" : ($ampm === AM_PM_UPPER? "g:i A" : "H:i")); $formats = array(); $formats["tomorrow"] = $timeFormat; $formats["today"] = $timeFormat; $formats["yesterday"] = $timeFormat; $formats[""] = ""; $time = FormatDate($formats, $timestamp, $now); if($time <> '') { $result .= GetMessage("FD_DAY_AT_TIME", array("#DAY#" => $day, "#TIME#" => $time)); } else { $result .= $day; } break; case "Q": $days_ago = intval(($now - $timestamp) / 60 / 60 / 24); if($days_ago == 0) $result .= GetMessage("FD_DAY_DIFF_1", array("#VALUE#" => 1)); else $result .= FormatDate(array( "d" => "ddiff", "m" => "mdiff", "" => "Ydiff", ), $timestamp, $now); break; default: $result .= date($format_part, $timestamp); break; } } if ($bCutZeroTime) $result = preg_replace( array("/\\s*00:00:00\\s*/", "/(\\d\\d:\\d\\d)(:00)/", "/(\\s*00:00\\s*)(?!:)/"), array("", "\\1", ""), $result ); return $result; } function FormatDateEx($strDate, $format=false, $new_format=false) { $strDate = trim($strDate); if (false === $new_format) $new_format = CSite::GetDateFormat('FULL'); $new_format = str_replace("MI","I", $new_format); $new_format = preg_replace("/([DMYIHGST])\\1+/is".BX_UTF_PCRE_MODIFIER, "\\1", $new_format); $arParsedDate = ParseDateTime($strDate); if (isset($arParsedDate["MMMM"])) { if (is_numeric($arParsedDate["MMMM"])) { $arParsedDate["MM"] = intval($arParsedDate["MMMM"]); } else { $arParsedDate["MM"] = GetNumMonth($arParsedDate["MMMM"]); if (!$arParsedDate["MM"]) $arParsedDate["MM"] = intval(date('m', strtotime($arParsedDate["MMMM"]))); } } elseif (isset($arParsedDate["MM"])) { $arParsedDate["MM"] = intval($arParsedDate["MM"]); } elseif (isset($arParsedDate["M"])) { if (is_numeric($arParsedDate["M"])) { $arParsedDate["MM"] = intval($arParsedDate["M"]); } else { $arParsedDate["MM"] = GetNumMonth($arParsedDate["M"], true); if (!$arParsedDate["MM"]) $arParsedDate["MM"] = intval(date('m', strtotime($arParsedDate["M"]))); } } if (isset($arParsedDate["H"])) { $arParsedDate["HH"] = intval($arParsedDate["H"]); } elseif (isset($arParsedDate["GG"])) { $arParsedDate["HH"] = intval($arParsedDate["GG"]); } elseif (isset($arParsedDate["G"])) { $arParsedDate["HH"] = intval($arParsedDate["G"]); } if (isset($arParsedDate['TT']) || isset($arParsedDate['T'])) { $middletime = $arParsedDate['TT'] ?? $arParsedDate['T']; if (strcasecmp('pm', $middletime)===0) { if ($arParsedDate["HH"] < 12) $arParsedDate["HH"] += 12; else $arParsedDate["HH"] -= 12; } } if (isset($arParsedDate["YYYY"])) $arParsedDate["YY"] = $arParsedDate["YYYY"]; if (intval($arParsedDate["DD"])<=0 || intval($arParsedDate["MM"])<=0 || intval($arParsedDate["YY"])<=0) return false; $strResult = ""; if(intval($arParsedDate["YY"])>1970 && intval($arParsedDate["YY"])<2038) { $ux_time = mktime( intval($arParsedDate["HH"] ?? 0), intval($arParsedDate["MI"] ?? 0), intval($arParsedDate["SS"] ?? 0), intval($arParsedDate["MM"] ?? 0), intval($arParsedDate["DD"] ?? 0), intval($arParsedDate["YY"] ?? 0) ); $new_format_l = mb_strlen($new_format); $dontChange = false; for ($i = 0; $i < $new_format_l; $i++) { $simbol = mb_substr($new_format, $i, 1); if (!$dontChange && $simbol === "\\") { $dontChange = true; continue; } if ($dontChange) { $match = $simbol; } else { switch ($simbol) { case "F": $match=GetMessage("MONTH_".date("n", $ux_time)."_S"); break; case "f": $match=GetMessage("MONTH_".date("n", $ux_time)); break; case "M": $match=GetMessage("MON_".date("n", $ux_time)); break; case "l": $match=GetMessage("DAY_OF_WEEK_".date("w", $ux_time)); break; case "D": $match=GetMessage("DOW_".date("w", $ux_time)); break; case "j": $match = date(mb_substr($new_format, $i, 1), $ux_time); $dayPattern = GetMessage("DOM_PATTERN"); if ($dayPattern) { $match = str_replace("#DAY#", $match, $dayPattern); } break; default: $match = date(mb_substr($new_format, $i, 1), $ux_time); break; } } $strResult .= $match; $dontChange = false; } } else { if($arParsedDate["MM"]<1 || $arParsedDate["MM"]>12) $arParsedDate["MM"] = 1; $new_format_l = mb_strlen($new_format); $dontChange = false; for ($i = 0; $i < $new_format_l; $i++) { $simbol = mb_substr($new_format, $i, 1); if (!$dontChange && $simbol === "\\") { $dontChange = true; continue; } if ($dontChange) { $match = $simbol; } else { switch ($simbol) { case "F": case "f": $match = str_pad($arParsedDate["MM"], 2, "0", STR_PAD_LEFT); if (intval($arParsedDate["MM"]) > 0) $match=GetMessage("MONTH_".intval($arParsedDate["MM"]).($simbol == 'F' ? '_S' : '')); break; case "M": $match = str_pad($arParsedDate["MM"], 2, "0", STR_PAD_LEFT); if (intval($arParsedDate["MM"]) > 0) $match=GetMessage("MON_".intval($arParsedDate["MM"])); break; case "l": $match = str_pad($arParsedDate["DD"], 2, "0", STR_PAD_LEFT); if (intval($arParsedDate["DD"]) > 0) $match = GetMessage("DAY_OF_WEEK_".intval($arParsedDate["DD"])); break; case "D": $match = str_pad($arParsedDate["DD"], 2, "0", STR_PAD_LEFT); if (intval($arParsedDate["DD"]) > 0) $match = GetMessage("DOW_".intval($arParsedDate["DD"])); break; case "d": $match = str_pad($arParsedDate["DD"], 2, "0", STR_PAD_LEFT); break; case "m": $match = str_pad($arParsedDate["MM"], 2, "0", STR_PAD_LEFT); break; case "j": $match = intval($arParsedDate["DD"]); $dayPattern = GetMessage("DOM_PATTERN"); if ($dayPattern) { $match = str_replace("#DAY#", $match, $dayPattern); } break; case "Y": $match = str_pad($arParsedDate["YY"], 4, "0", STR_PAD_LEFT); break; case "y": $match = mb_substr($arParsedDate["YY"], 2); break; case "H": $match = str_pad($arParsedDate["HH"], 2, "0", STR_PAD_LEFT); break; case "i": $match = str_pad($arParsedDate["MI"], 2, "0", STR_PAD_LEFT); break; case "s": $match = str_pad($arParsedDate["SS"], 2, "0", STR_PAD_LEFT); break; case "g": $match = intval($arParsedDate["HH"]); if ($match > 12) $match = $match-12; break; case "a": case "A": $match = intval($arParsedDate["HH"]); if ($match > 12) $match = ($match-12)." PM"; else $match .= " AM"; if (mb_substr($new_format, $i, 1) == "a") $match = mb_strtolower($match); break; default: $match = mb_substr($new_format, $i, 1); break; } } $strResult .= $match; $dontChange = false; } } return $strResult; } function FormatDateFromDB ($date, $format = 'FULL', $phpFormat = false) { global $DB; if ($format == 'FULL' || $format == 'SHORT') return FormatDate($DB->DateFormatToPHP(CSite::GetDateFormat($format)), MakeTimeStamp($date)); else return FormatDate(($phpFormat ? $format : $DB->DateFormatToPHP($format)), MakeTimeStamp($date)); } /** * @deprecated Use Type\DateTime. */ function GetTime($timestamp, $type="SHORT", $site=false, $bSearchInSitesOnly = false) { global $DB; if ($site === false && ($context = Context::getCurrent()) !== null && ($culture = $context->getCulture()) !== null) { $format = ($type == "FULL" ? $culture->getFormatDatetime() : $culture->getFormatDate()); } else { $format = CSite::GetDateFormat($type, $site, $bSearchInSitesOnly); } return date($DB->DateFormatToPHP($format), $timestamp); } /** * @deprecated Use Type\DateTime. */ function AddTime($stmp, $add, $type="D") { $ret = $stmp; switch ($type) { case "H": $ret = mktime( date("H",$stmp)+$add,date("i",$stmp),date("s",$stmp), date("m",$stmp),date("d",$stmp),date("Y",$stmp)); break; case "M": $ret = mktime( date("H",$stmp),date("i",$stmp)+$add,date("s",$stmp), date("m",$stmp),date("d",$stmp),date("Y",$stmp)); break; case "S": $ret = mktime( date("H",$stmp),date("i",$stmp),date("s",$stmp)+$add, date("m",$stmp),date("d",$stmp),date("Y",$stmp)); break; case "D": $ret = mktime( date("H",$stmp),date("i",$stmp),date("s",$stmp), date("m",$stmp),date("d",$stmp)+$add,date("Y",$stmp)); break; case "MN": $ret = mktime( date("H",$stmp),date("i",$stmp),date("s",$stmp), date("m",$stmp)+$add,date("d",$stmp),date("Y",$stmp)); break; case "Y": $ret = mktime( date("H",$stmp),date("i",$stmp),date("s",$stmp), date("m",$stmp),date("d",$stmp),date("Y",$stmp)+$add); break; } return $ret; } /** * @deprecated */ function ParseDate($strDate, $format="dmy") { $day = $month = $year = 0; $args = preg_split('#[/.-]#', $strDate); $bound = min(mb_strlen($format), count($args)); for($i=0; $i<$bound; $i++) { if($format[$i] == 'm') $month = intval($args[$i]); elseif($format[$i] == 'd') $day = intval($args[$i]); elseif($format[$i] == 'y') $year = intval($args[$i]); } return (checkdate($month, $day, $year) ? array($day, $month, $year) : 0); } /** * @deprecated */ function MkDateTime($strDT, $format="d.m.Y H:i:s") { static $arr = ["d.m.Y", "d.m.Y H:i", "d.m.Y H:i:s"]; if (!(in_array($format, $arr))) { return false; } $strDT = preg_replace("/[\n\r\t ]+/", " ", $strDT); $dateTime = explode(" ", $strDT); $date = trim($dateTime[0] ?? ''); $time = trim($dateTime[1] ?? ''); $dayMonthYear = explode(".", $date); $day = intval($dayMonthYear[0] ?? 0); $month = intval($dayMonthYear[1] ?? 0); $year = intval($dayMonthYear[2] ?? 0); $hourMinSec = explode(":", $time); $hour = intval($hourMinSec[0] ?? 0); $min = intval($hourMinSec[1] ?? 0); $sec = intval($hourMinSec[2] ?? 0); if (!checkdate($month, $day, $year)) { return false; } if ($hour > 24 || $hour < 0 || $min < 0 || $min > 59 || $sec < 0 || $sec > 59) { return false; } $ts = mktime($hour, $min, $sec, $month, $day, $year); if($ts <= 0) { return false; } return $ts; } /** * @deprecated */ function PHPFormatDateTime($strDateTime, $format="d.m.Y H:i:s") { return date($format, MkDateTime(FmtDate($strDateTime,"D.M.Y H:I:S"), "d.m.Y H:i:s")); } /** * Array functions */ /* ������ ����� � ������� ���������� ������ Array ( [0] => T.NAME DESC [1] => T.NAME ASC [2] => T.ID ASC [3] => T.ID DESC [4] => T.DESC ) ����������� � Array ( [0] => T.NAME DESC [1] => T.ID ASC [2] => T.DESC ASC ) */ function DelDuplicateSort(&$arSort) { if (is_array($arSort) && !empty($arSort)) { $arSort2 = array(); foreach($arSort as $val) { $arSort1 = explode(" ", trim($val)); $order = array_pop($arSort1); $order_ = mb_strtoupper(trim($order)); if (!($order_=="DESC" || $order_=="ASC")) { $arSort1[] = $order; $order_ = ""; } $by = implode(" ", $arSort1); if($by <> '' && !array_key_exists($by, $arSort2)) $arSort2[$by] = $order_; } $arSort = array(); foreach($arSort2 as $by=>$order) $arSort[] = $by." ".$order; } } function array_convert_name_2_value($arr) { $arr_res = array(); if (is_array($arr)) { foreach($arr as $key => $value) { global $$value; $arr_res[$key] = $$value; } } return $arr_res; } function InitBVarFromArr($arr) { if (is_array($arr) && !empty($arr)) { foreach($arr as $value) { global $$value; $$value = ($$value=="Y") ? "Y" : "N"; } } } function TrimArr(&$arr, $trim_value=false) { if(!is_array($arr)) return false; $found = false; foreach($arr as $key => $value) { if ($trim_value) { $arr[$key] = trim($value); } if (trim($value) == '') { unset($arr[$key]); $found = true; } } return ($found) ? true : false; } function is_set($a, $k = false) { if ($k === false && func_num_args() == 1) { return isset($a); } if (is_array($a)) { return isset($a[$k]) || array_key_exists($k, $a); } return false; } /** * @deprecated Use Main\Security\Random * @param int $pass_len * @param bool $pass_chars * @return string */ function randString($pass_len=10, $pass_chars=false) { if(is_array($pass_chars)) { return Security\Random::getStringByArray($pass_len, $pass_chars); } else { if($pass_chars !== false) { return Security\Random::getStringByCharsets($pass_len, $pass_chars); } else { // Random::ALPHABET_NUM | Random::ALPHABET_ALPHALOWER | Random::ALPHABET_ALPHAUPPER return Security\Random::getString($pass_len, true); } } } /** * Alias for randString() * @deprecated Use Main\Security\Random * @param int $len * @return string */ function GetRandomCode($len=8) { return randString($len); } function TruncateText($strText, $intLen) { if(mb_strlen($strText) > $intLen) return rtrim(mb_substr($strText, 0, $intLen), ".")."..."; else return $strText; } function InsertSpaces($sText, $iMaxChar=80, $symbol=" ", $bHTML=false) { $iMaxChar = intval($iMaxChar); if ($iMaxChar > 0 && mb_strlen($sText) > $iMaxChar) { if ($bHTML) { $obSpacer = new CSpacer($iMaxChar, $symbol); return $obSpacer->InsertSpaces($sText); } else { return preg_replace("/([^() \\n\\r\\t%!?{}\\][-]{".$iMaxChar."})/".BX_UTF_PCRE_MODIFIER,"\\1".$symbol, $sText); } } return $sText; } function TrimExAll($str,$symbol) { while (mb_substr($str, 0, 1) == $symbol or mb_substr($str, mb_strlen($str) - 1, 1) == $symbol) $str = TrimEx($str,$symbol); return $str; } function TrimEx($str,$symbol,$side="both") { $str = trim($str); if ($side=="both") { if (mb_substr($str, 0, 1) == $symbol) $str = mb_substr($str, 1, mb_strlen($str)); if (mb_substr($str, mb_strlen($str) - 1, 1) == $symbol) $str = mb_substr($str, 0, mb_strlen($str) - 1); } elseif ($side=="left") { if (mb_substr($str, 0, 1) == $symbol) $str = mb_substr($str, 1, mb_strlen($str)); } elseif ($side=="right") { if (mb_substr($str, mb_strlen($str) - 1, 1) == $symbol) $str = mb_substr($str, 0, mb_strlen($str) - 1); } return $str; } /** * @deprecated Use Main\Text\Encoding::convertEncoding() * @param $s * @return mixed */ function utf8win1251($s) { return Main\Text\Encoding::convertEncoding($s, "UTF-8", "Windows-1251"); } /** * @deprecated * @param $str * @param false $lang * @return string */ function ToUpper($str, $lang = false) { if(!defined("BX_CUSTOM_TO_UPPER_FUNC")) { return mb_strtoupper($str); } else { $func = BX_CUSTOM_TO_UPPER_FUNC; return $func($str); } } /** * @deprecated * @param $str * @param false $lang * @return string */ function ToLower($str, $lang = false) { if(!defined("BX_CUSTOM_TO_LOWER_FUNC")) { return mb_strtolower($str); } else { $func = BX_CUSTOM_TO_LOWER_FUNC; return $func($str); } } function convert_code_tag_for_email($text="", $arMsg=array()) { if ($text == '') return ''; $helper = new CConvertorsPregReplaceHelper($arMsg["MAIN_CODE_S"]); return $helper->convertCodeTagForEmail($text); } function PrepareTxtForEmail($text, $lang=false, $convert_url_tag=true, $convert_image_tag=true) { $text = trim($text); if($text == '') return ""; if($lang===false) $lang = LANGUAGE_ID; $arMsg = IncludeModuleLangFile(__FILE__, $lang, true); $helper = new CConvertorsPregReplaceHelper($arMsg["MAIN_CODE_S"]); $text = preg_replace("#<code(\\s+[^>]*>|>)(.+?)</code(\\s+[^>]*>|>)#is", "[code]\\2[/code]", $text); $text = preg_replace_callback("#\\[code(\\s+[^\\]]*\\]|\\])(.+?)\\[/code(\\s+[^\\]]*\\]|\\])#is", array($helper, "convertCodeTagForEmail"), $text); $text = preg_replace("/^(\r|\n)+?(.*)$/", "\\2", $text); $text = preg_replace("#<b>(.+?)</b>#is", "\\1", $text); $text = preg_replace("#<i>(.+?)</i>#is", "\\1", $text); $text = preg_replace("#<u>(.+?)</u>#is", "_\\1_", $text); $text = preg_replace("#\\[b\\](.+?)\\[/b\\]#is", "\\1", $text); $text = preg_replace("#\\[i\\](.+?)\\[/i\\]#is", "\\1", $text); $text = preg_replace("#\\[u\\](.+?)\\[/u\\]#is", "_\\1_", $text); $text = preg_replace("#<(/?)quote(.*?)>#is", "[\\1quote]", $text); $s = "-------------- ".$arMsg["MAIN_QUOTE_S"]." -----------------"; $text = preg_replace("#\\[quote(.*?)\\]#is", "\n>".$s."\n", $text); $text = preg_replace("#\\[/quote(.*?)\\]#is", "\n>".str_repeat("-", mb_strlen($s))."\n", $text); if($convert_url_tag) { $text = preg_replace("#<a[^>]*href=[\"']?([^>\"' ]+)[\"']?[^>]*>(.+?)</a>#is", "\\2 (URL: \\1)", $text); $text = preg_replace("#\\[url\\](\\S+?)\\[/url\\]#is", "(URL: \\1)", $text); $text = preg_replace("#\\[url\\s*=\\s*(\\S+?)\\s*\\](.*?)\\[\\/url\\]#is", "\\2 (URL: \\1)", $text); } if($convert_image_tag) { $text = preg_replace("#<img[^>]*src=[\"']?([^>\"' ]+)[\"']?[^>]*>#is", " (IMAGE: \\1) ", $text); $text = preg_replace("#\\[img\\](.+?)\\[/img\\]#is", " (IMAGE: \\1) ", $text); } $text = preg_replace("#<ul(\\s+[^>]*>|>)#is", "\n", $text); $text = preg_replace("#<ol(\\s+[^>]*>|>)#is", "\n", $text); $text = preg_replace("#<li(\\s+[^>]*>|>)#is", " [*] ", $text); $text = preg_replace("#</li>#is", "", $text); $text = preg_replace("#</ul>#is", "\n\n", $text); $text = preg_replace("#</ol>#is", "\n\n", $text); $text = preg_replace("#\\[list\\]#is", "\n", $text); $text = preg_replace("#\\[/list\\]#is", "\n", $text); $text = preg_replace("#<br>#is", "\n", $text); $text = preg_replace("#<wbr>#is", "", $text); //$text = preg_replace("#<.+?".">#", "", $text); $text = str_replace(""", "\"", $text); $text = str_replace("\", "\\", $text); $text = str_replace("$", "\$", $text); $text = str_replace("!", "!", $text); $text = str_replace("'", "'", $text); $text = str_replace("<", "<", $text); $text = str_replace(">", ">", $text); $text = str_replace(" ", " ", $text); $text = str_replace("|", '|', $text); $text = str_replace("&", "&", $text); return $text; } function delete_special_symbols($text, $replace="") { static $arr = array( "\x1", // ��������� �� ������������� URL'�� ��������� http, https, ftp "\x2", // ��������� �� ������� ($iMaxStringLen) "\x3", // ��������� �� ������������� URL'�� ��������� mailto "\x4", // ��������� �������� \n (���������� �� ������������� <code>) "\x5", // ��������� �������� \r (���������� �� ������������� <code>) "\x6", // ��������� �������� ������ (���������� �� ������������� <code>) "\x7", // ��������� �������� ������ (���������� �� ������������� <code>) "\x8", // ��������� �������� �� "\" ); return str_replace($arr, $replace, $text); } function convert_code_tag_for_html_before($text = "") { $helper = new CConvertorsPregReplaceHelper(""); return $helper->convertCodeTagForHtmlBefore(stripslashes($text)); } function convert_code_tag_for_html_after($text = "", $code_table_class, $code_head_class, $code_body_class, $code_textarea_class) { if ($text == '') return ''; $helper = new CConvertorsPregReplaceHelper(""); $helper->setCodeClasses($code_table_class, $code_head_class, $code_body_class, $code_textarea_class); return $helper->convertCodeTagForHtmlAfter(stripslashes($text)); } function convert_open_quote_tag($quote_table_class, $quote_head_class, $quote_body_class) { global $QUOTE_OPENED; $QUOTE_OPENED++; return "<table class='$quote_table_class' width='95%' border='0' cellpadding='3' cellspacing='1'><tr><td class='".$quote_head_class."'>".GetMessage("MAIN_QUOTE")."</td></tr><tr><td class='".$quote_body_class."'>"; } function convert_close_quote_tag() { global $QUOTE_ERROR, $QUOTE_OPENED, $QUOTE_CLOSED; if ($QUOTE_OPENED == 0) { $QUOTE_ERROR++; return ''; } $QUOTE_CLOSED++; return "</td></tr></table>"; } function convert_quote_tag($text="", $quote_table_class, $quote_head_class, $quote_body_class) { global $QUOTE_ERROR, $QUOTE_OPENED, $QUOTE_CLOSED; if ($text == '') return ''; $text = stripslashes($text); $helper = new CConvertorsPregReplaceHelper(""); $helper->setQuoteClasses($quote_table_class, $quote_head_class, $quote_body_class); $txt = $text; $txt = preg_replace_callback("#\\[quote\\]#i", array($helper, "convertOpenQuoteTag"), $txt); $txt = preg_replace_callback("#\\[/quote\\]#i", array($helper, "convertCloseQuoteTag"), $txt); if ($helper->checkQuoteError()) { return $txt; } else { return $text; } } function extract_url($s) { $s2 = ''; while(mb_strpos(",}])>.", mb_substr($s, -1, 1)) !== false) { $s2 = mb_substr($s, -1, 1); $s = mb_substr($s, 0, mb_strlen($s) - 1); } $res = chr(1).$s."/".chr(1).$s2; return $res; } function convert_to_href($url, $link_class="", $event1="", $event2="", $event3="", $script="", $link_target="_self") { $url = stripslashes($url); $target = $link_target == '_self'? '': ' target="'.$link_target.'"'; $s = "<a class=\"".$link_class."\" href=\"".delete_special_symbols($url)."\"".$target.">".$url."</a>"; return $s; } // ���������� ��� ������������� ����� �� TxtToHTML function convert_to_mailto($s, $link_class="") { $s = stripslashes($s); $s = "<a class=\"".$link_class."\" href=\"mailto:".delete_special_symbols($s)."\" title=\"".GetMessage("MAIN_MAILTO")."\">".$s."</a>"; return $s; } function TxtToHTML( $str, // ����� �� ������������� $bMakeUrls = true, // true - ������������� URL � <a href="URL">URL</a> $iMaxStringLen = 0, // ���������� ����� ���� ��� �������� ��� �������� �������� ������� $QUOTE_ENABLED = "N", // Y - ������������ <QUOTE>...</QUOTE> � ����� ����� $NOT_CONVERT_AMPERSAND = "Y", // Y - �� ������������� ������ "&" � "&" $CODE_ENABLED = "N", // Y - ������������ <CODE>...</CODE> � readonly textarea $BIU_ENABLED = "N", // Y - ������������ <B>...</B> � �.�. � ������������� HTML ��� $quote_table_class = "quotetable", // css ����� �� ������ ����� $quote_head_class = "tdquotehead", // css ����� �� ����� TD ����� ����� $quote_body_class = "tdquote", // css ����� �� ����� TD ����� ����� $code_table_class = "codetable", // css ����� �� ������ ���� $code_head_class = "tdcodehead", // css ����� �� ����� TD ����� ���� $code_body_class = "tdcodebody", // css ����� �� ����� TD ����� ���� $code_textarea_class = "codetextarea", // css ����� �� textarea � ������ ���� $link_class = "txttohtmllink",// css ����� �� ����� $arUrlEvent = array(), // deprecated $link_target = "_self" // tagret ������ ������ ) { global $QUOTE_ERROR, $QUOTE_OPENED, $QUOTE_CLOSED; $QUOTE_ERROR = $QUOTE_OPENED = $QUOTE_CLOSED = 0; $str = delete_special_symbols($str); // ������� ��������� chr(2) ��� ��� � �������� ��������� ������� ������ if($iMaxStringLen>0) $str = InsertSpaces($str, $iMaxStringLen, chr(2), true); // \ => chr(8) $str = str_replace("\\", chr(8), $str); // ��������� �������� �� "\" // <quote>...</quote> => [quote]...[/quote] if ($QUOTE_ENABLED=="Y") $str = preg_replace("#(?:<|\\[)(/?)quote(.*?)(?:>|\\])#is", " [\\1quote]", $str); // <code>...</code> => [code]...[/code] // \n => chr(4) // \r => chr(5) if ($CODE_ENABLED=="Y") { $helper = new CConvertorsPregReplaceHelper(""); $str = preg_replace("#<code(\\s+[^>]*>|>)(.+?)</code(\\s+[^>]*>|>)#is", "[code]\\2[/code]", $str); $str = preg_replace_callback("#\\[code(\\s+[^\\]]*\\]|\\])(.+?)\\[/code(\\s+[^\\]]*\\]|\\])#is", array($helper, "convertCodeTagForHtmlBefore"), $str); } // <b>...</b> => [b]...[/b] // <i>...</i> => [i]...[/i] // <u>...</u> => [u]...[/u] if ($BIU_ENABLED=="Y") { $str = preg_replace("#<b(\\s+[^>]*>|>)(.+?)</b(\\s+[^>]*>|>)#is", "[b]\\2[/b]", $str); $str = preg_replace("#<i(\\s+[^>]*>|>)(.+?)</i(\\s+[^>]*>|>)#is", "[i]\\2[/i]", $str); $str = preg_replace("#<u(\\s+[^>]*>|>)(.+?)</u(\\s+[^>]*>|>)#is", "[u]\\2[/u]", $str); } // URL => chr(1).URL."/".chr(1) // EMail => chr(3).E-Mail.chr(3) if($bMakeUrls) { //hide @ from next regexp with chr(11) $str = preg_replace_callback("#((http|https|ftp):\\/\\/[a-z:@,.'/\\#\\%=~\\&?*+\\[\\]_0-9\x01-\x08-]+)#is", array("CConvertorsPregReplaceHelper", "extractUrl"), $str); $str = preg_replace("#(([=_\\.'0-9a-z+~\x01-\x08-]+)@[_0-9a-z\x01-\x08-.]+\\.[a-z]{2,10})#is", chr(3)."\\1".chr(3), $str); //replace back to @ $str = str_replace(chr(11), '@', $str); } // ��������� ������ �������� if ($NOT_CONVERT_AMPERSAND!="Y") $str = str_replace("&", "&", $str); static $search=array("<",">","\"","'","%",")","(","+"); static $replace=array("<",">",""","'","%",")","(","+"); $str = str_replace($search, $replace, $str); // chr(1).URL."/".chr(1) => <a href="URL">URL</a> // chr(3).E-Mail.chr(3) => <a href="mailto:E-Mail">E-Mail</a> if($bMakeUrls) { $helper = new CConvertorsPregReplaceHelper(""); $helper->setLinkClass($link_class); $helper->setLinkTarget($link_target); $str = preg_replace_callback("#\x01([^\n\x01]+?)/\x01#is", array($helper, "convertToHref"), $str); $str = preg_replace_callback("#\x03([^\n\x03]+?)\x03#is", array($helper, "convertToMailTo"), $str); } $str = str_replace("\r\n", "\n", $str); $str = str_replace("\n", "<br />\n", $str); $str = preg_replace("# {2}#", " ", $str); $str = preg_replace("#\t#", " ", $str); // chr(2) => " " if($iMaxStringLen>0) $str = str_replace(chr(2), "<wbr>", $str); // [quote]...[/quote] => <table>...</table> if ($QUOTE_ENABLED=="Y") { $helper = new CConvertorsPregReplaceHelper(""); $helper->setQuoteClasses($quote_table_class, $quote_head_class, $quote_body_class); $str = preg_replace_callback("#(\\[quote(.*?)\\](.*)\\[/quote(.*?)\\])#is", array($helper, "convertQuoteTag"), $str); } // [code]...[/code] => <textarea>...</textarea> // chr(4) => \n // chr(5) => \r if ($CODE_ENABLED=="Y") { $helper = new CConvertorsPregReplaceHelper(""); $helper->setCodeClasses($code_table_class, $code_head_class, $code_body_class, $code_textarea_class); $str = preg_replace_callback("#\\[code\\](.*?)\\[/code\\]#is", array($helper, "convertCodeTagForHtmlAfter"), $str); $str = str_replace(chr(4), "\n", $str); $str = str_replace(chr(5), "\r", $str); $str = str_replace(chr(6), " ", $str); $str = str_replace(chr(7), "\t", $str); $str = str_replace(chr(16), "[", $str); $str = str_replace(chr(17), "]", $str); } // [b]...[/b] => <b>...</b> // [i]...[/i] => <i>...</i> // [u]...[/u] => <u>...</u> if ($BIU_ENABLED=="Y") { $str = preg_replace("#\\[b\\](.*?)\\[/b\\]#is", "<b>\\1</b>", $str); $str = preg_replace("#\\[i\\](.*?)\\[/i\\]#is", "<i>\\1</i>", $str); $str = preg_replace("#\\[u\\](.*?)\\[/u\\]#is", "<u>\\1</u>", $str); } // chr(8) => \ $str = str_replace(chr(8), "\\", $str); $str = delete_special_symbols($str); return $str; } /********************************* Convertation of HTML to text *********************************/ function HTMLToTxt($str, $strSiteUrl="", $aDelete=array(), $maxlen=70) { //get rid of whitespace $str = preg_replace("/[\\t\\n\\r]/", " ", $str); //replace tags with placeholders static $search = array( "'<script[^>]*?>.*?</script>'si", "'<style[^>]*?>.*?</style>'si", "'<svg[^>]*?>.*?</svg>'si", "'<select[^>]*?>.*?</select>'si", "'&(quot|#34);'i", "'&(iexcl|#161);'i", "'&(cent|#162);'i", "'&(copy|#169);'i", ); static $replace = array( "", "", "", "", "\"", "!", "c", "(c)", ); $str = preg_replace($search, $replace, $str); $str = preg_replace("#<[/]{0,1}(b|i|u|em|small|strong)>#i", "", $str); $str = preg_replace("#<div[^>]*>#i", "\r\n", $str); $str = preg_replace("#<[/]{0,1}(font|div|span)[^>]*>#i", "", $str); //replace lists $str = preg_replace("#<ul[^>]*>#i", "\r\n", $str); $str = preg_replace("#<li[^>]*>#i", "\r\n - ", $str); //delete by function parameter foreach ($aDelete as $del_reg) { $str = preg_replace($del_reg, "", $str); } //replace images $str = preg_replace("/(<img\\s[^>]*?src\\s*=\\s*)([\"']?)(\\/.*?)(\\2)(\\s.+?>|\\s*>)/is", "[".chr(1).$strSiteUrl."\\3".chr(1)."] ", $str); $str = preg_replace("/(<img\\s[^>]*?src\\s*=\\s*)([\"']?)(.*?)(\\2)(\\s.+?>|\\s*>)/is", "[".chr(1)."\\3".chr(1)."] ", $str); //replace links $str = preg_replace("/(<a\\s[^>]*?href\\s*=\\s*)([\"']?)(\\/.*?)(\\2)(.*?>)(.*?)<\\/a>/is", "\\6 [".chr(1).$strSiteUrl."\\3".chr(1)."] ", $str); $str = preg_replace("/(<a\\s[^>]*?href\\s*=\\s*)([\"']?)(.*?)(\\2)(.*?>)(.*?)<\\/a>/is", "\\6 [".chr(1)."\\3".chr(1)."] ", $str); //replace <br> $str = preg_replace("#<br[^>]*>#i", "\r\n", $str); //replace <p> $str = preg_replace("#<p[^>]*>#i", "\r\n\r\n", $str); //replace <hr> $str = preg_replace("#<hr[^>]*>#i", "\r\n----------------------\r\n", $str); //replace tables $str = preg_replace("#<[/]{0,1}(thead|tbody)[^>]*>#i", "", $str); $str = preg_replace("#<([/]{0,1})th[^>]*>#i", "<\\1td>", $str); $str = preg_replace("#</td>#i", "\t", $str); $str = preg_replace("#</tr>#i", "\r\n", $str); $str = preg_replace("#<table[^>]*>#i", "\r\n", $str); $str = preg_replace("#\r\n[ ]+#", "\r\n", $str); //remove all tags $str = preg_replace("#<[/]{0,1}[^>]+>#i", "", $str); $str = preg_replace("#[ ]+ #", " ", $str); $str = str_replace("\t", " ", $str); //wrap long lines if ($maxlen > 0) { $str = preg_replace("#(^|[\\r\\n])([^\\n\\r]{".intval($maxlen)."}[^ \\r\\n]*[\\] ])([^\\r])#", "\\1\\2\r\n\\3", $str); } $str = str_replace(chr(1), " ", $str); return trim($str); } function FormatText($strText, $strTextType="text") { if(strtolower($strTextType) == "html") return $strText; return TxtToHtml($strText); } function htmlspecialcharsEx($str) { static $search = array("&", "<", ">", """, """, """, "'", "'", "<", ">", "\""); static $replace = array("&amp;", "&lt;", "&gt;", "&quot;", "&#34;", "&#x22;", "&#39;", "&#x27;", "<", ">", """); return Text\StringHelper::str_replace($search, $replace, $str); } function htmlspecialcharsback($str) { static $search = array("<", ">", """, "'", "&"); static $replace = array("<", ">", "\"", "'", "&"); return Text\StringHelper::str_replace($search, $replace, $str); } function htmlspecialcharsbx($string, $flags = ENT_COMPAT, $doubleEncode = true) { //function for php 5.4 where default encoding is UTF-8 return htmlspecialchars((string)$string, $flags, (defined("BX_UTF")? "UTF-8" : "ISO-8859-1"), $doubleEncode); } function CheckDirPath($path) { //remove file name if(mb_substr($path, -1) != "/") { $p = mb_strrpos($path, "/"); $path = mb_substr($path, 0, $p); } $path = rtrim($path, "/"); if($path == "") { //current folder always exists return true; } if(!file_exists($path)) { return mkdir($path, BX_DIR_PERMISSIONS, true); } return is_dir($path); } function CopyDirFiles($path_from, $path_to, $ReWrite = true, $Recursive = false, $bDeleteAfterCopy = false, $strExclude = "") { if (mb_strpos($path_to."/", $path_from."/") === 0 || realpath($path_to) === realpath($path_from)) return false; if (is_dir($path_from)) { CheckDirPath($path_to."/"); } elseif(is_file($path_from)) { $p = bxstrrpos($path_to, "/"); $path_to_dir = mb_substr($path_to, 0, $p); CheckDirPath($path_to_dir."/"); if (file_exists($path_to) && !$ReWrite) return false; @copy($path_from, $path_to); if(is_file($path_to)) @chmod($path_to, BX_FILE_PERMISSIONS); if ($bDeleteAfterCopy) @unlink($path_from); return true; } else { return true; } if ($handle = @opendir($path_from)) { while (($file = readdir($handle)) !== false) { if ($file == "." || $file == "..") continue; if ($strExclude <> '' && mb_substr($file, 0, mb_strlen($strExclude)) == $strExclude) continue; if (is_dir($path_from."/".$file) && $Recursive) { CopyDirFiles($path_from."/".$file, $path_to."/".$file, $ReWrite, $Recursive, $bDeleteAfterCopy, $strExclude); if ($bDeleteAfterCopy) @rmdir($path_from."/".$file); } elseif (is_file($path_from."/".$file)) { if (file_exists($path_to."/".$file) && !$ReWrite) continue; @copy($path_from."/".$file, $path_to."/".$file); @chmod($path_to."/".$file, BX_FILE_PERMISSIONS); if($bDeleteAfterCopy) @unlink($path_from."/".$file); } } @closedir($handle); if ($bDeleteAfterCopy) @rmdir($path_from); return true; } return false; } function DeleteDirFilesEx($path) { if($path == '' || $path == '/') return false; $full_path = $_SERVER["DOCUMENT_ROOT"]."/".$path; $full_path = preg_replace("#[\\\\\\/]+#", "/", $full_path); $f = true; if(is_file($full_path) || is_link($full_path)) { if(@unlink($full_path)) return true; return false; } elseif(is_dir($full_path)) { if($handle = opendir($full_path)) { while(($file = readdir($handle)) !== false) { if($file == "." || $file == "..") continue; if(!DeleteDirFilesEx($path."/".$file)) $f = false; } closedir($handle); } if(!@rmdir($full_path)) return false; return $f; } return false; } function DeleteDirFiles($frDir, $toDir, $arExept = array()) { if(is_dir($frDir)) { $d = dir($frDir); while ($entry = $d->read()) { if ($entry=="." || $entry=="..") continue; if (in_array($entry, $arExept)) continue; @unlink($toDir."/".$entry); } $d->close(); } } function RewriteFile($abs_path, $strContent) { CheckDirPath($abs_path); if(file_exists($abs_path) && !is_writable($abs_path)) @chmod($abs_path, BX_FILE_PERMISSIONS); $fd = fopen($abs_path, "wb"); if(!fwrite($fd, $strContent)) return false; @chmod($abs_path, BX_FILE_PERMISSIONS); fclose($fd); return true; } function GetScriptFileExt() { static $FILEMAN_SCRIPT_EXT = false; if($FILEMAN_SCRIPT_EXT !== false) return $FILEMAN_SCRIPT_EXT; $script_files = COption::GetOptionString("fileman", "~script_files", "php,php3,php4,php5,php6,php7,php8,phtml,pl,asp,aspx,cgi,dll,exe,ico,shtm,shtml,fcg,fcgi,fpl,asmx,pht,py,psp,var"); $arScriptFiles = array(); foreach(explode(",", mb_strtolower($script_files)) as $ext) if(($e = trim($ext)) != "") $arScriptFiles[] = $e; $FILEMAN_SCRIPT_EXT = $arScriptFiles; return $arScriptFiles; } function TrimUnsafe($path) { return rtrim($path, "\0.\\/+ "); } function RemoveScriptExtension($check_name) { $arExt = GetScriptFileExt(); $name = GetFileName($check_name); $arParts = explode(".", $name); foreach($arParts as $i => $part) { if($i > 0 && in_array(mb_strtolower(TrimUnsafe($part)), $arExt)) unset($arParts[$i]); } $path = mb_substr(TrimUnsafe($check_name), 0, -mb_strlen($name)); return $path.implode(".", $arParts); } function HasScriptExtension($check_name) { $arExt = GetScriptFileExt(); $check_name = GetFileName($check_name); $arParts = explode(".", $check_name); foreach($arParts as $i => $part) { if($i > 0 && in_array(mb_strtolower(TrimUnsafe($part)), $arExt)) return true; } return false; } function GetFileExtension($path) { $path = GetFileName($path); if($path <> '') { $pos = bxstrrpos($path, '.'); if($pos !== false) return mb_substr($path, $pos + 1); } return ''; } function GetFileNameWithoutExtension($path) { $path = GetFileName($path); if($path <> '') { $pos = bxstrrpos($path, '.'); if($pos !== false) $path = mb_substr($path, 0, $pos); return trim($path, '.'); } return ''; } function GetFileName($path) { $path = TrimUnsafe($path); $path = str_replace("\\", "/", $path); $path = rtrim($path, "/"); $p = bxstrrpos($path, "/"); if($p !== false) return mb_substr($path, $p + 1); return $path; } function IsFileUnsafe($name) { static $arFiles = false; if($arFiles === false) { $fileList = COption::GetOptionString("main", "~unsafe_files", ".htaccess,.htpasswd,web.config,global.asax"); $arFiles = explode(",", mb_strtolower($fileList)); } $name = GetFileName($name); return in_array(mb_strtolower(TrimUnsafe($name)), $arFiles); } function GetFileType($path) { $extension = GetFileExtension(mb_strtolower($path)); switch ($extension) { case "jpg": case "jpeg": case "gif": case "bmp": case "png": $type = "IMAGE"; break; case "swf": $type = "FLASH"; break; case "html": case "htm": case "asp": case "aspx": case "phtml": case "php": case "php3": case "php4": case "php5": case "php6": case "shtml": case "sql": case "txt": case "inc": case "js": case "vbs": case "tpl": case "css": case "shtm": $type = "SOURCE"; break; default: $type = "UNKNOWN"; } return $type; } function GetDirectoryIndex($path, $strDirIndex=false) { return GetDirIndex($path, $strDirIndex); } function GetDirIndex($path, $strDirIndex=false) { $doc_root = ($_SERVER["DOCUMENT_ROOT"] <> ''? $_SERVER["DOCUMENT_ROOT"] : $GLOBALS["DOCUMENT_ROOT"]); $dir = GetDirPath($path); $arrDirIndex = GetDirIndexArray($strDirIndex); if(is_array($arrDirIndex) && !empty($arrDirIndex)) { foreach($arrDirIndex as $page_index) if(file_exists($doc_root.$dir.$page_index)) return $page_index; } return "index.php"; } function GetDirIndexArray($strDirIndex=false) { static $arDefault = array("index.php", "index.html", "index.htm", "index.phtml", "default.html", "index.php3"); if($strDirIndex === false && !defined("DIRECTORY_INDEX")) return $arDefault; if($strDirIndex === false && defined("DIRECTORY_INDEX")) $strDirIndex = DIRECTORY_INDEX; $arrRes = array(); $arr = explode(" ", $strDirIndex); foreach($arr as $page_index) { $page_index = trim($page_index); if($page_index <> '') $arrRes[] = $page_index; } return $arrRes; } function GetPagePath($page=false, $get_index_page=null) { if (null === $get_index_page) { if (defined('BX_DISABLE_INDEX_PAGE')) $get_index_page = !BX_DISABLE_INDEX_PAGE; else $get_index_page = true; } if($page===false && !empty($_SERVER["REQUEST_URI"])) $page = $_SERVER["REQUEST_URI"]; if($page===false) $page = $_SERVER["SCRIPT_NAME"]; $sPath = $page; static $terminate = array("?", "#"); foreach($terminate as $term) { if(($found = mb_strpos($sPath, $term)) !== false) { $sPath = mb_substr($sPath, 0, $found); } } //nginx fix $sPath = preg_replace("/%+[0-9a-f]{0,1}$/i", "", $sPath); $sPath = urldecode($sPath); //Decoding UTF uri $sPath = Text\Encoding::convertEncodingToCurrent($sPath); if(mb_substr($sPath, -1, 1) == "/" && $get_index_page) { $sPath .= GetDirectoryIndex($sPath); } $sPath = Rel2Abs("/", $sPath); static $aSearch = array("<", ">", "\"", "'", "%", "\r", "\n", "\t", "\\"); static $aReplace = array("<", ">", """, "'", "%25", "%0d", "%0a", "%09", "%5C"); $sPath = str_replace($aSearch, $aReplace, $sPath); return $sPath; } function GetRequestUri() { $uriPath = "/".ltrim($_SERVER["REQUEST_URI"] ?? '', "/"); if (($index = mb_strpos($uriPath, "?")) !== false) { $uriPath = mb_substr($uriPath, 0, $index); } if (defined("BX_DISABLE_INDEX_PAGE") && BX_DISABLE_INDEX_PAGE === true) { if (mb_substr($uriPath, -10) === "/index.php") { $uriPath = mb_substr($uriPath, 0, -9); } } $queryString = DeleteParam(array("bxrand", "SEF_APPLICATION_CUR_PAGE_URL")); if ($queryString != "") { $uriPath = $uriPath."?".$queryString; } return $uriPath; } //light version of GetPagePath() for menu links function GetFileFromURL($page, $get_index_page=null) { if (null === $get_index_page) { if (defined('BX_DISABLE_INDEX_PAGE')) $get_index_page = !BX_DISABLE_INDEX_PAGE; else $get_index_page = true; } $found = mb_strpos($page, "?"); $sPath = ($found !== false? mb_substr($page, 0, $found) : $page); $sPath = urldecode($sPath); if(mb_substr($sPath, -1, 1) == "/" && $get_index_page) $sPath .= GetDirectoryIndex($sPath); return $sPath; } function GetDirPath($sPath) { if($sPath <> '') { $p = mb_strrpos($sPath, "/"); if($p === false) { return '/'; } else { return mb_substr($sPath, 0, $p + 1); } } else { return '/'; } } /* This function emulates php internal function basename but does not behave badly on broken locale settings */ function bx_basename($path, $ext="") { $path = rtrim($path, "\\/"); if(preg_match("#[^\\\\/]+$#", $path, $match)) $path = $match[0]; if($ext) { $ext_len = mb_strlen($ext); if(mb_strlen($path) > $ext_len && mb_substr($path, -$ext_len) == $ext) $path = mb_substr($path, 0, -$ext_len); } return $path; } function bxstrrpos($haystack, $needle) { if(defined("BX_UTF")) { //mb_strrpos does not work on invalid UTF-8 strings $ln = mb_strlen($needle); for($i = mb_strlen($haystack) - $ln; $i >= 0; $i--) if(mb_substr($haystack, $i, $ln) == $needle) return $i; return false; } return mb_strrpos($haystack, $needle); } function Rel2Abs($curdir, $relpath) { if($relpath == "") return false; if(mb_substr($relpath, 0, 1) == "/" || preg_match("#^[a-z]:/#i", $relpath)) { $res = $relpath; } else { if(mb_substr($curdir, 0, 1) != "/" && !preg_match("#^[a-z]:/#i", $curdir)) $curdir = "/".$curdir; if(mb_substr($curdir, -1) != "/") $curdir .= "/"; $res = $curdir.$relpath; } if(($p = mb_strpos($res, "\0")) !== false) { throw new Main\IO\InvalidPathException($res); } $res = _normalizePath($res); if(mb_substr($res, 0, 1) !== "/" && !preg_match("#^[a-z]:/#i", $res)) $res = "/".$res; $res = rtrim($res, ".\\+ "); return $res; } /** * @deprecated Use Main\IO\Path::normalize() */ function _normalizePath($strPath) { $strResult = ''; if($strPath <> '') { if(strncasecmp(PHP_OS, "WIN", 3) == 0) { //slashes doesn't matter for Windows $strPath = str_replace("\\", "/", $strPath); } $arPath = explode('/', $strPath); $nPath = count($arPath); $pathStack = array(); for ($i = 0; $i < $nPath; $i++) { if ($arPath[$i] === ".") continue; if (($arPath[$i] === '') && ($i !== ($nPath - 1)) && ($i !== 0)) continue; if ($arPath[$i] === "..") array_pop($pathStack); else array_push($pathStack, $arPath[$i]); } $strResult = implode("/", $pathStack); } return $strResult; } function removeDocRoot($path) { $len = mb_strlen($_SERVER["DOCUMENT_ROOT"]); if (mb_substr($path, 0, $len) == $_SERVER["DOCUMENT_ROOT"]) return "/".ltrim(mb_substr($path, $len), "/"); else return $path; } /********************************************************************* Language files *********************************************************************/ function GetMessageJS($name, $aReplace=false) { return CUtil::JSEscape(GetMessage($name, $aReplace)); } function GetMessage($name, $aReplace=null) { global $MESS; if (isset($MESS[$name])) { $s = $MESS[$name]; if (is_array($aReplace)) { $s = strtr($s, $aReplace); } return $s; } return Main\Localization\Loc::getMessage($name, $aReplace); } /** * @deprecated */ function HasMessage($name) { global $MESS; return isset($MESS[$name]); } global $ALL_LANG_FILES; $ALL_LANG_FILES = array(); /** @deprecated */ function GetLangFileName($before, $after, $lang=false) { if ($lang===false) $lang = LANGUAGE_ID; global $ALL_LANG_FILES; $ALL_LANG_FILES[] = $before.$lang.$after; if (Main\Localization\Translation::allowConvertEncoding()) { $langFile = Main\Localization\Translation::convertLangPath($before. $lang. $after, $lang); if(file_exists($langFile)) { return $langFile; } } if(file_exists($before.$lang.$after)) return $before.$lang.$after; if(file_exists($before."en".$after)) return $before."en".$after; if(strpos($before, "/bitrix/modules/") === false) return $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/lang/en/tools.php"; $old_path = rtrim($before,"/"); $old_path = mb_substr($old_path, mb_strlen($_SERVER["DOCUMENT_ROOT"])); $path = mb_substr($old_path, 16); $module = mb_substr($path, 0, mb_strpos($path, "/")); $path = mb_substr($path, mb_strpos($path, "/")); if(mb_substr($path, -5) == "/lang") $path = mb_substr($path, 0, -5); IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/".$module.$path.$after, $lang); return $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/".$module."/lang/".$lang.$path.$after; } /** * @deprecated Use Main\Localization\Loc */ function __IncludeLang($path, $bReturnArray=false, $bFileChecked=false) { global $ALL_LANG_FILES; $ALL_LANG_FILES[] = $path; if (Main\Localization\Translation::allowConvertEncoding()) { // extract language from path $language = ''; $arr = explode('/', $path); $langKey = array_search('lang', $arr); if ($langKey !== false && isset($arr[$langKey + 1])) { $language = $arr[$langKey + 1]; } static $encodingCache = array(); if (isset($encodingCache[$language])) { [$convertEncoding, $targetEncoding, $sourceEncoding] = $encodingCache[$language]; } else { $convertEncoding = Main\Localization\Translation::needConvertEncoding($language); $targetEncoding = $sourceEncoding = ''; if ($convertEncoding) { $targetEncoding = Main\Localization\Translation::getCurrentEncoding(); $sourceEncoding = Main\Localization\Translation::getSourceEncoding($language); } $encodingCache[$language] = array($convertEncoding, $targetEncoding, $sourceEncoding); } $MESS = array(); if ($bFileChecked) { include($path); } else { $path = Main\Localization\Translation::convertLangPath($path, LANGUAGE_ID); if (file_exists($path)) { include($path); } } if (!empty($MESS)) { if ($convertEncoding) { $convertEncoding = Main\Localization\Translation::checkPathRestrictionConvertEncoding($path); } foreach ($MESS as $key => $val) { if ($convertEncoding) { $val = Main\Text\Encoding::convertEncoding($val, $sourceEncoding, $targetEncoding); } $MESS[$key] = $val; if (!$bReturnArray) { $GLOBALS['MESS'][$key] = $val; } } } } else { if ($bReturnArray) { $MESS = array(); } else { global $MESS; } if ($bFileChecked) { include($path); } else { $path = Main\Localization\Translation::convertLangPath($path, LANGUAGE_ID); if (file_exists($path)) { include($path); } } } //read messages from user lang file static $bFirstCall = true; if($bFirstCall) { $bFirstCall = false; $fname = getLocalPath("php_interface/user_lang/".LANGUAGE_ID."/lang.php"); if($fname !== false) { $arMess = __IncludeLang($_SERVER["DOCUMENT_ROOT"].$fname, true, true); foreach($arMess as $key=>$val) $GLOBALS["MESS"][str_replace("\\", "/", realpath($_SERVER["DOCUMENT_ROOT"].$key))] = $val; } } //redefine messages from user lang file $path = str_replace("\\", "/", realpath($path)); if(isset($GLOBALS["MESS"][$path]) && is_array($GLOBALS["MESS"][$path])) foreach($GLOBALS["MESS"][$path] as $key=>$val) $MESS[$key] = $val; if($bReturnArray) return $MESS; else return true; } /** * @deprecated Use Main\Localization\Loc */ function IncludeTemplateLangFile($filepath, $lang=false) { $filepath = rtrim(preg_replace("'[\\\\/]+'", "/", $filepath), "/ "); $module_path = "/bitrix/modules/"; $module_name = $templ_path = $file_name = $template_name = ""; $dirs = array( "/local/templates/", BX_PERSONAL_ROOT."/templates/", ); foreach($dirs as $dir) { if(strpos($filepath, $dir) !== false) { $templ_path = $dir; $templ_pos = mb_strlen($filepath) - mb_strpos(strrev($filepath), strrev($templ_path)); $rel_path = mb_substr($filepath, $templ_pos); $p = mb_strpos($rel_path, "/"); if(!$p) return null; $template_name = mb_substr($rel_path, 0, $p); $file_name = mb_substr($rel_path, $p + 1); $p = mb_strpos($file_name, "/"); if($p>0) $module_name = mb_substr($file_name, 0, $p); break; } } if($templ_path == "") { if(strpos($filepath, $module_path) !== false) { $templ_pos = mb_strlen($filepath) - mb_strpos(strrev($filepath), strrev($module_path)); $rel_path = mb_substr($filepath, $templ_pos); $p = mb_strpos($rel_path, "/"); if(!$p) return null; $module_name = mb_substr($rel_path, 0, $p); if(defined("SITE_TEMPLATE_ID")) $template_name = SITE_TEMPLATE_ID; else $template_name = ".default"; $file_name = mb_substr($rel_path, $p + mb_strlen("/install/templates/")); } else { return false; } } $BX_DOC_ROOT = rtrim(preg_replace("'[\\\\/]+'", "/", $_SERVER["DOCUMENT_ROOT"]), "/ "); $module_path = $BX_DOC_ROOT.$module_path; if($lang === false) { $lang = LANGUAGE_ID; } $subst_lang = LangSubst($lang); if((mb_substr($file_name, -16) == ".description.php") && $module_name!="") { if ($subst_lang <> $lang) { $fname = $module_path.$module_name."/install/templates/lang/".$subst_lang."/".$file_name; $fname = Main\Localization\Translation::convertLangPath($fname, $subst_lang); if (file_exists($fname)) { __IncludeLang($fname, false, true); } } $fname = $module_path.$module_name."/install/templates/lang/".$lang."/".$file_name; $fname = Main\Localization\Translation::convertLangPath($fname, $lang); if (file_exists($fname)) { __IncludeLang($fname, false, true); } } $checkModule = true; if ($templ_path <> "") { $templ_path = $BX_DOC_ROOT.$templ_path; $checkDefault = true; // default if ($subst_lang <> $lang) { $fname = $templ_path.$template_name."/lang/".$subst_lang."/".$file_name; $fname = Main\Localization\Translation::convertLangPath($fname, $subst_lang); if (file_exists($fname)) { __IncludeLang($fname, false, true); $checkDefault = $checkModule = false; } } // required lang $fname = $templ_path.$template_name."/lang/".$lang."/".$file_name; $fname = Main\Localization\Translation::convertLangPath($fname, $lang); if (file_exists($fname)) { __IncludeLang($fname, false, true); $checkDefault = $checkModule = false; } // template .default if ($checkDefault && $template_name != ".default") { if ($subst_lang <> $lang) { $fname = $templ_path.".default/lang/".$subst_lang."/".$file_name; $fname = Main\Localization\Translation::convertLangPath($fname, $subst_lang); if (file_exists($fname)) { __IncludeLang($fname, false, true); $checkModule = false; } } $fname = $templ_path.".default/lang/".$lang."/".$file_name; $fname = Main\Localization\Translation::convertLangPath($fname, $lang); if (file_exists($fname)) { __IncludeLang($fname, false, true); $checkModule = false; } } } if ($checkModule && $module_name != "") { if ($subst_lang <> $lang) { $fname = $module_path.$module_name."/install/templates/lang/".$subst_lang."/".$file_name; $fname = Main\Localization\Translation::convertLangPath($fname, $subst_lang); if (file_exists($fname)) { __IncludeLang($fname, false, true); } } $fname = $module_path.$module_name."/install/templates/lang/".$lang."/".$file_name; $fname = Main\Localization\Translation::convertLangPath($fname, $lang); if(file_exists($fname)) { __IncludeLang($fname, false, true); } } return null; } function IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false) { if($lang === false && $bReturnArray === false) { Main\Localization\Loc::loadMessages($filepath); return true; } $filepath = rtrim(preg_replace("'[\\\\/]+'", "/", $filepath), "/ "); $module_path = "/modules/"; if(strpos($filepath, $module_path) !== false) { $pos = mb_strlen($filepath) - mb_strpos(strrev($filepath), strrev($module_path)); $rel_path = mb_substr($filepath, $pos); $p = mb_strpos($rel_path, "/"); if(!$p) return false; $module_name = mb_substr($rel_path, 0, $p); $rel_path = mb_substr($rel_path, $p + 1); $BX_DOC_ROOT = rtrim(preg_replace("'[\\\\/]+'", "/", $_SERVER["DOCUMENT_ROOT"]), "/ "); $module_path = $BX_DOC_ROOT.getLocalPath($module_path.$module_name); } elseif(strpos($filepath, "/.last_version/") !== false) { $pos = mb_strlen($filepath) - mb_strpos(strrev($filepath), strrev("/.last_version/")); $rel_path = mb_substr($filepath, $pos); $module_path = mb_substr($filepath, 0, $pos - 1); } else { return false; } if($lang === false) { $lang = (defined('LANGUAGE_ID') ? LANGUAGE_ID : 'en'); } $lang_subst = LangSubst($lang); $arMess = array(); if ($lang_subst <> $lang) { $fname = $module_path."/lang/".$lang_subst."/".$rel_path; $fname = Main\Localization\Translation::convertLangPath($fname, $lang_subst); if (file_exists($fname)) { $arMess = __IncludeLang($fname, $bReturnArray, true); } } $fname = $module_path."/lang/".$lang."/".$rel_path; $fname = Main\Localization\Translation::convertLangPath($fname, $lang); if (file_exists($fname)) { $msg = __IncludeLang($fname, $bReturnArray, true); if(is_array($msg)) { $arMess = array_merge($arMess, $msg); } } if($bReturnArray) { return $arMess; } return true; } /** * @deprecated Use Main\Localization\Loc */ function LangSubst($lang) { return Main\Localization\Loc::getDefaultLang($lang); } /********************************************************************* Debugging *********************************************************************/ function mydump($thing, $maxdepth=-1, $depth=0) { $res=""; $fmt = sprintf ("%%%ds", 4*$depth); $pfx = sprintf ($fmt, ""); $type = gettype($thing); if($type == 'array') { $n = sizeof($thing); $res.="$pfx array($n) => \n"; foreach(array_keys($thing) as $key) { $res.=" $pfx"."[".$key."] =>\n"; $res.=mydump($thing[$key], $maxdepth, $depth+1); } } elseif($type == 'string') { $n = mb_strlen($thing); $res.="$pfx string($n) =>\n"; $res.="$pfx\"".$thing."\"\n"; } elseif($type == 'object') { $name = get_class($thing); $res.="$pfx object($name) =>\n"; $methodArray = get_class_methods($name); foreach (array_keys($methodArray) as $m) $res.=" $pfx method($m) => $methodArray"."[".$m."]\n"; $classVars = get_class_vars($name); foreach(array_keys($classVars) as $v) { $res.=" $pfx default => $v =>\n"; $res.=mydump($classVars[$v], $maxdepth, $depth+2); } $objectVars = get_object_vars($thing); foreach (array_keys($objectVars) as $v) { $res.=" $pfx $v =>\n"; $res.=mydump($objectVars[$v], $maxdepth, $depth+2); } } elseif ($type == 'boolean') { if($thing) $res.="$pfx boolean(true)\n"; else $res.="$pfx boolean(false)\n"; } else $res.="$pfx $type(".$thing.")\n"; return $res; } function SendError($error) { if(defined('ERROR_EMAIL') && ERROR_EMAIL <> '') { $from = (defined('ERROR_EMAIL_FROM') && ERROR_EMAIL_FROM <> ''? ERROR_EMAIL_FROM : 'error@bitrix.ru'); $reply_to = (defined('ERROR_EMAIL_REPLY_TO') && ERROR_EMAIL_REPLY_TO <> ''? ERROR_EMAIL_REPLY_TO : 'admin@bitrix.ru'); bxmail(ERROR_EMAIL, $_SERVER['HTTP_HOST'].": Error!", $error. "HTTP_GET_VARS:\n".mydump($_GET)."\n\n". "HTTP_POST_VARS:\n".mydump($_POST)."\n\n". "HTTP_COOKIE_VARS:\n".mydump($_COOKIE)."\n\n". "HTTP_SERVER_VARS:\n".mydump($_SERVER)."\n\n", "From: ".$from."\r\n". "Reply-To: ".$reply_to."\r\n". "X-Mailer: PHP/" . phpversion() ); } } function AddMessage2Log($text, $module = '', $traceDepth = 6, $showArgs = false) { if (defined('LOG_FILENAME') && LOG_FILENAME <> '') { $logger = Diag\Logger::create('main.Default', [LOG_FILENAME, $showArgs]); if ($logger === null) { $logger = new Diag\FileLogger(LOG_FILENAME, 0); $formatter = new Diag\LogFormatter($showArgs); $logger->setFormatter($formatter); } $trace = ''; if ($traceDepth > 0) { $trace = Main\Diag\Helper::getBackTrace($traceDepth, ($showArgs ? null : DEBUG_BACKTRACE_IGNORE_ARGS), 2); } $context = [ 'module' => $module, 'message' => $text, 'trace' => $trace, ]; $message = "Host: {host}\n" . "Date: {date}\n" . ($module != '' ? "Module: {module}\n" : '') . "{message}\n" . "{trace}" . "{delimiter}\n" ; $logger->debug($message, $context); } } function AddEventToStatFile($module, $action, $tag, $label, $action_type = '', $user_id = null) { global $USER; static $search = array("\t", "\n", "\r"); static $replace = " "; if (defined('ANALYTICS_FILENAME') && is_writable(ANALYTICS_FILENAME)) { if ($user_id === null && is_object($USER) && !defined("BX_CHECK_AGENT_START")) { $user_id = $USER->GetID(); } $content = date('Y-m-d H:i:s') ."\t".str_replace($search, $replace, $_SERVER["HTTP_HOST"]) ."\t".str_replace($search, $replace, $module) ."\t".str_replace($search, $replace, $action) ."\t".str_replace($search, $replace, $tag) ."\t".str_replace($search, $replace, $label) ."\t".str_replace($search, $replace, $action_type) ."\t".intval($user_id) ."\n"; $fp = @fopen(ANALYTICS_FILENAME, "ab"); if ($fp) { if (flock($fp, LOCK_EX)) { @fwrite($fp, $content); @fflush($fp); @flock($fp, LOCK_UN); @fclose($fp); } } } } /** * @deprecated Will be removed soon * @return void */ function UnQuoteAll() { } /********************************************************************* Other functions *********************************************************************/ function LocalRedirect($url, $skip_security_check=false, $status="302 Found") { $redirectResponse = Context::getCurrent()->getResponse()->redirectTo($url); $redirectResponse ->setSkipSecurity($skip_security_check) ->setStatus($status) ; Application::getInstance()->end(0, $redirectResponse); } function WriteFinalMessage($message = "") { echo $message; exit; } function FindUserID($tag_name, $tag_value, $user_name="", $form_name = "form1", $tag_size = "3", $tag_maxlength="", $button_value = "...", $tag_class="typeinput", $button_class="tablebodybutton", $search_page="/bitrix/admin/user_search.php") { /** @global CMain $APPLICATION */ global $APPLICATION; $selfFolderUrl = (defined("SELF_FOLDER_URL") ? SELF_FOLDER_URL : "/bitrix/admin/"); $search_page = str_replace("/bitrix/admin/", $selfFolderUrl, $search_page); $tag_name_x = preg_replace("/([^a-z0-9]|\\[|\\])/is", "x", $tag_name); if($APPLICATION->GetGroupRight("main") >= "R") { $strReturn = " <input type=\"text\" name=\"".$tag_name."\" id=\"".$tag_name."\" value=\"".htmlspecialcharsbx($tag_value)."\" size=\"".$tag_size."\" maxlength=\"".$tag_maxlength."\" class=\"".$tag_class."\"> <iframe style=\"width:0px; height:0px; border:0px\" src=\"javascript:''\" name=\"hiddenframe".$tag_name."\" id=\"hiddenframe".$tag_name."\"></iframe> <input class=\"".$button_class."\" type=\"button\" name=\"FindUser\" id=\"FindUser\" OnClick=\"window.open('".$search_page."?lang=".LANGUAGE_ID."&FN=".$form_name."&FC=".$tag_name."', '', 'scrollbars=yes,resizable=yes,width=760,height=500,top='+Math.floor((screen.height - 560)/2-14)+',left='+Math.floor((screen.width - 760)/2-5));\" value=\"".$button_value."\"> <span id=\"div_".$tag_name."\" class=\"adm-filter-text-search\">".$user_name."</span> <script type=\"text/javascript\"> "; if($user_name=="") $strReturn.= "var tv".$tag_name_x."='';\n"; else $strReturn.= "var tv".$tag_name_x."='".CUtil::JSEscape($tag_value)."';\n"; $strReturn.= " function Ch".$tag_name_x."() { var DV_".$tag_name_x."; DV_".$tag_name_x." = BX(\"div_".$tag_name."\"); if (!!DV_".$tag_name_x.") { if (tv".$tag_name_x."!=document.".$form_name."['".$tag_name."'].value) { tv".$tag_name_x."=document.".$form_name."['".$tag_name."'].value; if (tv".$tag_name_x."!='') { DV_".$tag_name_x.".innerHTML = '<i>".GetMessage("MAIN_WAIT")."</i>'; BX(\"hiddenframe".$tag_name."\").src='get_user.php?ID=' + tv".$tag_name_x."+'&strName=".$tag_name."&lang=".LANG.(defined("ADMIN_SECTION") && ADMIN_SECTION===true?"&admin_section=Y":"")."'; } else { DV_".$tag_name_x.".innerHTML = ''; } } } setTimeout(function(){Ch".$tag_name_x."()},1000); } BX.ready(function(){ //js error during admin filter initialization, IE9, http://msdn.microsoft.com/en-us/library/gg622929%28v=VS.85%29.aspx?ppud=4, mantis: 33208 if(BX.browser.IsIE) { setTimeout(function(){Ch".$tag_name_x."()},3000); } else Ch".$tag_name_x."(); }); //--> </script> "; } else { $strReturn = " <input type=\"text\" name=\"$tag_name\" id=\"$tag_name\" value=\"".htmlspecialcharsbx($tag_value)."\" size=\"$tag_size\" maxlength=\"strMaxLenght\"> <input type=\"button\" name=\"FindUser\" id=\"FindUser\" OnClick=\"window.open('".$search_page."?lang=".LANGUAGE_ID."&FN=$form_name&FC=$tag_name', '', 'scrollbars=yes,resizable=yes,width=760,height=560,top='+Math.floor((screen.height - 560)/2-14)+',left='+Math.floor((screen.width - 760)/2-5));\" value=\"$button_value\"> $user_name "; } return $strReturn; } function GetWhoisLink($ip, $class='') { $URL = COption::GetOptionString('main', 'whois_service_url', 'http://whois.domaintools.com/#IP#'); $URL = str_replace("#IP#", urlencode($ip), $URL); return '<a href="'.$URL.'"'.($class <> ''? ' class="'.$class.'"':'').' target="_blank" title="'.GetMessage("WHOIS_SERVICE").'">'.htmlspecialcharsbx($ip).'</a>'; } function IsIE() { global $HTTP_USER_AGENT; if( mb_strpos($HTTP_USER_AGENT, "Opera") == false && preg_match('#(MSIE|Internet Explorer) ([0-9]+)\\.([0-9]+)#', $HTTP_USER_AGENT, $version) ) { if(intval($version[2]) > 0) return doubleval($version[2].".".$version[3]); else return false; } else { return false; } } function GetCountryByID($id, $lang=LANGUAGE_ID) { $msg = IncludeModuleLangFile(__FILE__, $lang, true); return $msg["COUNTRY_".$id] ?? ''; } function GetCountryArray($lang=LANGUAGE_ID) { $arMsg = IncludeModuleLangFile(__FILE__, $lang, true); $arr = array(); if (is_array($arMsg)) { foreach($arMsg as $id=>$country) if(mb_strpos($id, "COUNTRY_") === 0) $arr[intval(mb_substr($id, 8))] = $country; } asort($arr); $arCountry = array("reference_id"=>array_keys($arr), "reference"=>array_values($arr)); return $arCountry; } function GetCountries($lang = LANGUAGE_ID) { static $countries = null; if (isset($countries[$lang])) { return $countries[$lang]; } include __DIR__ . '/countries.php'; $msg = IncludeModuleLangFile(__FILE__, $lang, true); $countries[$lang] = []; /** @var array $arCounries */ foreach ($arCounries as $country => $countryId) { $countries[$lang][$country] = [ 'ID' => $countryId, 'CODE' => $country, 'NAME' => $msg['COUNTRY_' . $countryId] ]; } return $countries[$lang]; } function GetCountryIdByCode($code) { $code = strtoupper($code); $countries = GetCountries(); return $countries[$code]['ID'] ?? false; } function GetCountryCodeById($countryId) { $countryId = (int)$countryId; static $countryCodes = null; if ($countryCodes === null) { include __DIR__ . '/countries.php'; /** @var array $arCounries */ $countryCodes = array_flip($arCounries); } return $countryCodes[$countryId] ?? ''; } function minimumPHPVersion($vercheck) { $minver = explode(".", $vercheck); $curver = explode(".", phpversion()); if ((intval($curver[0]) < intval($minver[0])) || ((intval($curver[0]) == intval($minver[0])) && (intval($curver[1]) < intval($minver[1]))) || ((intval($curver[0]) == intval($minver[0])) && (intval($curver[1]) == intval($minver[1])) && (intval($curver[2]) < intval($minver[2])))) return false; else return true; } function FormDecode() { $superglobals = array( '_GET'=>1, '_SESSION'=>1, '_POST'=>1, '_COOKIE'=>1, '_REQUEST'=>1, '_FILES'=>1, '_SERVER'=>1, 'GLOBALS'=>1, '_ENV'=>1, 'DBType'=>1, 'DBDebug'=>1, 'DBDebugToFile'=>1, 'DBHost'=>1, 'DBName'=>1, 'DBLogin'=>1, 'DBPassword'=>1, 'HTTP_ENV_VARS'=>1, 'HTTP_GET_VARS'=>1, 'HTTP_POST_VARS'=>1, 'HTTP_POST_FILES'=>1, 'HTTP_COOKIE_VARS'=>1, 'HTTP_SERVER_VARS'=>1, ); foreach($superglobals as $gl=>$t) { unset($_REQUEST[$gl]); unset($_GET[$gl]); unset($_POST[$gl]); unset($_COOKIE[$gl]); } $register_globals = ini_get_bool("register_globals"); if (!$register_globals) { $toGlobals = array(); foreach($_ENV as $key => $val) if(!isset($superglobals[$key])) $toGlobals[$key] = $val; foreach($_GET as $key => $val) if(!isset($superglobals[$key])) $toGlobals[$key] = $val; foreach($_POST as $key => $val) if(!isset($superglobals[$key])) $toGlobals[$key] = $val; foreach($_COOKIE as $key => $val) if(!isset($superglobals[$key])) $toGlobals[$key] = $val; foreach($_SERVER as $key => $val) if(!isset($superglobals[$key])) $toGlobals[$key] = $val; foreach($toGlobals as $key => $val) { if(!isset($GLOBALS[$key])) { $GLOBALS[$key] = $val; } } } } /** * @deprecated Use Bitrix\Main\Web\HttpClient */ function QueryGetData($SITE, $PORT, $PATH, $QUERY_STR, &$errno, &$errstr, $sMethod="GET", $sProto="", $sContentType = 'N') { $ob = new CHTTP(); $ob->Query( $sMethod, $SITE, $PORT, $PATH . ($sMethod == 'GET' ? ((strpos($PATH, '?') === false ? '?' : '&') . $QUERY_STR) : ''), $sMethod == 'POST' ? $QUERY_STR : false, $sProto, $sContentType ); $errno = $ob->errno; $errstr = $ob->errstr; return $ob->result; } function xmlize_xmldata($data) { $data = trim($data); $vals = $index = $array = array(); $parser = xml_parser_create("ISO-8859-1"); xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); xml_parse_into_struct($parser, $data, $vals, $index); xml_parser_free($parser); $i = 0; $tagname = $vals[$i]['tag']; if (isset($vals[$i]['attributes'])) { $array[$tagname]['@'] = $vals[$i]['attributes']; } else { $array[$tagname]['@'] = array(); } $array[$tagname]["#"] = xml_depth_xmldata($vals, $i); return $array; } function xml_depth_xmldata($vals, &$i) { $children = array(); if (isset($vals[$i]['value'])) { array_push($children, $vals[$i]['value']); } while (++$i < count($vals)) { switch ($vals[$i]['type']) { case 'open': $tagname = $vals[$i]['tag'] ?? ''; if (isset($children[$tagname])) { $size = sizeof($children[$tagname]); } else { $size = 0; } if (isset($vals[$i]['attributes'])) { $children[$tagname][$size]['@'] = $vals[$i]["attributes"]; } $children[$tagname][$size]['#'] = xml_depth_xmldata($vals, $i); break; case 'cdata': array_push($children, $vals[$i]['value']); break; case 'complete': $tagname = $vals[$i]['tag']; if(isset($children[$tagname])) { $size = sizeof($children[$tagname]); } else { $size = 0; } if(isset($vals[$i]['value'])) { $children[$tagname][$size]["#"] = $vals[$i]['value']; } else { $children[$tagname][$size]["#"] = ''; } if (isset($vals[$i]['attributes'])) { $children[$tagname][$size]['@'] = $vals[$i]['attributes']; } break; case 'close': return $children; break; } } return $children; } function Help($module="", $anchor="", $help_file="") { /** @global CMain $APPLICATION */ global $APPLICATION, $IS_HELP; if ($help_file == '') $help_file = basename($APPLICATION->GetCurPage()); if ($anchor <> '') $anchor = "#".$anchor; if($IS_HELP!==true) { $height = "500"; //$width = "545"; $width = "780"; echo "<script type=\"text/javascript\"> <!-- function Help(file, module, anchor) { window.open('".BX_ROOT."/tools/help_view.php?local=Y&file='+file+'&module='+module+'&lang=".LANGUAGE_ID."'+anchor, '','scrollbars=yes,resizable=yes,width=".$width.",height=".$height.",top='+Math.floor((screen.height - ".$height.")/2-14)+',left='+Math.floor((screen.width - ".$width.")/2-5)); } //--> </script>"; $IS_HELP=true; } echo "<a href=\"javascript:Help('".urlencode($help_file)."','".$module."','".$anchor."')\" title='".GetMessage("TOOLS_HELP")."'><img src='".BX_ROOT."/images/main/show_help.gif' width='16' height='16' border='0' alt='".GetMessage("TOOLS_HELP")."' align='absbottom' vspace='2' hspace='1'></a>"; } function InitBVar(&$var) { $var = ($var=="Y") ? "Y" : "N"; } function init_get_params($url) { InitURLParam($url); } function InitURLParam($url=false) { if ($url===false) $url = $_SERVER["REQUEST_URI"]; $start = mb_strpos($url, "?"); if ($start!==false) { $end = mb_strpos($url, "#"); $length = ($end > 0)? $end - $start - 1 : mb_strlen($url); $params = mb_substr($url, $start + 1, $length); parse_str($params, $_GET); parse_str($params, $arr); $_REQUEST += $arr; foreach ($arr as $key => $val) { if (!isset($GLOBALS[$key])) { $GLOBALS[$key] = $val; } } } } function _ShowHtmlspec($str) { $str = str_replace(["<br>", "<br />", "<BR>", "<BR />"], "\n", $str); $str = htmlspecialcharsbx($str, ENT_COMPAT, false); $str = nl2br($str); return $str; } function ShowNote($strNote, $cls="notetext") { /** @global CMain $APPLICATION */ global $APPLICATION; if($strNote <> "") { $APPLICATION->IncludeComponent( "bitrix:system.show_message", ".default", Array( "MESSAGE"=> $strNote, "STYLE" => $cls, ), null, array( "HIDE_ICONS" => "Y" ) ); } } function ShowError($strError, $cls="errortext") { /** @global CMain $APPLICATION */ global $APPLICATION; if($strError <> "") { $APPLICATION->IncludeComponent( "bitrix:system.show_message", ".default", Array( "MESSAGE"=> $strError, "STYLE" => $cls, ), null, array( "HIDE_ICONS" => "Y" ) ); } } function ShowMessage($arMess) { /** @global CMain $APPLICATION */ global $APPLICATION; if(!is_array($arMess)) $arMess=Array("MESSAGE" => $arMess, "TYPE" => "ERROR"); if(!empty($arMess["MESSAGE"])) { $APPLICATION->IncludeComponent( "bitrix:system.show_message", ".default", Array( "MESSAGE"=> $arMess["MESSAGE"], "STYLE" => ($arMess["TYPE"]=="OK"?"notetext":"errortext"), ), null, array( "HIDE_ICONS" => "Y" ) ); } } function DeleteParam($ParamNames) { if (empty($_GET)) { return ''; } $aParams = $_GET; foreach(array_keys($aParams) as $key) { foreach($ParamNames as $param) { if(strcasecmp($param, $key) == 0) { unset($aParams[$key]); break; } } } return http_build_query($aParams, "", "&"); } function check_email($email, $strict = false, $domainCheck = false) { if(!$strict) { $email = trim($email); if(preg_match("#.*?[<\\[\\(](.*?)[>\\]\\)].*#i", $email, $arr) && $arr[1] <> '') { $email = $arr[1]; } } //http://tools.ietf.org/html/rfc2821#section-4.5.3.1 //4.5.3.1. Size limits and minimums if(mb_strlen($email) > 320) { return false; } //convert to UTF to use extended regular expressions $encodedEmail = $email; static $encoding = null; if ($encoding === null) { if (($context = Context::getCurrent()) && ($culture = $context->getCulture())) { $encoding = strtolower($culture->getCharset()); } } if ($encoding !== null && $encoding != "utf-8") { $encodedEmail = Text\Encoding::convertEncoding($email, $encoding, "UTF-8"); } //http://tools.ietf.org/html/rfc2822#section-3.2.4 //3.2.4. Atom //added \p{L} for international symbols static $atom = "\\p{L}=_0-9a-z+~'!\$&*^`|\\#%/?{}-"; static $domain = "\\p{L}a-z0-9-"; //"." can't be in the beginning or in the end of local-part //dot-atom-text = 1*atext *("." 1*atext) if(preg_match("#^[{$atom}]+(\\.[{$atom}]+)*@(([{$domain}]+\\.)+)([{$domain}]{2,20})$#ui", $encodedEmail)) { if ($domainCheck) { $email = Main\Mail\Mail::toPunycode($email); $parts = explode('@', $email); $host = $parts[1] . '.'; return (checkdnsrr($host, 'MX') || checkdnsrr($host, 'A')); } return true; } return false; } function initvar($varname, $value='') { global $$varname; if(!isset($$varname)) $$varname=$value; } function ClearVars($prefix="str_") { $n = mb_strlen($prefix); foreach($GLOBALS as $key=>$val) if(strncmp($key, $prefix, $n) == 0) unset($GLOBALS[$key]); } function roundEx($value, $prec=0) { $eps = 1.00/pow(10, $prec+4); return round(doubleval($value)+$eps, $prec); } function roundDB($value, $len=18, $dec=4) { if($value>=0) $value = "0".$value; $value = roundEx(DoubleVal($value), $len); $value = sprintf("%01.".$dec."f", $value); if($len>0 && mb_strlen($value) > $len - $dec) $value = trim(mb_substr($value, 0, $len - $dec), "."); return $value; } function bitrix_sessid() { $kernelSession = Application::getInstance()->getKernelSession(); if (!$kernelSession->has('fixed_session_id')) { bitrix_sessid_set(); } return $kernelSession->get('fixed_session_id'); } function bitrix_sessid_set($val=false) { if($val === false) $val = bitrix_sessid_val(); Application::getInstance()->getKernelSession()->set("fixed_session_id", $val); } function bitrix_sessid_val() { return md5(CMain::GetServerUniqID().Application::getInstance()->getKernelSession()->getId()); } function bitrix_sess_sign() { return md5("nobody".CMain::GetServerUniqID()."nowhere"); } function check_bitrix_sessid($varname='sessid') { $request = Main\Context::getCurrent()->getRequest(); return ( $request[$varname] === bitrix_sessid() || $request->getHeader('X-Bitrix-Csrf-Token') === bitrix_sessid() ); } function bitrix_sessid_get($varname='sessid') { return $varname."=".bitrix_sessid(); } function bitrix_sessid_post($varname='sessid', $returnInvocations=false) { static $invocations = 0; if ($returnInvocations) { return $invocations; } $id = $invocations ? $varname.'_'.$invocations : $varname; $invocations++; return '<input type="hidden" name="'.$varname.'" id="'.$id.'" value="'.bitrix_sessid().'" />'; } function print_url($strUrl, $strText, $sParams="") { return ($strUrl == ''? $strText : "<a href=\"".$strUrl."\" ".$sParams.">".$strText."</a>"); } function IncludeAJAX() { /** @global CMain $APPLICATION */ global $APPLICATION; $APPLICATION->AddHeadString('<script type="text/javascript">var ajaxMessages = {wait:"'.CUtil::JSEscape(GetMessage('AJAX_WAIT')).'"}</script>', true); $APPLICATION->AddHeadScript('/bitrix/js/main/cphttprequest.js', true); } function GetMenuTypes($site=false, $default_value=false) { if($default_value === false) $default_value = "left=".GetMessage("main_tools_menu_left").",top=".GetMessage("main_tools_menu_top"); $mt = COption::GetOptionString("fileman", "menutypes", $default_value, $site); if (!$mt) return Array(); $armt_ = unserialize(stripslashes($mt), ['allowed_classes' => false]); $armt = Array(); if (is_array($armt_)) { foreach($armt_ as $key => $title) { $key = trim($key); if ($key == '') continue; $armt[$key] = trim($title); } return $armt; } $armt_ = explode(",", $mt); for ($i = 0, $c = count($armt_); $i < $c; $i++) { $pos = mb_strpos($armt_[$i], '='); if ($pos === false) continue; $key = trim(mb_substr($armt_[$i], 0, $pos)); if ($key == '') continue; $armt[$key] = trim(mb_substr($armt_[$i], $pos + 1)); } return $armt; } function SetMenuTypes($armt, $site = '', $description = false) { return COption::SetOptionString('fileman', "menutypes", addslashes(serialize($armt)), $description, $site); } function ParseFileContent($filesrc, $params = array()) { ///////////////////////////////////// // Parse prolog, epilog, title ///////////////////////////////////// $filesrc = trim($filesrc); $prolog = $epilog = ''; $php_doubleq = false; $php_singleq = false; $php_comment = false; $php_star_comment = false; $php_line_comment = false; $php_st = "<"."?"; $php_ed = "?".">"; if(!empty($params["use_php_parser"]) && mb_substr($filesrc, 0, 2) == $php_st) { $phpChunks = PHPParser::getPhpChunks($filesrc); if (!empty($phpChunks)) { $prolog = $phpChunks[0]; $filesrc = mb_substr($filesrc, mb_strlen($prolog)); } } elseif(mb_substr($filesrc, 0, 2) == $php_st) { $fl = mb_strlen($filesrc); $p = 2; while($p < $fl) { $ch2 = mb_substr($filesrc, $p, 2); $ch1 = mb_substr($ch2, 0, 1); if($ch2==$php_ed && !$php_doubleq && !$php_singleq && !$php_star_comment) { $p+=2; break; } elseif(!$php_comment && $ch2=="//" && !$php_doubleq && !$php_singleq) { $php_comment = $php_line_comment = true; $p++; } elseif($php_line_comment && ($ch1=="\n" || $ch1=="\r" || $ch2=="?>")) { $php_comment = $php_line_comment = false; } elseif(!$php_comment && $ch2=="/*" && !$php_doubleq && !$php_singleq) { $php_comment = $php_star_comment = true; $p++; } elseif($php_star_comment && $ch2=="*/") { $php_comment = $php_star_comment = false; $p++; } elseif(!$php_comment) { if(($php_doubleq || $php_singleq) && $ch2=="\\\\") { $p++; } elseif(!$php_doubleq && $ch1=='"') { $php_doubleq=true; } elseif($php_doubleq && $ch1=='"' && mb_substr($filesrc, $p - 1, 1) != '\\') { $php_doubleq=false; } elseif(!$php_doubleq) { if(!$php_singleq && $ch1=="'") { $php_singleq=true; } elseif($php_singleq && $ch1=="'" && mb_substr($filesrc, $p - 1, 1) != '\\') { $php_singleq=false; } } } $p++; } $prolog = mb_substr($filesrc, 0, $p); $filesrc = mb_substr($filesrc, $p); } elseif(preg_match("'(.*?<title>.*?</title>)(.*)$'is", $filesrc, $reg)) { $prolog = $reg[1]; $filesrc= $reg[2]; } $title = PHPParser::getPageTitle($filesrc, $prolog); $arPageProps = array(); if($prolog <> '') { if(preg_match_all("'\\\$APPLICATION->SetPageProperty\\(([\"\\'])(.*?)(?<!\\\\)[\"\\'] *, *([\"\\'])(.*?)(?<!\\\\)[\"\\']\\);'i", $prolog, $out)) { foreach($out[2] as $i => $m1) { $arPageProps[UnEscapePHPString($m1, $out[1][$i])] = UnEscapePHPString($out[4][$i], $out[3][$i]); } } } if(mb_substr($filesrc, -2) == "?".">") { if (isset($phpChunks) && count($phpChunks) > 1) { $epilog = $phpChunks[count($phpChunks)-1]; $filesrc = mb_substr($filesrc, 0, -mb_strlen($epilog)); } else { $p = mb_strlen($filesrc) - 2; $php_start = "<"."?"; while(($p > 0) && (mb_substr($filesrc, $p, 2) != $php_start)) $p--; $epilog = mb_substr($filesrc, $p); $filesrc = mb_substr($filesrc, 0, $p); } } return array( "PROLOG" => $prolog, "TITLE" => $title, "PROPERTIES" => $arPageProps, "CONTENT" => $filesrc, "EPILOG" => $epilog, ); } function EscapePHPString($str, $encloser = '"') { if($encloser == "'") { $from = array("\\", "'"); $to = array("\\\\", "\\'"); } else { $from = array("\\", "\$", "\""); $to = array("\\\\", "\\\$", "\\\""); } return str_replace($from, $to, $str); } function UnEscapePHPString($str, $encloser = '"') { if($encloser == "'") { $from = array("\\\\", "\\'"); $to = array("\\", "'"); } else { $from = array("\\\\", "\\\$", "\\\""); $to = array("\\", "\$", "\""); } return str_replace($from, $to, $str); } function CheckSerializedData($str, $max_depth = 200) { if(preg_match('/(^|;)[OC]\\:\\+{0,1}\\d+:/', $str)) // serialized objects { return false; } return true; } function NormalizePhone($number, $minLength = 10) { $minLength = intval($minLength); if ($minLength <= 0 || mb_strlen($number) < $minLength) { return false; } if (mb_strlen($number) >= 10 && mb_substr($number, 0, 2) === '+8') { $number = '00'.mb_substr($number, 1); } $number = preg_replace("/[^0-9\#\*,;]/i", "", $number); if (mb_strlen($number) >= 10) { if (mb_substr($number, 0, 2) == '80' || mb_substr($number, 0, 2) == '81' || mb_substr($number, 0, 2) == '82') { } else if (mb_substr($number, 0, 2) == '00') { $number = mb_substr($number, 2); } else if (mb_substr($number, 0, 3) == '011') { $number = mb_substr($number, 3); } else if (mb_substr($number, 0, 1) == '8') { $number = '7'.mb_substr($number, 1); } else if (mb_substr($number, 0, 1) == '0') { $number = mb_substr($number, 1); } } return $number; } function bxmail($to, $subject, $message, $additional_headers="", $additional_parameters="", Main\Mail\Context $context = null) { if (empty($context)) { $context = new Main\Mail\Context(); } $event = new Main\Event( 'main', 'OnBeforePhpMail', array( 'arguments' => (object) array( 'to' => &$to, 'subject' => &$subject, 'message' => &$message, 'additional_headers' => &$additional_headers, 'additional_parameters' => &$additional_parameters, 'context' => &$context, ), ) ); $event->send(); $defaultMailConfiguration = Configuration::getValue("smtp"); $smtpEnabled = is_array($defaultMailConfiguration) && isset($defaultMailConfiguration['enabled']) && $defaultMailConfiguration['enabled'] === true ; if ( $smtpEnabled && ( $context->getSmtp() !== null || (!empty($defaultMailConfiguration['host']) && !empty($defaultMailConfiguration['login'])) ) ) { $mailer = Main\Mail\Smtp\Mailer::getInstance($context); return $mailer->sendMailBySmtp($to, $subject, $message, $additional_headers, $additional_parameters); } //message must not contain any null bytes $message = str_replace("\0", ' ', $message); if(function_exists("custom_mail")) { return custom_mail($to, $subject, $message, $additional_headers, $additional_parameters, $context); } if($additional_parameters!="") { return @mail($to, $subject, $message, $additional_headers, $additional_parameters); } return @mail($to, $subject, $message, $additional_headers); } /** * @deprecated Use \Bitrix\Main\Application::resetAccelerator(). */ function bx_accelerator_reset() { Application::resetAccelerator(); } /** * @deprecated Use Main\Config\Ini::getBool(). */ function ini_get_bool($param) { return Main\Config\Ini::getBool((string)$param); } /** * Sorting array by column. * You can use short mode: Collection::sortByColumn($arr, 'value'); This is equal Collection::sortByColumn($arr, array('value' => SORT_ASC)) * * Pay attention: if two members compare as equal, their relative order in the sorted array is undefined. The sorting is not stable. * * More example: * Collection::sortByColumn($arr, array('value' => array(SORT_NUMERIC, SORT_ASC), 'attr' => SORT_DESC), array('attr' => 'strlen'), 'www'); * * @param array $array * @param string|array $columns * @param string|array $callbacks * @param bool $preserveKeys If false numeric keys will be re-indexed. If true - preserve. * @param null $defaultValueIfNotSetValue If value not set - use $defaultValueIfNotSetValue (any cols) */ function sortByColumn(array &$array, $columns, $callbacks = '', $defaultValueIfNotSetValue = null, $preserveKeys = false) { Main\Type\Collection::sortByColumn($array, $columns, $callbacks, $defaultValueIfNotSetValue, $preserveKeys); } function getLocalPath($path, $baseFolder = "/bitrix") { $root = rtrim($_SERVER["DOCUMENT_ROOT"], "\\/"); static $hasLocalDir = null; if($hasLocalDir === null) { $hasLocalDir = is_dir($root."/local"); } if($hasLocalDir && file_exists($root."/local/".$path)) { return "/local/".$path; } elseif(file_exists($root.$baseFolder."/".$path)) { return $baseFolder."/".$path; } // cli repository mode if (empty($_SERVER["DOCUMENT_ROOT"]) || defined('REPOSITORY_ROOT')) { $root = realpath(__DIR__ . '/../../'); $localPath = $root . '/' . $path; if (file_exists($localPath)) { return $localPath; } } return false; } /** * Set session expired, e.g. if you want to destroy session after this hit * @param bool $pIsExpired */ function setSessionExpired($pIsExpired = true) { Application::getInstance()->getKernelSession()->set("IS_EXPIRED", $pIsExpired); } /** * @return bool */ function isSessionExpired() { return Application::getInstance()->getKernelSession()->get("IS_EXPIRED") === true; } $SHOWIMAGEFIRST = false; function ShowImage($PICTURE_ID, $iMaxW=0, $iMaxH=0, $sParams=false, $strImageUrl="", $bPopup=false, $strPopupTitle=false,$iSizeWHTTP=0, $iSizeHHTTP=0) { return CFile::ShowImage($PICTURE_ID, $iMaxW, $iMaxH, $sParams, $strImageUrl, $bPopup, $strPopupTitle,$iSizeWHTTP, $iSizeHHTTP); } function BXClearCache($full = false, $initdir = '') { return CPHPCache::ClearCache($full, $initdir); } function RegisterModule($id) { Main\ModuleManager::registerModule($id); } function UnRegisterModule($id) { Main\ModuleManager::unRegisterModule($id); } function AddEventHandler($FROM_MODULE_ID, $MESSAGE_ID, $CALLBACK, $SORT=100, $FULL_PATH = false) { $eventManager = Main\EventManager::getInstance(); return $eventManager->addEventHandlerCompatible($FROM_MODULE_ID, $MESSAGE_ID, $CALLBACK, $FULL_PATH, $SORT); } function RemoveEventHandler($FROM_MODULE_ID, $MESSAGE_ID, $iEventHandlerKey) { $eventManager = Main\EventManager::getInstance(); return $eventManager->removeEventHandler($FROM_MODULE_ID, $MESSAGE_ID, $iEventHandlerKey); } function GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray = false) { $eventManager = Main\EventManager::getInstance(); $arrResult = $eventManager->findEventHandlers($MODULE_ID, $MESSAGE_ID); foreach($arrResult as $k => $event) { $arrResult[$k]['FROM_MODULE_ID'] = $MODULE_ID; $arrResult[$k]['MESSAGE_ID'] = $MESSAGE_ID; } if($bReturnArray) { return $arrResult; } else { $resRS = new CDBResult; $resRS->InitFromArray($arrResult); return $resRS; } } /** * @deprecated */ function ExecuteModuleEvent($arEvent) { $args = []; for ($i = 1, $nArgs = func_num_args(); $i < $nArgs; $i++) { $args[] = func_get_arg($i); } return ExecuteModuleEventEx($arEvent, $args); } function ExecuteModuleEventEx($arEvent, $arParams = []) { $result = true; if( isset($arEvent["TO_MODULE_ID"]) && $arEvent["TO_MODULE_ID"]<>"" && $arEvent["TO_MODULE_ID"]<>"main" ) { if(!CModule::IncludeModule($arEvent["TO_MODULE_ID"])) { return null; } } elseif( isset($arEvent["TO_PATH"]) && $arEvent["TO_PATH"]<>"" && file_exists($_SERVER["DOCUMENT_ROOT"].BX_ROOT.$arEvent["TO_PATH"]) ) { $result = include_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT.$arEvent["TO_PATH"]); } elseif( isset($arEvent["FULL_PATH"]) && $arEvent["FULL_PATH"]<>"" && file_exists($arEvent["FULL_PATH"]) ) { $result = include_once($arEvent["FULL_PATH"]); } if ((empty($arEvent["TO_CLASS"]) || empty($arEvent["TO_METHOD"])) && !isset($arEvent["CALLBACK"])) { return $result; } if (isset($arEvent["TO_METHOD_ARG"]) && is_array($arEvent["TO_METHOD_ARG"]) && !empty($arEvent["TO_METHOD_ARG"])) { $args = array_merge($arEvent["TO_METHOD_ARG"], $arParams); } else { $args = $arParams; } //TODO: �������� ������� �� EventManager::getInstance()->getLastEvent(); global $BX_MODULE_EVENT_LAST; $BX_MODULE_EVENT_LAST = $arEvent; if (isset($arEvent["CALLBACK"])) { $result = call_user_func_array($arEvent["CALLBACK"], $args); } else { //php bug: http://bugs.php.net/bug.php?id=47948 if (class_exists($arEvent["TO_CLASS"]) && is_callable([$arEvent["TO_CLASS"], $arEvent["TO_METHOD"]])) { $result = call_user_func_array([$arEvent["TO_CLASS"], $arEvent["TO_METHOD"]], $args); } else { $exception = new SystemException("Event handler error: could not invoke {$arEvent["TO_CLASS"]}::{$arEvent["TO_METHOD"]}. Class or method does not exist."); $application = Application::getInstance(); $exceptionHandler = $application->getExceptionHandler(); $exceptionHandler->writeToLog($exception); $result = null; } } return $result; } function UnRegisterModuleDependences($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS="", $TO_METHOD="", $TO_PATH="", $TO_METHOD_ARG = array()) { $eventManager = Main\EventManager::getInstance(); $eventManager->unRegisterEventHandler($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS, $TO_METHOD, $TO_PATH, $TO_METHOD_ARG); } function RegisterModuleDependences($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS="", $TO_METHOD="", $SORT=100, $TO_PATH="", $TO_METHOD_ARG = array()) { $eventManager = Main\EventManager::getInstance(); $eventManager->registerEventHandlerCompatible($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS, $TO_METHOD, $SORT, $TO_PATH, $TO_METHOD_ARG); } function IsModuleInstalled($module_id) { return Main\ModuleManager::isModuleInstalled($module_id); } function GetModuleID($str) { $arr = explode("/",$str); $i = array_search("modules",$arr); return $arr[$i+1]; } /** * @deprecated Use version_compare() * Returns TRUE if version1 >= version2 * version1 = "XX.XX.XX" * version2 = "XX.XX.XX" */ function CheckVersion($version1, $version2) { return (version_compare($version1, $version2) >= 0); }