1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
tools.php
См. документацию.
1<?php
2
9
10use Bitrix\Main;
18
23function getmicrotime()
24{
25 return microtime(true);
26}
27
31
35function InputType($strType, $strName, $strValue, $strCmp, $strPrintValue = false, $strPrint = "", $field1 = "", $strId = "")
36{
37 $bCheck = false;
38 if ($strValue <> '')
39 {
40 if (is_array($strCmp))
41 {
42 $bCheck = in_array($strValue, $strCmp);
43 }
44 elseif ($strCmp <> '')
45 {
46 $bCheck = in_array($strValue, explode(",", $strCmp));
47 }
48 }
49 $bLabel = false;
50 if ($strType == 'radio')
51 {
52 $bLabel = true;
53 }
54
55 $bId = true;
56 if ($strType == 'radio' || $strType == 'checkbox')
57 {
58 $bId = !preg_match('/^id="/', $field1) && !preg_match('/\sid="/', $field1);
59 }
60
61 return ($bLabel ? '<label>' : '') . '<input type="' . $strType . '" ' . $field1 . ' name="' . $strName . '"' .
62 ($bId ? ' id="' . ($strId <> '' ? $strId : $strName) . '"' : '') .
63 ' value="' . $strValue . '"' .
64 ($bCheck ? ' checked' : '') . '>' . ($strPrintValue ? $strValue : $strPrint) . ($bLabel ? '</label>' : '');
65}
66
77function SelectBox($strBoxName, $a, $strDetText = "", $strSelectedVal = "", $field1 = "class=\"typeselect\"")
78{
79 $strReturnBox = "<select " . $field1 . " name=\"" . $strBoxName . "\" id=\"" . $strBoxName . "\">";
80 if ($strDetText <> '')
81 {
82 $strReturnBox = $strReturnBox . "<option value=\"NOT_REF\">" . $strDetText . "</option>";
83 }
84 while (($ar = $a->Fetch()))
85 {
86 $reference_id = $ar["REFERENCE_ID"] ?? '';
87 $reference = $ar["REFERENCE"] ?? '';
88 if ($reference_id == '')
89 {
90 $reference_id = $ar["reference_id"];
91 }
92 if ($reference == '')
93 {
94 $reference = $ar["reference"];
95 }
96
97 $strReturnBox = $strReturnBox . "<option ";
98 if (strcasecmp($reference_id, $strSelectedVal) == 0)
99 {
100 $strReturnBox = $strReturnBox . " selected ";
101 }
102 $strReturnBox = $strReturnBox . "value=\"" . htmlspecialcharsbx($reference_id) . "\">" . htmlspecialcharsbx($reference) . "</option>";
103 }
104 return $strReturnBox . "</select>";
105}
106
119function SelectBoxM($strBoxName, $a, $arr, $strDetText = "", $strDetText_selected = false, $size = "5", $field1 = "class=\"typeselect\"")
120{
121 $strReturnBox = "<select " . $field1 . " multiple name=\"" . $strBoxName . "\" id=\"" . $strBoxName . "\" size=\"" . $size . "\">";
122 if ($strDetText <> '')
123 {
124 $strReturnBox = $strReturnBox . "<option ";
125 if ($strDetText_selected)
126 {
127 $strReturnBox = $strReturnBox . " selected ";
128 }
129 $strReturnBox = $strReturnBox . " value='NOT_REF'>" . $strDetText . "</option>";
130 }
131 while ($ar = $a->Fetch())
132 {
133 $reference_id = $ar["REFERENCE_ID"];
134 $reference = $ar["REFERENCE"];
135 if ($reference_id == '')
136 {
137 $reference_id = $ar["reference_id"];
138 }
139 if ($reference == '')
140 {
141 $reference = $ar["reference"];
142 }
143
144 $sel = (is_array($arr) && in_array($reference_id, $arr) ? "selected" : "");
145 $strReturnBox = $strReturnBox . "<option " . $sel;
146 $strReturnBox = $strReturnBox . " value=\"" . htmlspecialcharsbx($reference_id) . "\">" . htmlspecialcharsbx($reference) . "</option>";
147 }
148 return $strReturnBox . "</select>";
149}
150
163function SelectBoxMFromArray($strBoxName, $a, $arr, $strDetText = "", $strDetText_selected = false, $size = "5", $field1 = "class='typeselect'")
164{
165 $strReturnBox = "<select " . $field1 . " multiple name=\"" . $strBoxName . "\" id=\"" . $strBoxName . "\" size=\"" . $size . "\">";
166
167 if (array_key_exists("REFERENCE_ID", $a))
168 {
169 $reference_id = $a["REFERENCE_ID"];
170 }
171 elseif (array_key_exists("reference_id", $a))
172 {
173 $reference_id = $a["reference_id"];
174 }
175 else
176 {
177 $reference_id = [];
178 }
179
180 if (array_key_exists("REFERENCE", $a))
181 {
182 $reference = $a["REFERENCE"];
183 }
184 elseif (array_key_exists("reference", $a))
185 {
186 $reference = $a["reference"];
187 }
188 else
189 {
190 $reference = [];
191 }
192
193 if ($strDetText <> '')
194 {
195 $strReturnBox .= "<option ";
196 if ($strDetText_selected)
197 {
198 $strReturnBox .= " selected ";
199 }
200 $strReturnBox .= " value='NOT_REF'>" . $strDetText . "</option>";
201 }
202
203 foreach ($reference_id as $key => $value)
204 {
205 $sel = (is_array($arr) && in_array($value, $arr) ? "selected" : "");
206 $strReturnBox .= "<option value=\"" . htmlspecialcharsbx($value) . "\" " . $sel . ">" . htmlspecialcharsbx($reference[$key]) . "</option>";
207 }
208
209 $strReturnBox .= "</select>";
210 return $strReturnBox;
211}
212
217 $strBoxName,
218 $db_array,
219 $strSelectedVal = "",
220 $strDetText = "",
221 $field1 = "class='typeselect'",
222 $go = false,
223 $form = "form1"
224)
225{
226 $boxName = htmlspecialcharsbx($strBoxName);
227 if ($go)
228 {
229 $funName = preg_replace("/[^a-z0-9_]/i", "", $strBoxName);
230 $jsName = CUtil::JSEscape($strBoxName);
231
232 $strReturnBox = "<script>\n" .
233 "function " . $funName . "LinkUp()\n" .
234 "{var number = document." . $form . "['" . $jsName . "'].selectedIndex;\n" .
235 "if(document." . $form . "['" . $jsName . "'].options[number].value!=\"0\"){ \n" .
236 "document." . $form . "['" . $jsName . "_SELECTED'].value=\"yes\";\n" .
237 "document." . $form . ".submit();\n" .
238 "}}\n" .
239 "</script>\n";
240 $strReturnBox .= '<input type="hidden" name="' . $boxName . '_SELECTED" id="' . $boxName . '_SELECTED" value="">';
241 $strReturnBox .= '<select ' . $field1 . ' name="' . $boxName . '" id="' . $boxName . '" onchange="' . $funName . 'LinkUp()" class="typeselect">';
242 }
243 else
244 {
245 $strReturnBox = '<select ' . $field1 . ' name="' . $boxName . '" id="' . $boxName . '">';
246 }
247
248 if (isset($db_array["reference"]) && is_array($db_array["reference"]))
249 {
250 $ref = $db_array["reference"];
251 }
252 elseif (isset($db_array["REFERENCE"]) && is_array($db_array["REFERENCE"]))
253 {
254 $ref = $db_array["REFERENCE"];
255 }
256 else
257 {
258 $ref = [];
259 }
260
261 if (isset($db_array["reference_id"]) && is_array($db_array["reference_id"]))
262 {
263 $ref_id = $db_array["reference_id"];
264 }
265 elseif (isset($db_array["REFERENCE_ID"]) && is_array($db_array["REFERENCE_ID"]))
266 {
267 $ref_id = $db_array["REFERENCE_ID"];
268 }
269 else
270 {
271 $ref_id = [];
272 }
273
274 if ($strDetText <> '')
275 {
276 $strReturnBox .= '<option value="">' . $strDetText . '</option>';
277 }
278
279 foreach ($ref as $i => $val)
280 {
281 $strReturnBox .= '<option';
282 if (strcasecmp($ref_id[$i], $strSelectedVal) == 0)
283 {
284 $strReturnBox .= ' selected';
285 }
286 $strReturnBox .= ' value="' . htmlspecialcharsbx($ref_id[$i]) . '">' . htmlspecialcharsbx($val) . '</option>';
287 }
288 return $strReturnBox . '</select>';
289}
290
291function Calendar($fieldName, $formName = "")
292{
293 if (defined("ADMIN_SECTION") && ADMIN_SECTION)
294 {
295 return CAdminCalendar::Calendar($fieldName);
296 }
297
298 global $APPLICATION;
299
300 ob_start();
301
302 $APPLICATION->IncludeComponent(
303 'bitrix:main.calendar',
304 '',
305 [
306 'RETURN' => 'Y',
307 'SHOW_INPUT' => 'N',
308 'INPUT_NAME' => $fieldName,
309 'FORM_NAME' => $formName,
310 'SHOW_TIME' => 'N',
311 ],
312 null,
313 ['HIDE_ICONS' => 'Y']
314 );
315
316 return ob_get_clean();
317}
318
319function CalendarDate($fieldName, $value, $formName = "", $size = "10", $param = "class=\"typeinput\"")
320{
321 if (defined("ADMIN_SECTION") && ADMIN_SECTION)
322 {
323 return CAdminCalendar::CalendarDate($fieldName, $value, $size, ($size > 10));
324 }
325
326 return '<input type="text" name="' . $fieldName . '" id="' . $fieldName . '" size="' . $size . '" value="' . htmlspecialcharsbx($value) . '" ' . $param . ' /> ' . "\n" . Calendar($fieldName, $formName) . "\n";
327}
328
329function CalendarPeriod($sFromName, $sFromVal, $sToName, $sToVal, $sFormName = "skform", $show_select = "N", $field_select = "class=\"typeselect\"", $field_input = "class=\"typeinput\"", $size = "10")
330{
331 if (defined("ADMIN_SECTION") && ADMIN_SECTION)
332 {
333 return CAdminCalendar::CalendarPeriod($sFromName, $sToName, $sFromVal, $sToVal, ($show_select == "Y"), $size, ($size > 10));
334 }
335
336 $arr = [];
337 $str = "";
338 $ds = "";
339 if ($show_select == "Y")
340 {
341 $sname = $sFromName . "_DAYS_TO_BACK";
342 $str = "
343<script>
344function " . $sFromName . "_SetDate()
345{
346 var number = document." . $sFormName . "." . $sname . ".selectedIndex-1;
347 document." . $sFormName . "." . $sFromName . ".disabled = false;
348 if (number>=0)
349 {
350 document." . $sFormName . "." . $sFromName . ".value = dates[number];
351 document." . $sFormName . "." . $sFromName . ".disabled = true;
352 }
353}
354</script>
355";
356 global $$sname;
357 $value = $$sname;
358 if ((string)$value <> '' && $value != "NOT_REF")
359 {
360 $ds = "disabled";
361 }
362
363 ?>
364 <script>
365 var dates = [];
366 <?
367 for ($i = 0; $i <= 90; $i++)
368 {
369 $prev_date = GetTime(time() - 86400 * $i);
370 ?>dates[<?=$i?>] = "<?=$prev_date?>";<?
371 if (!is_array($arr["reference"]))
372 {
373 $arr["reference"] = [];
374 }
375 if (!is_array($arr["reference_id"]))
376 {
377 $arr["reference_id"] = [];
378 }
379 $arr["reference"][] = $i . " " . GetMessage("TOOLS_DN");
380 $arr["reference_id"][] = $i;
381 }
382 ?></script><?
383 $str .= SelectBoxFromArray($sname, $arr, $value, "&nbsp;", "onchange=\"" . $sFromName . "_SetDate()\" " . $field_select);
384 $str .= "&nbsp;";
385 }
386 $str .=
387 '<input ' . $ds . ' ' . $field_input . ' type="text" name="' . $sFromName . '" id="' . $sFromName . '" size="' . $size . '" value="' . htmlspecialcharsbx($sFromVal) . '" /> ' . "\n" .
388 Calendar($sFromName, $sFormName) . ' ... ' . "\n" .
389 '<input ' . $field_input . ' type="text" name="' . $sToName . '" id="' . $sToName . '" size="' . $size . '" value="' . htmlspecialcharsbx($sToVal) . '" /> ' . "\n" .
390 Calendar($sToName, $sFormName) . "\n";
391
392 return '<span style="white-space: nowrap;">' . $str . '</span>';
393}
394
398function CheckDateTime($datetime, $format = false)
399{
400 $datetime = (string)$datetime;
401
402 if ($format === false && defined("FORMAT_DATETIME"))
403 {
404 $format = FORMAT_DATETIME;
405 }
406
407 $ar = ParseDateTime($datetime, $format);
408
409 if ($ar === false)
410 {
411 return false;
412 }
413
414 $day = (int)$ar["DD"];
415 $hour = $month = 0;
416
417 if (isset($ar["MMMM"]))
418 {
419 if (is_numeric($ar["MMMM"]))
420 {
421 $month = (int)$ar["MMMM"];
422 }
423 else
424 {
425 $month = GetNumMonth($ar["MMMM"]);
426 if (!$month)
427 {
428 $month = (int)date('m', strtotime($ar["MMMM"]));
429 }
430 }
431 }
432 elseif (isset($ar["MM"]))
433 {
434 $month = (int)$ar["MM"];
435 }
436 elseif (isset($ar["M"]))
437 {
438 if (is_numeric($ar["M"]))
439 {
440 $month = (int)$ar["M"];
441 }
442 else
443 {
444 $month = GetNumMonth($ar["M"]);
445 if (!$month)
446 {
447 $month = (int)date('m', strtotime($ar["M"]));
448 }
449 }
450 }
451 $year = (int)($ar["YYYY"] ?? 0);
452 if (isset($ar["HH"]))
453 {
454 $hour = (int)$ar["HH"];
455 }
456 elseif (isset($ar["H"]))
457 {
458 $hour = (int)$ar["H"];
459 }
460 elseif (isset($ar["GG"]))
461 {
462 $hour = (int)$ar["GG"];
463 }
464 elseif (isset($ar["G"]))
465 {
466 $hour = (int)$ar["G"];
467 }
468 if (isset($ar['TT']) || isset($ar['T']))
469 {
470 $middletime = $ar['TT'] ?? $ar['T'];
471 if (strcasecmp('pm', $middletime) === 0)
472 {
473 if ($hour < 12)
474 {
475 $hour += 12;
476 }
477 }
478 else
479 {
480 if ($hour == 12)
481 {
482 $hour = 0;
483 }
484 }
485 }
486 $min = (int)($ar["MI"] ?? 0);
487 $sec = (int)($ar["SS"] ?? 0);
488
489 if (!checkdate($month, $day, $year))
490 {
491 return false;
492 }
493
494 if ($hour > 24 || $hour < 0 || $min < 0 || $min > 59 || $sec < 0 || $sec > 59)
495 {
496 return false;
497 }
498
499 if (!isset($ar["SS"]))
500 {
501 // skip seconds
502 $format = str_replace(':SS', '', $format);
503 }
504
505 $s1 = preg_replace("~([^:\\\\/\\s.,0-9-]+|[^:\\\\/\\s.,a-z-]+)[\n\r\t ]*~iu", "P", $datetime);
506 $s2 = preg_replace("/(DD|MMMM|MM|MI|M|YYYY|HH|H|GG|G|SS|TT|T)[\n\r\t ]*/iu", "P", $format);
507
508 if (mb_strlen($s1) <= mb_strlen($s2))
509 {
510 return $s1 == mb_substr($s2, 0, mb_strlen($s1));
511 }
512
513 return $s2 == mb_substr($s1, 0, mb_strlen($s2));
514}
515
519function GetNumMonth($month)
520{
521 global $MESS;
522 if ($month)
523 {
524 for ($i = 1; $i <= 12; $i++)
525 {
526 if (strcasecmp($MESS['MONTH_' . $i . '_S'], $month) === 0 || strcasecmp($MESS['MON_' . $i], $month) === 0 || strcasecmp($MESS['MONTH_' . $i], $month) === 0)
527 {
528 return $i;
529 }
530 }
531 }
532 return false;
533}
534
538function MakeTimeStamp($datetime, $format = false)
539{
540 if ($format === false && defined("FORMAT_DATETIME"))
541 {
542 $format = FORMAT_DATETIME;
543 }
544
545 $ar = ParseDateTime($datetime, $format);
546
547 $day = (int)($ar["DD"] ?? 0);
548 $hour = $month = 0;
549
550 if (isset($ar["MMMM"]))
551 {
552 if (is_numeric($ar["MMMM"]))
553 {
554 $month = (int)$ar["MMMM"];
555 }
556 else
557 {
558 $month = GetNumMonth($ar["MMMM"]);
559 if (!$month)
560 {
561 $month = (int)date('m', strtotime($ar["MMMM"]));
562 }
563 }
564 }
565 elseif (isset($ar["MM"]))
566 {
567 $month = (int)$ar["MM"];
568 }
569 elseif (isset($ar["M"]))
570 {
571 if (is_numeric($ar["M"]))
572 {
573 $month = (int)$ar["M"];
574 }
575 else
576 {
577 $month = GetNumMonth($ar["M"], true);
578 if (!$month)
579 {
580 $month = (int)date('m', strtotime($ar["M"]));
581 }
582 }
583 }
584 $year = (int)($ar["YYYY"] ?? 0);
585 if (isset($ar["HH"]))
586 {
587 $hour = (int)$ar["HH"];
588 }
589 elseif (isset($ar["H"]))
590 {
591 $hour = (int)$ar["H"];
592 }
593 elseif (isset($ar["GG"]))
594 {
595 $hour = (int)$ar["GG"];
596 }
597 elseif (isset($ar["G"]))
598 {
599 $hour = (int)$ar["G"];
600 }
601 if (isset($ar['TT']) || isset($ar['T']))
602 {
603 $middletime = $ar['TT'] ?? $ar['T'];
604 if (strcasecmp('pm', $middletime) === 0)
605 {
606 if ($hour < 12)
607 {
608 $hour += 12;
609 }
610 }
611 else
612 {
613 if ($hour == 12)
614 {
615 $hour = 0;
616 }
617 }
618 }
619 $min = (int)($ar["MI"] ?? 0);
620 $sec = (int)($ar["SS"] ?? 0);
621
622 if (!checkdate($month, $day, $year))
623 {
624 return false;
625 }
626
627 if ($hour > 24 || $hour < 0 || $min < 0 || $min > 59 || $sec < 0 || $sec > 59)
628 {
629 return false;
630 }
631
632 return mktime($hour, $min, $sec, $month, $day, $year);
633}
634
638function ParseDateTime($datetime, $format = false)
639{
640 if ($datetime === null)
641 {
642 return false;
643 }
644 if ($format === false && defined("FORMAT_DATETIME"))
645 {
646 $format = FORMAT_DATETIME;
647 }
648
649 $fm_args = [];
650 if (preg_match_all("/(DD|MI|MMMM|MM|M|YYYY|HH|H|SS|TT|T|GG|G)/i", $format, $fm_args))
651 {
652 $dt_args = [];
653 if (preg_match_all("~([^:\\\\/\\s.,0-9-]+|[^:\\\\/\\s.,a-z-]+)~iu", $datetime, $dt_args))
654 {
655 $arrResult = [];
656 foreach ($fm_args[0] as $i => $v)
657 {
658 if (isset($dt_args[0][$i]))
659 {
660 if (is_numeric($dt_args[0][$i]))
661 {
662 $arrResult[$v] = sprintf("%0" . mb_strlen($v) . "d", intval($dt_args[0][$i]));
663 }
664 elseif (($dt_args[0][$i] === "am" || $dt_args[0][$i] === "pm") && in_array("T", $fm_args[0]))
665 {
666 $arrResult["T"] = $dt_args[0][$i];
667 }
668 elseif (($dt_args[0][$i] === "AM" || $dt_args[0][$i] === "PM") && in_array("TT", $fm_args[0]))
669 {
670 $arrResult["TT"] = $dt_args[0][$i];
671 }
672 else
673 {
674 $arrResult[$v] = $dt_args[0][$i];
675 }
676 }
677 }
678 return $arrResult;
679 }
680 }
681 return false;
682}
683
687function AddToTimeStamp($arrAdd, $stmp = false)
688{
689 if ($stmp === false)
690 {
691 $stmp = time();
692 }
693 if (is_array($arrAdd))
694 {
695 foreach ($arrAdd as $key => $value)
696 {
697 $value = intval($value);
698 switch ($key)
699 {
700 case "DD":
701 $stmp = AddTime($stmp, $value, "D");
702 break;
703 case "MM":
704 $stmp = AddTime($stmp, $value, "MN");
705 break;
706 case "YYYY":
707 $stmp = AddTime($stmp, $value, "Y");
708 break;
709 case "HH":
710 $stmp = AddTime($stmp, $value, "H");
711 break;
712 case "MI":
713 $stmp = AddTime($stmp, $value, "M");
714 break;
715 case "SS":
716 $stmp = AddTime($stmp, $value, "S");
717 break;
718 }
719 }
720 }
721 return $stmp;
722}
723
724function ConvertDateTime($datetime, $to_format = false, $from_site = false, $bSearchInSitesOnly = false)
725{
726 if ($to_format === false && defined("FORMAT_DATETIME"))
727 {
728 $to_format = FORMAT_DATETIME;
729 }
730 return FmtDate($datetime, $to_format, $from_site, false, $bSearchInSitesOnly);
731}
732
733function ConvertTimeStamp($timestamp = false, $type = "SHORT", $site = false, $bSearchInSitesOnly = false)
734{
735 if ($timestamp === false)
736 {
737 $timestamp = time();
738 }
739 return GetTime($timestamp, $type, $site, $bSearchInSitesOnly);
740}
741
745function FmtDate($str_date, $format = false, $site = false, $bSearchInSitesOnly = false)
746{
747 global $DB;
748 if ($site === false && defined("SITE_ID"))
749 {
750 $site = SITE_ID;
751 }
752 if ($format === false && defined("FORMAT_DATETIME"))
753 {
754 $format = FORMAT_DATETIME;
755 }
756
757 return $DB::FormatDate($str_date, CSite::GetDateFormat("FULL", $site, $bSearchInSitesOnly), $format);
758}
759
766function _FormatDateMessage($value, $messages, ?string $languageId = null)
767{
768 if ($value < 100)
769 {
770 $val = abs($value);
771 }
772 else
773 {
774 $val = abs($value % 100);
775 }
776
777 $dec = $val % 10;
778
779 if ($val == 0)
780 {
781 return Main\Localization\Loc::getMessage($messages["0"], ["#VALUE#" => $value], $languageId);
782 }
783 if ($val == 1)
784 {
785 return Main\Localization\Loc::getMessage($messages["1"], ["#VALUE#" => $value], $languageId);
786 }
787 if ($val >= 10 && $val <= 20)
788 {
789 return Main\Localization\Loc::getMessage($messages["10_20"], ["#VALUE#" => $value], $languageId);
790 }
791 if ($dec == 1)
792 {
793 return Main\Localization\Loc::getMessage($messages["MOD_1"], ["#VALUE#" => $value], $languageId);
794 }
795 if (2 <= $dec && $dec <= 4)
796 {
797 return Main\Localization\Loc::getMessage($messages["MOD_2_4"], ["#VALUE#" => $value], $languageId);
798 }
799
800 return Main\Localization\Loc::getMessage($messages["MOD_OTHER"], ["#VALUE#" => $value], $languageId);
801}
802
803function IsAmPmMode($returnConst = false)
804{
805 if ($returnConst)
806 {
807 if (str_contains(FORMAT_DATETIME, 'TT'))
808 {
809 return AM_PM_UPPER;
810 }
811 if (str_contains(FORMAT_DATETIME, 'T'))
812 {
813 return AM_PM_LOWER;
814 }
815 return AM_PM_NONE;
816 }
817 return str_contains(FORMAT_DATETIME, 'T');
818}
819
820function convertTimeToMilitary($strTime, $fromFormat = 'H:MI T', $toFormat = 'HH:MI')
821{
822 global $DB;
823
824 $arParsedDate = ParseDateTime($strTime, $fromFormat);
825
826 if (isset($arParsedDate["H"]))
827 {
828 $arParsedDate["HH"] = intval($arParsedDate["H"]);
829 }
830 elseif (isset($arParsedDate["GG"]))
831 {
832 $arParsedDate["HH"] = intval($arParsedDate["GG"]);
833 }
834 elseif (isset($arParsedDate["G"]))
835 {
836 $arParsedDate["HH"] = intval($arParsedDate["G"]);
837 }
838
839 if (isset($arParsedDate['TT']) || isset($arParsedDate['T']))
840 {
841 $middletime = $arParsedDate['TT'] ?? $arParsedDate['T'];
842 if (strcasecmp('pm', $middletime) === 0)
843 {
844 if ($arParsedDate["HH"] < 12)
845 {
846 $arParsedDate["HH"] += 12;
847 }
848 elseif ($arParsedDate["HH"] == 12)
849 {
850 $arParsedDate["HH"] = 12;
851 }
852 else
853 {
854 $arParsedDate["HH"] -= 12;
855 }
856 }
857 }
858
859 $ts = mktime($arParsedDate['HH'], $arParsedDate['MI'], ($arParsedDate['SS'] ?? 0), 3, 7, 2012);
860 return FormatDate($DB->dateFormatToPHP($toFormat), $ts);
861}
862
871function FormatDate($format = "", $timestamp = false, $now = false, ?string $languageId = null)
872{
873 global $DB;
874
875 if ($timestamp === false)
876 {
877 $timestamp = time();
878 }
879 else
880 {
881 if ($timestamp instanceof Main\Type\Date)
882 {
883 $timestamp = $timestamp->getTimestamp();
884 }
885 else
886 {
887 $timestamp = (int)$timestamp;
888 }
889 }
890
891 if ($now === false)
892 {
893 $now = time();
894 }
895 else
896 {
897 if ($now instanceof Main\Type\Date)
898 {
899 $now = $now->getTimestamp();
900 }
901 else
902 {
903 $now = (int)$now;
904 }
905 }
906
907 switch ($format)
908 {
909 case "SHORT":
910 $format = $DB::dateFormatToPHP(FORMAT_DATE);
911 break;
912 case "FULL":
913 $format = $DB::dateFormatToPHP(FORMAT_DATETIME);
914 }
915
916 if (is_array($format))
917 {
918 $seconds_ago = $now - $timestamp;
919 foreach ($format as $format_interval => $format_value)
920 {
921 if ($format_interval === "s")
922 {
923 if ($seconds_ago < 60)
924 {
925 return FormatDate($format_value, $timestamp, $now, $languageId);
926 }
927 }
928 elseif (preg_match('/^s(\d+)>?(\d+)?/', $format_interval, $match))
929 {
930 if (isset($match[1], $match[2]))
931 {
932 if (
933 $seconds_ago < (int)$match[1]
934 && $seconds_ago > (int)$match[2]
935 )
936 {
937 return FormatDate($format_value, $timestamp, $now, $languageId);
938 }
939 }
940 else
941 {
942 if ($seconds_ago < (int)$match[1])
943 {
944 return FormatDate($format_value, $timestamp, $now, $languageId);
945 }
946 }
947 }
948 elseif ($format_interval === "i")
949 {
950 if ($seconds_ago < 60 * 60)
951 {
952 return FormatDate($format_value, $timestamp, $now, $languageId);
953 }
954 }
955 elseif (preg_match('/^i(\d+)>?(\d+)?/', $format_interval, $match))
956 {
957 if (isset($match[1], $match[2]))
958 {
959 if (
960 $seconds_ago < (int)$match[1] * 60
961 && $seconds_ago > (int)$match[2] * 60
962 )
963 {
964 return FormatDate($format_value, $timestamp, $now, $languageId);
965 }
966 }
967 else
968 {
969 if ($seconds_ago < (int)$match[1] * 60)
970 {
971 return FormatDate($format_value, $timestamp, $now, $languageId);
972 }
973 }
974 }
975 elseif ($format_interval === "H")
976 {
977 if ($seconds_ago < 24 * 60 * 60)
978 {
979 return FormatDate($format_value, $timestamp, $now, $languageId);
980 }
981 }
982 elseif (preg_match('/^H(\d+)>?(\d+)?/', $format_interval, $match))
983 {
984 if (isset($match[1], $match[2]))
985 {
986 if (
987 $seconds_ago < (int)$match[1] * 60 * 60
988 && $seconds_ago > (int)$match[2] * 60 * 60
989 )
990 {
991 return FormatDate($format_value, $timestamp, $now, $languageId);
992 }
993 }
994 else
995 {
996 if ($seconds_ago < (int)$match[1] * 60 * 60)
997 {
998 return FormatDate($format_value, $timestamp, $now, $languageId);
999 }
1000 }
1001 }
1002 elseif ($format_interval === "d")
1003 {
1004 if ($seconds_ago < 31 * 24 * 60 * 60)
1005 {
1006 return FormatDate($format_value, $timestamp, $now, $languageId);
1007 }
1008 }
1009 elseif (preg_match('/^d(\d+)>?(\d+)?/', $format_interval, $match))
1010 {
1011 if (isset($match[1], $match[2]))
1012 {
1013 if (
1014 $seconds_ago < (int)$match[1] * 24 * 60 * 60
1015 && $seconds_ago > (int)$match[2] * 24 * 60 * 60
1016 )
1017 {
1018 return FormatDate($format_value, $timestamp, $now, $languageId);
1019 }
1020 }
1021 else
1022 {
1023 if ($seconds_ago < (int)$match[1] * 24 * 60 * 60)
1024 {
1025 return FormatDate($format_value, $timestamp, $now, $languageId);
1026 }
1027 }
1028 }
1029 elseif ($format_interval === "m")
1030 {
1031 if ($seconds_ago < 365 * 24 * 60 * 60)
1032 {
1033 return FormatDate($format_value, $timestamp, $now, $languageId);
1034 }
1035 }
1036 elseif (preg_match('/^m(\d+)>?(\d+)?/', $format_interval, $match))
1037 {
1038 if (isset($match[1], $match[2]))
1039 {
1040 if (
1041 $seconds_ago < (int)$match[1] * 31 * 24 * 60 * 60
1042 && $seconds_ago > (int)$match[2] * 31 * 24 * 60 * 60
1043 )
1044 {
1045 return FormatDate($format_value, $timestamp, $now, $languageId);
1046 }
1047 }
1048 else
1049 {
1050 if ($seconds_ago < (int)$match[1] * 31 * 24 * 60 * 60)
1051 {
1052 return FormatDate($format_value, $timestamp, $now, $languageId);
1053 }
1054 }
1055 }
1056 elseif ($format_interval === "now")
1057 {
1058 if ($timestamp === $now)
1059 {
1060 return FormatDate($format_value, $timestamp, $now, $languageId);
1061 }
1062 }
1063 elseif ($format_interval === "today")
1064 {
1065 $arNow = localtime($now);
1066 $today_1 = mktime(0, 0, 0, $arNow[4] + 1, $arNow[3], $arNow[5] + 1900);
1067 $today_2 = mktime(0, 0, 0, $arNow[4] + 1, $arNow[3] + 1, $arNow[5] + 1900);
1068 if ($timestamp >= $today_1 && $timestamp < $today_2)
1069 {
1070 return FormatDate($format_value, $timestamp, $now, $languageId);
1071 }
1072 }
1073 elseif ($format_interval === "todayFuture")
1074 {
1075 $arNow = localtime($now);
1076 $today_1 = $now;
1077 $today_2 = mktime(0, 0, 0, $arNow[4] + 1, $arNow[3] + 1, $arNow[5] + 1900);
1078 if ($timestamp >= $today_1 && $timestamp < $today_2)
1079 {
1080 return FormatDate($format_value, $timestamp, $now, $languageId);
1081 }
1082 }
1083 elseif ($format_interval === "yesterday")
1084 {
1085 $arNow = localtime($now);
1086 //le = number of seconds scince midnight
1087 //$le = $arSDate[0]+$arSDate[1]*60+$arSDate[2]*3600;
1088 //yesterday_1 = truncate(now)-1
1089 $yesterday_1 = mktime(0, 0, 0, $arNow[4] + 1, $arNow[3] - 1, $arNow[5] + 1900);
1090 //yesterday_2 = truncate(now)
1091 $yesterday_2 = mktime(0, 0, 0, $arNow[4] + 1, $arNow[3], $arNow[5] + 1900);
1092
1093 if ($timestamp >= $yesterday_1 && $timestamp < $yesterday_2)
1094 {
1095 return FormatDate($format_value, $timestamp, $now, $languageId);
1096 }
1097 }
1098 elseif ($format_interval === "tommorow" || $format_interval === "tomorrow")
1099 {
1100 $arNow = localtime($now);
1101 $tomorrow_1 = mktime(0, 0, 0, $arNow[4] + 1, $arNow[3] + 1, $arNow[5] + 1900);
1102 $tomorrow_2 = mktime(0, 0, 0, $arNow[4] + 1, $arNow[3] + 2, $arNow[5] + 1900);
1103
1104 if ($timestamp >= $tomorrow_1 && $timestamp < $tomorrow_2)
1105 {
1106 return FormatDate($format_value, $timestamp, $now, $languageId);
1107 }
1108 }
1109 elseif ($format_interval === "-")
1110 {
1111 if ($seconds_ago < 0)
1112 {
1113 return FormatDate($format_value, $timestamp, $now, $languageId);
1114 }
1115 }
1116 }
1117 return FormatDate(array_pop($format), $timestamp, $now, $languageId);
1118 }
1119
1120 $bCutZeroTime = false;
1121 if (str_starts_with($format, '^'))
1122 {
1123 $bCutZeroTime = true;
1124 $format = substr($format, 1);
1125 }
1126
1127 $arFormatParts = preg_split("/(?<!\\\\)(
1128 sago|iago|isago|Hago|dago|mago|Yago|
1129 sdiff|idiff|Hdiff|ddiff|mdiff|Ydiff|
1130 sshort|ishort|Hshort|dshort|mshort|Yshort|
1131 yesterday|today|tomorrow|tommorow|
1132 X|x|j|F|f|Y|Q|M|l|D
1133 )/x", $format, 0, PREG_SPLIT_DELIM_CAPTURE);
1134
1135 $result = "";
1136 $currentLanguage = $languageId ?? Main\Localization\Loc::getCurrentLang();
1137
1138 foreach ($arFormatParts as $format_part)
1139 {
1140 switch ($format_part)
1141 {
1142 case "":
1143 break;
1144 case "sago":
1145 $seconds_ago = $now - $timestamp;
1147 $seconds_ago,
1148 [
1149 "0" => "FD_SECOND_AGO_0",
1150 "1" => "FD_SECOND_AGO_1",
1151 "10_20" => "FD_SECOND_AGO_10_20",
1152 "MOD_1" => "FD_SECOND_AGO_MOD_1",
1153 "MOD_2_4" => "FD_SECOND_AGO_MOD_2_4",
1154 "MOD_OTHER" => "FD_SECOND_AGO_MOD_OTHER",
1155 ],
1156 $languageId
1157 );
1158 break;
1159 case "sdiff":
1160 $seconds_ago = $now - $timestamp;
1162 $seconds_ago,
1163 [
1164 "0" => "FD_SECOND_DIFF_0",
1165 "1" => "FD_SECOND_DIFF_1",
1166 "10_20" => "FD_SECOND_DIFF_10_20",
1167 "MOD_1" => "FD_SECOND_DIFF_MOD_1",
1168 "MOD_2_4" => "FD_SECOND_DIFF_MOD_2_4",
1169 "MOD_OTHER" => "FD_SECOND_DIFF_MOD_OTHER",
1170 ],
1171 $languageId
1172 );
1173 break;
1174 case "sshort":
1175 $seconds_ago = $now - $timestamp;
1177 "FD_SECOND_SHORT",
1178 ["#VALUE#" => $seconds_ago],
1179 $languageId
1180 );
1181 break;
1182 case "iago":
1183 $minutes_ago = (int)(($now - $timestamp) / 60);
1185 $minutes_ago,
1186 [
1187 "0" => "FD_MINUTE_AGO_0",
1188 "1" => "FD_MINUTE_AGO_1",
1189 "10_20" => "FD_MINUTE_AGO_10_20",
1190 "MOD_1" => "FD_MINUTE_AGO_MOD_1",
1191 "MOD_2_4" => "FD_MINUTE_AGO_MOD_2_4",
1192 "MOD_OTHER" => "FD_MINUTE_AGO_MOD_OTHER",
1193 ],
1194 $languageId
1195 );
1196 break;
1197 case "idiff":
1198 $minutes_ago = (int)(($now - $timestamp) / 60);
1200 $minutes_ago,
1201 [
1202 "0" => "FD_MINUTE_DIFF_0",
1203 "1" => "FD_MINUTE_DIFF_1",
1204 "10_20" => "FD_MINUTE_DIFF_10_20",
1205 "MOD_1" => "FD_MINUTE_DIFF_MOD_1",
1206 "MOD_2_4" => "FD_MINUTE_DIFF_MOD_2_4",
1207 "MOD_OTHER" => "FD_MINUTE_DIFF_MOD_OTHER",
1208 ],
1209 $languageId
1210 );
1211 break;
1212 case "ishort":
1213 $minutes_ago = (int)(($now - $timestamp) / 60);
1215 "FD_MINUTE_SHORT",
1216 ["#VALUE#" => $minutes_ago],
1217 $languageId
1218 );
1219 break;
1220 case "isago":
1221 $minutes_ago = (int)(($now - $timestamp) / 60);
1223 $minutes_ago,
1224 [
1225 "0" => "FD_MINUTE_0",
1226 "1" => "FD_MINUTE_1",
1227 "10_20" => "FD_MINUTE_10_20",
1228 "MOD_1" => "FD_MINUTE_MOD_1",
1229 "MOD_2_4" => "FD_MINUTE_MOD_2_4",
1230 "MOD_OTHER" => "FD_MINUTE_MOD_OTHER",
1231 ],
1232 $languageId
1233 );
1234
1235 $result .= " ";
1236
1237 $seconds_ago = $now - $timestamp - ($minutes_ago * 60);
1239 $seconds_ago,
1240 [
1241 "0" => "FD_SECOND_AGO_0",
1242 "1" => "FD_SECOND_AGO_1",
1243 "10_20" => "FD_SECOND_AGO_10_20",
1244 "MOD_1" => "FD_SECOND_AGO_MOD_1",
1245 "MOD_2_4" => "FD_SECOND_AGO_MOD_2_4",
1246 "MOD_OTHER" => "FD_SECOND_AGO_MOD_OTHER",
1247 ],
1248 $languageId
1249 );
1250 break;
1251 case "Hago":
1252 $hours_ago = (int)(($now - $timestamp) / 60 / 60);
1254 $hours_ago,
1255 [
1256 "0" => "FD_HOUR_AGO_0",
1257 "1" => "FD_HOUR_AGO_1",
1258 "10_20" => "FD_HOUR_AGO_10_20",
1259 "MOD_1" => "FD_HOUR_AGO_MOD_1",
1260 "MOD_2_4" => "FD_HOUR_AGO_MOD_2_4",
1261 "MOD_OTHER" => "FD_HOUR_AGO_MOD_OTHER",
1262 ],
1263 $languageId
1264 );
1265 break;
1266 case "Hdiff":
1267 $hours_ago = (int)(($now - $timestamp) / 60 / 60);
1269 $hours_ago,
1270 [
1271 "0" => "FD_HOUR_DIFF_0",
1272 "1" => "FD_HOUR_DIFF_1",
1273 "10_20" => "FD_HOUR_DIFF_10_20",
1274 "MOD_1" => "FD_HOUR_DIFF_MOD_1",
1275 "MOD_2_4" => "FD_HOUR_DIFF_MOD_2_4",
1276 "MOD_OTHER" => "FD_HOUR_DIFF_MOD_OTHER",
1277 ],
1278 $languageId
1279 );
1280 break;
1281 case "Hshort":
1282 $hours_ago = (int)(($now - $timestamp) / 60 / 60);
1284 "FD_HOUR_SHORT",
1285 ["#VALUE#" => $hours_ago],
1286 $languageId
1287 );
1288 break;
1289 case "yesterday":
1290 $result .= Main\Localization\Loc::getMessage("FD_YESTERDAY", null, $languageId);
1291 break;
1292 case "today":
1293 $result .= Main\Localization\Loc::getMessage("FD_TODAY", null, $languageId);
1294 break;
1295 case "tommorow": // grammar error :)
1296 case "tomorrow":
1297 $result .= Main\Localization\Loc::getMessage("FD_TOMORROW", null, $languageId);
1298 break;
1299 case "dago":
1300 $days_ago = (int)(($now - $timestamp) / 60 / 60 / 24);
1302 $days_ago,
1303 [
1304 "0" => "FD_DAY_AGO_0",
1305 "1" => "FD_DAY_AGO_1",
1306 "10_20" => "FD_DAY_AGO_10_20",
1307 "MOD_1" => "FD_DAY_AGO_MOD_1",
1308 "MOD_2_4" => "FD_DAY_AGO_MOD_2_4",
1309 "MOD_OTHER" => "FD_DAY_AGO_MOD_OTHER",
1310 ],
1311 $languageId
1312 );
1313 break;
1314 case "ddiff":
1315 $days_ago = (int)(($now - $timestamp) / 60 / 60 / 24);
1317 $days_ago,
1318 [
1319 "0" => "FD_DAY_DIFF_0",
1320 "1" => "FD_DAY_DIFF_1",
1321 "10_20" => "FD_DAY_DIFF_10_20",
1322 "MOD_1" => "FD_DAY_DIFF_MOD_1",
1323 "MOD_2_4" => "FD_DAY_DIFF_MOD_2_4",
1324 "MOD_OTHER" => "FD_DAY_DIFF_MOD_OTHER",
1325 ],
1326 $languageId
1327 );
1328 break;
1329 case "dshort":
1330 $days_ago = (int)(($now - $timestamp) / 60 / 60 / 24);
1332 "FD_DAY_SHORT",
1333 ["#VALUE#" => $days_ago],
1334 $languageId
1335 );
1336 break;
1337 case "mago":
1338 $months_ago = (int)(($now - $timestamp) / 60 / 60 / 24 / 31);
1340 $months_ago,
1341 [
1342 "0" => "FD_MONTH_AGO_0",
1343 "1" => "FD_MONTH_AGO_1",
1344 "10_20" => "FD_MONTH_AGO_10_20",
1345 "MOD_1" => "FD_MONTH_AGO_MOD_1",
1346 "MOD_2_4" => "FD_MONTH_AGO_MOD_2_4",
1347 "MOD_OTHER" => "FD_MONTH_AGO_MOD_OTHER",
1348 ],
1349 $languageId
1350 );
1351 break;
1352 case "mdiff":
1353 $months_ago = (int)(($now - $timestamp) / 60 / 60 / 24 / 31);
1355 $months_ago,
1356 [
1357 "0" => "FD_MONTH_DIFF_0",
1358 "1" => "FD_MONTH_DIFF_1",
1359 "10_20" => "FD_MONTH_DIFF_10_20",
1360 "MOD_1" => "FD_MONTH_DIFF_MOD_1",
1361 "MOD_2_4" => "FD_MONTH_DIFF_MOD_2_4",
1362 "MOD_OTHER" => "FD_MONTH_DIFF_MOD_OTHER",
1363 ],
1364 $languageId
1365 );
1366 break;
1367 case "mshort":
1368 $months_ago = (int)(($now - $timestamp) / 60 / 60 / 24 / 31);
1370 "FD_MONTH_SHORT",
1371 ["#VALUE#" => $months_ago],
1372 $languageId
1373 );
1374 break;
1375 case "Yago":
1376 $years_ago = (int)(($now - $timestamp) / 60 / 60 / 24 / 365);
1378 $years_ago,
1379 [
1380 "0" => "FD_YEARS_AGO_0",
1381 "1" => "FD_YEARS_AGO_1",
1382 "10_20" => "FD_YEARS_AGO_10_20",
1383 "MOD_1" => "FD_YEARS_AGO_MOD_1",
1384 "MOD_2_4" => "FD_YEARS_AGO_MOD_2_4",
1385 "MOD_OTHER" => "FD_YEARS_AGO_MOD_OTHER",
1386 ],
1387 $languageId
1388 );
1389 break;
1390 case "Ydiff":
1391 $years_ago = (int)(($now - $timestamp) / 60 / 60 / 24 / 365);
1393 $years_ago,
1394 [
1395 "0" => "FD_YEARS_DIFF_0",
1396 "1" => "FD_YEARS_DIFF_1",
1397 "10_20" => "FD_YEARS_DIFF_10_20",
1398 "MOD_1" => "FD_YEARS_DIFF_MOD_1",
1399 "MOD_2_4" => "FD_YEARS_DIFF_MOD_2_4",
1400 "MOD_OTHER" => "FD_YEARS_DIFF_MOD_OTHER",
1401 ],
1402 $languageId
1403 );
1404 break;
1405 case "Yshort":
1406 $years_ago = (int)(($now - $timestamp) / 60 / 60 / 24 / 365);
1408 $years_ago,
1409 [
1410 "0" => "FD_YEARS_SHORT_0",
1411 "1" => "FD_YEARS_SHORT_1",
1412 "10_20" => "FD_YEARS_SHORT_10_20",
1413 "MOD_1" => "FD_YEARS_SHORT_MOD_1",
1414 "MOD_2_4" => "FD_YEARS_SHORT_MOD_2_4",
1415 "MOD_OTHER" => "FD_YEARS_SHORT_MOD_OTHER",
1416 ],
1417 $languageId
1418 );
1419 break;
1420 case "F":
1421 if ($currentLanguage === "en")
1422 {
1423 $result .= date($format_part, $timestamp);
1424 }
1425 else
1426 {
1428 "MONTH_" . date("n", $timestamp) . "_S",
1429 null,
1430 $languageId
1431 );
1432 }
1433 break;
1434 case "f":
1435 if ($currentLanguage === "en")
1436 {
1437 $result .= date("F", $timestamp);
1438 }
1439 else
1440 {
1442 "MONTH_" . date("n", $timestamp),
1443 null,
1444 $languageId
1445 );
1446 }
1447 break;
1448 case "M":
1449 if ($currentLanguage === "en")
1450 {
1451 $result .= date($format_part, $timestamp);
1452 }
1453 else
1454 {
1456 "MON_" . date("n", $timestamp),
1457 null,
1458 $languageId
1459 );
1460 }
1461 break;
1462 case "l":
1463 if ($currentLanguage === "en")
1464 {
1465 $result .= date($format_part, $timestamp);
1466 }
1467 else
1468 {
1470 "DAY_OF_WEEK_" . date("w", $timestamp),
1471 null,
1472 $languageId
1473 );
1474 }
1475 break;
1476 case "D":
1477 if ($currentLanguage === "en")
1478 {
1479 $result .= date($format_part, $timestamp);
1480 }
1481 else
1482 {
1484 "DOW_" . date("w", $timestamp),
1485 null,
1486 $languageId
1487 );
1488 }
1489 break;
1490 case "j":
1491 $dayOfMonth = date("j", $timestamp);
1492 $dayPattern = Main\Localization\Loc::getMessage("DOM_PATTERN", null, $languageId);
1493 if ($dayPattern)
1494 {
1495 $result .= str_replace("#DAY#", $dayOfMonth, $dayPattern);
1496 }
1497 else
1498 {
1499 $result .= $dayOfMonth;
1500 }
1501 break;
1502 case "Y":
1503 $year = date("Y", $timestamp);
1504 $yearPattern = Main\Localization\Loc::getMessage("YEAR_PATTERN", null, $languageId);
1505 if ($yearPattern)
1506 {
1507 $result .= str_replace("#YEAR#", $year, $yearPattern);
1508 }
1509 else
1510 {
1511 $result .= $year;
1512 }
1513 break;
1514 case "x":
1515 $ampm = IsAmPmMode(true);
1516 $timeFormat = ($ampm === AM_PM_LOWER ? "g:i a" : ($ampm === AM_PM_UPPER ? "g:i A" : "H:i"));
1517 $formats = [];
1518 $formats["tomorrow"] = "tomorrow, " . $timeFormat;
1519 $formats["-"] = preg_replace('/:s/', '', $DB::DateFormatToPHP(CSite::GetDateFormat("FULL")));
1520 $formats["s"] = "sago";
1521 $formats["i"] = "iago";
1522 $formats["today"] = "today, " . $timeFormat;
1523 $formats["yesterday"] = "yesterday, " . $timeFormat;
1524 $formats[""] = preg_replace('/:s/', '', $DB::DateFormatToPHP(CSite::GetDateFormat("FULL")));
1525 $result .= FormatDate($formats, $timestamp, $now, $languageId);
1526 break;
1527 case "X":
1528 $day = FormatDate([
1529 "tomorrow" => "tomorrow",
1530 "-" => $DB::DateFormatToPHP(CSite::GetDateFormat("SHORT")),
1531 "today" => "today",
1532 "yesterday" => "yesterday",
1533 "" => $DB::DateFormatToPHP(CSite::GetDateFormat("SHORT")),
1534 ], $timestamp, $now, $languageId);
1535
1536 $ampm = IsAmPmMode(true);
1537 $timeFormat = ($ampm === AM_PM_LOWER ? "g:i a" : ($ampm === AM_PM_UPPER ? "g:i A" : "H:i"));
1538 $formats = [];
1539 $formats["tomorrow"] = $timeFormat;
1540 $formats["today"] = $timeFormat;
1541 $formats["yesterday"] = $timeFormat;
1542 $formats[""] = "";
1543 $time = FormatDate($formats, $timestamp, $now, $languageId);
1544
1545 if ($time <> '')
1546 {
1548 "FD_DAY_AT_TIME",
1549 [
1550 "#DAY#" => $day,
1551 "#TIME#" => $time,
1552 ],
1553 $languageId
1554 );
1555 }
1556 else
1557 {
1558 $result .= $day;
1559 }
1560 break;
1561 case "Q":
1562 $days_ago = (int)(($now - $timestamp) / 60 / 60 / 24);
1563 if ($days_ago === 0)
1564 {
1566 "FD_DAY_DIFF_1",
1567 ["#VALUE#" => 1],
1568 $languageId
1569 );
1570 }
1571 else
1572 {
1573 $result .= FormatDate([
1574 "d" => "ddiff",
1575 "m" => "mdiff",
1576 "" => "Ydiff",
1577 ], $timestamp, $now, $languageId);
1578 }
1579 break;
1580 default:
1581 $result .= date($format_part, $timestamp);
1582 break;
1583 }
1584 }
1585
1586 if ($bCutZeroTime)
1587 {
1588 $result = preg_replace(
1589 ["/\\s*00:00:00\\s*/", "/(\\d\\d:\\d\\d)(:00)/", "/(\\s*00:00\\s*)(?!:)/"],
1590 ["", "\\1", ""],
1591 $result
1592 );
1593 }
1594
1595 return $result;
1596}
1597
1598function FormatDateEx($strDate, $format = false, $new_format = false)
1599{
1600 $strDate = trim($strDate);
1601
1602 if (false === $new_format)
1603 {
1604 $new_format = CSite::GetDateFormat('FULL');
1605 }
1606
1607 $new_format = str_replace("MI", "I", $new_format);
1608 $new_format = preg_replace("/([DMYIHGST])\\1+/isu", "\\1", $new_format);
1609
1610 $arParsedDate = ParseDateTime($strDate);
1611
1612 if (isset($arParsedDate["MMMM"]))
1613 {
1614 if (is_numeric($arParsedDate["MMMM"]))
1615 {
1616 $arParsedDate["MM"] = intval($arParsedDate["MMMM"]);
1617 }
1618 else
1619 {
1620 $arParsedDate["MM"] = GetNumMonth($arParsedDate["MMMM"]);
1621 if (!$arParsedDate["MM"])
1622 {
1623 $arParsedDate["MM"] = intval(date('m', strtotime($arParsedDate["MMMM"])));
1624 }
1625 }
1626 }
1627 elseif (isset($arParsedDate["MM"]))
1628 {
1629 $arParsedDate["MM"] = intval($arParsedDate["MM"]);
1630 }
1631 elseif (isset($arParsedDate["M"]))
1632 {
1633 if (is_numeric($arParsedDate["M"]))
1634 {
1635 $arParsedDate["MM"] = intval($arParsedDate["M"]);
1636 }
1637 else
1638 {
1639 $arParsedDate["MM"] = GetNumMonth($arParsedDate["M"], true);
1640 if (!$arParsedDate["MM"])
1641 {
1642 $arParsedDate["MM"] = intval(date('m', strtotime($arParsedDate["M"])));
1643 }
1644 }
1645 }
1646
1647 if (isset($arParsedDate["H"]))
1648 {
1649 $arParsedDate["HH"] = intval($arParsedDate["H"]);
1650 }
1651 elseif (isset($arParsedDate["GG"]))
1652 {
1653 $arParsedDate["HH"] = intval($arParsedDate["GG"]);
1654 }
1655 elseif (isset($arParsedDate["G"]))
1656 {
1657 $arParsedDate["HH"] = intval($arParsedDate["G"]);
1658 }
1659
1660 if (isset($arParsedDate['TT']) || isset($arParsedDate['T']))
1661 {
1662 $middletime = $arParsedDate['TT'] ?? $arParsedDate['T'];
1663 if (strcasecmp('pm', $middletime) === 0)
1664 {
1665 if ($arParsedDate["HH"] < 12)
1666 {
1667 $arParsedDate["HH"] += 12;
1668 }
1669 else
1670 {
1671 $arParsedDate["HH"] -= 12;
1672 }
1673 }
1674 }
1675
1676 if (isset($arParsedDate["YYYY"]))
1677 {
1678 $arParsedDate["YY"] = $arParsedDate["YYYY"];
1679 }
1680
1681 if (intval($arParsedDate["DD"]) <= 0 || intval($arParsedDate["MM"]) <= 0 || intval($arParsedDate["YY"]) <= 0)
1682 {
1683 return false;
1684 }
1685
1686 $strResult = "";
1687
1688 if (intval($arParsedDate["YY"]) > 1970 && intval($arParsedDate["YY"]) < 2038)
1689 {
1690 $ux_time = mktime(
1691 intval($arParsedDate["HH"] ?? 0),
1692 intval($arParsedDate["MI"] ?? 0),
1693 intval($arParsedDate["SS"] ?? 0),
1694 intval($arParsedDate["MM"] ?? 0),
1695 intval($arParsedDate["DD"] ?? 0),
1696 intval($arParsedDate["YY"] ?? 0)
1697 );
1698
1699 $new_format_l = mb_strlen($new_format);
1700 $dontChange = false;
1701
1702 for ($i = 0; $i < $new_format_l; $i++)
1703 {
1704 $simbol = mb_substr($new_format, $i, 1);
1705
1706 if (!$dontChange && $simbol === "\\")
1707 {
1708 $dontChange = true;
1709 continue;
1710 }
1711
1712 if ($dontChange)
1713 {
1714 $match = $simbol;
1715 }
1716 else
1717 {
1718 switch ($simbol)
1719 {
1720 case "F":
1721 $match = GetMessage("MONTH_" . date("n", $ux_time) . "_S");
1722 break;
1723 case "f":
1724 $match = GetMessage("MONTH_" . date("n", $ux_time));
1725 break;
1726 case "M":
1727 $match = GetMessage("MON_" . date("n", $ux_time));
1728 break;
1729 case "l":
1730 $match = GetMessage("DAY_OF_WEEK_" . date("w", $ux_time));
1731 break;
1732 case "D":
1733 $match = GetMessage("DOW_" . date("w", $ux_time));
1734 break;
1735 case "j":
1736 $match = date(mb_substr($new_format, $i, 1), $ux_time);
1737 $dayPattern = GetMessage("DOM_PATTERN");
1738 if ($dayPattern)
1739 {
1740 $match = str_replace("#DAY#", $match, $dayPattern);
1741 }
1742 break;
1743 default:
1744 $match = date(mb_substr($new_format, $i, 1), $ux_time);
1745 break;
1746 }
1747 }
1748
1749 $strResult .= $match;
1750 $dontChange = false;
1751 }
1752 }
1753 else
1754 {
1755 if ($arParsedDate["MM"] < 1 || $arParsedDate["MM"] > 12)
1756 {
1757 $arParsedDate["MM"] = 1;
1758 }
1759 $new_format_l = mb_strlen($new_format);
1760 $dontChange = false;
1761
1762 for ($i = 0; $i < $new_format_l; $i++)
1763 {
1764 $simbol = mb_substr($new_format, $i, 1);
1765
1766 if (!$dontChange && $simbol === "\\")
1767 {
1768 $dontChange = true;
1769 continue;
1770 }
1771
1772 if ($dontChange)
1773 {
1774 $match = $simbol;
1775 }
1776 else
1777 {
1778 switch ($simbol)
1779 {
1780 case "F":
1781 case "f":
1782 $match = str_pad($arParsedDate["MM"], 2, "0", STR_PAD_LEFT);
1783 if (intval($arParsedDate["MM"]) > 0)
1784 {
1785 $match = GetMessage("MONTH_" . intval($arParsedDate["MM"]) . ($simbol == 'F' ? '_S' : ''));
1786 }
1787 break;
1788 case "M":
1789 $match = str_pad($arParsedDate["MM"], 2, "0", STR_PAD_LEFT);
1790 if (intval($arParsedDate["MM"]) > 0)
1791 {
1792 $match = GetMessage("MON_" . intval($arParsedDate["MM"]));
1793 }
1794 break;
1795 case "l":
1796 $match = str_pad($arParsedDate["DD"], 2, "0", STR_PAD_LEFT);
1797 if (intval($arParsedDate["DD"]) > 0)
1798 {
1799 $match = GetMessage("DAY_OF_WEEK_" . intval($arParsedDate["DD"]));
1800 }
1801 break;
1802 case "D":
1803 $match = str_pad($arParsedDate["DD"], 2, "0", STR_PAD_LEFT);
1804 if (intval($arParsedDate["DD"]) > 0)
1805 {
1806 $match = GetMessage("DOW_" . intval($arParsedDate["DD"]));
1807 }
1808 break;
1809 case "d":
1810 $match = str_pad($arParsedDate["DD"], 2, "0", STR_PAD_LEFT);
1811 break;
1812 case "m":
1813 $match = str_pad($arParsedDate["MM"], 2, "0", STR_PAD_LEFT);
1814 break;
1815 case "j":
1816 $match = intval($arParsedDate["DD"]);
1817 $dayPattern = GetMessage("DOM_PATTERN");
1818 if ($dayPattern)
1819 {
1820 $match = str_replace("#DAY#", $match, $dayPattern);
1821 }
1822 break;
1823 case "Y":
1824 $match = str_pad($arParsedDate["YY"], 4, "0", STR_PAD_LEFT);
1825 break;
1826 case "y":
1827 $match = mb_substr($arParsedDate["YY"], 2);
1828 break;
1829 case "H":
1830 $match = str_pad($arParsedDate["HH"], 2, "0", STR_PAD_LEFT);
1831 break;
1832 case "i":
1833 $match = str_pad($arParsedDate["MI"], 2, "0", STR_PAD_LEFT);
1834 break;
1835 case "s":
1836 $match = str_pad($arParsedDate["SS"], 2, "0", STR_PAD_LEFT);
1837 break;
1838 case "g":
1839 $match = intval($arParsedDate["HH"]);
1840 if ($match > 12)
1841 {
1842 $match = $match - 12;
1843 }
1844 break;
1845 case "a":
1846 case "A":
1847 $match = intval($arParsedDate["HH"]);
1848 if ($match > 12)
1849 {
1850 $match = ($match - 12) . " PM";
1851 }
1852 else
1853 {
1854 $match .= " AM";
1855 }
1856
1857 if (mb_substr($new_format, $i, 1) == "a")
1858 {
1859 $match = mb_strtolower($match);
1860 }
1861 break;
1862 default:
1863 $match = mb_substr($new_format, $i, 1);
1864 break;
1865 }
1866 }
1867
1868 $strResult .= $match;
1869 $dontChange = false;
1870 }
1871 }
1872 return $strResult;
1873}
1874
1875function FormatDateFromDB($date, $format = 'FULL', $phpFormat = false)
1876{
1877 global $DB;
1878
1879 if ($format === 'FULL' || $format === 'SHORT')
1880 {
1881 return FormatDate($DB::DateFormatToPHP(CSite::GetDateFormat($format)), MakeTimeStamp($date));
1882 }
1883
1884 return FormatDate(($phpFormat ? $format : $DB::DateFormatToPHP($format)), MakeTimeStamp($date));
1885}
1886
1890function GetTime($timestamp, $type = "SHORT", $site = false, $bSearchInSitesOnly = false)
1891{
1892 global $DB;
1893
1894 if ($site === false && ($context = Context::getCurrent()) !== null && ($culture = $context->getCulture()) !== null)
1895 {
1896 $format = ($type === "FULL" ? $culture->getFormatDatetime() : $culture->getFormatDate());
1897 }
1898 else
1899 {
1900 $format = CSite::GetDateFormat($type, $site, $bSearchInSitesOnly);
1901 }
1902
1903 return date($DB::DateFormatToPHP($format), $timestamp);
1904}
1905
1909function AddTime($stmp, $add, $type = "D")
1910{
1911 $ret = $stmp;
1912 switch ($type)
1913 {
1914 case "H":
1915 $ret = mktime(
1916 date("H", $stmp) + $add, date("i", $stmp), date("s", $stmp),
1917 date("m", $stmp), date("d", $stmp), date("Y", $stmp));
1918 break;
1919 case "M":
1920 $ret = mktime(
1921 date("H", $stmp), date("i", $stmp) + $add, date("s", $stmp),
1922 date("m", $stmp), date("d", $stmp), date("Y", $stmp));
1923 break;
1924 case "S":
1925 $ret = mktime(
1926 date("H", $stmp), date("i", $stmp), date("s", $stmp) + $add,
1927 date("m", $stmp), date("d", $stmp), date("Y", $stmp));
1928 break;
1929 case "D":
1930 $ret = mktime(
1931 date("H", $stmp), date("i", $stmp), date("s", $stmp),
1932 date("m", $stmp), date("d", $stmp) + $add, date("Y", $stmp));
1933 break;
1934 case "MN":
1935 $ret = mktime(
1936 date("H", $stmp), date("i", $stmp), date("s", $stmp),
1937 date("m", $stmp) + $add, date("d", $stmp), date("Y", $stmp));
1938 break;
1939 case "Y":
1940 $ret = mktime(
1941 date("H", $stmp), date("i", $stmp), date("s", $stmp),
1942 date("m", $stmp), date("d", $stmp), date("Y", $stmp) + $add);
1943 break;
1944 }
1945 return $ret;
1946}
1947
1951function ParseDate($strDate, $format = "dmy")
1952{
1953 $day = $month = $year = 0;
1954 $args = preg_split('#[/.-]#', $strDate);
1955 $bound = min(mb_strlen($format), count($args));
1956 for ($i = 0; $i < $bound; $i++)
1957 {
1958 if ($format[$i] == 'm')
1959 {
1960 $month = intval($args[$i]);
1961 }
1962 elseif ($format[$i] == 'd')
1963 {
1964 $day = intval($args[$i]);
1965 }
1966 elseif ($format[$i] == 'y')
1967 {
1968 $year = intval($args[$i]);
1969 }
1970 }
1971 return (checkdate($month, $day, $year) ? [$day, $month, $year] : 0);
1972}
1973
1977function MkDateTime($strDT, $format = "d.m.Y H:i:s")
1978{
1979 static $arr = ["d.m.Y", "d.m.Y H:i", "d.m.Y H:i:s"];
1980
1981 if (!(in_array($format, $arr)))
1982 {
1983 return false;
1984 }
1985
1986 $strDT = preg_replace("/[\n\r\t ]+/", " ", $strDT);
1987
1988 $dateTime = explode(" ", $strDT);
1989
1990 $date = trim($dateTime[0] ?? '');
1991 $time = trim($dateTime[1] ?? '');
1992
1993 $dayMonthYear = explode(".", $date);
1994
1995 $day = (int)($dayMonthYear[0] ?? 0);
1996 $month = (int)($dayMonthYear[1] ?? 0);
1997 $year = (int)($dayMonthYear[2] ?? 0);
1998
1999 $hourMinSec = explode(":", $time);
2000
2001 $hour = (int)($hourMinSec[0] ?? 0);
2002 $min = (int)($hourMinSec[1] ?? 0);
2003 $sec = (int)($hourMinSec[2] ?? 0);
2004
2005 if (!checkdate($month, $day, $year))
2006 {
2007 return false;
2008 }
2009 if ($hour > 24 || $hour < 0 || $min < 0 || $min > 59 || $sec < 0 || $sec > 59)
2010 {
2011 return false;
2012 }
2013
2014 $ts = mktime($hour, $min, $sec, $month, $day, $year);
2015
2016 if ($ts <= 0)
2017 {
2018 return false;
2019 }
2020
2021 return $ts;
2022}
2023
2027function PHPFormatDateTime($strDateTime, $format = "d.m.Y H:i:s")
2028{
2029 return date($format, MkDateTime(FmtDate($strDateTime, "D.M.Y H:I:S"), "d.m.Y H:i:s"));
2030}
2031
2035
2036/*
2037удаляет дубли в массиве сортировки
2038массив
2039Array
2040(
2041 [0] => T.NAME DESC
2042 [1] => T.NAME ASC
2043 [2] => T.ID ASC
2044 [3] => T.ID DESC
2045 [4] => T.DESC
2046)
2047преобразует в
2048Array
2049(
2050 [0] => T.NAME DESC
2051 [1] => T.ID ASC
2052 [2] => T.DESC ASC
2053)
2054*/
2055function DelDuplicateSort(&$arSort)
2056{
2057 if (is_array($arSort) && !empty($arSort))
2058 {
2059 $arSort2 = [];
2060 foreach ($arSort as $val)
2061 {
2062 $arSort1 = explode(" ", trim($val));
2063 $order = array_pop($arSort1);
2064 $order_ = mb_strtoupper(trim($order));
2065 if (!($order_ == "DESC" || $order_ == "ASC"))
2066 {
2067 $arSort1[] = $order;
2068 $order_ = "";
2069 }
2070 $by = implode(" ", $arSort1);
2071 if ($by <> '' && !array_key_exists($by, $arSort2))
2072 {
2073 $arSort2[$by] = $order_;
2074 }
2075 }
2076 $arSort = [];
2077 foreach ($arSort2 as $by => $order)
2078 {
2079 $arSort[] = $by . " " . $order;
2080 }
2081 }
2082}
2083
2085{
2086 $arr_res = [];
2087 if (is_array($arr))
2088 {
2089 foreach ($arr as $key => $value)
2090 {
2091 global $$value;
2092 $arr_res[$key] = $$value;
2093 }
2094 }
2095 return $arr_res;
2096}
2097
2099{
2100 if (is_array($arr) && !empty($arr))
2101 {
2102 foreach ($arr as $value)
2103 {
2104 global $$value;
2105 $$value = ($$value == "Y") ? "Y" : "N";
2106 }
2107 }
2108}
2109
2110function TrimArr(&$arr, $trim_value = false)
2111{
2112 if (!is_array($arr))
2113 {
2114 return false;
2115 }
2116
2117 $found = false;
2118 foreach ($arr as $key => $value)
2119 {
2120 if ($trim_value)
2121 {
2122 $arr[$key] = trim($value);
2123 }
2124 if (trim($value) == '')
2125 {
2126 unset($arr[$key]);
2127 $found = true;
2128 }
2129 }
2130 return $found;
2131}
2132
2133function is_set($a, $k = false)
2134{
2135 if ($k === false && func_num_args() == 1)
2136 {
2137 return isset($a);
2138 }
2139
2140 if (is_array($a))
2141 {
2142 return isset($a[$k]) || array_key_exists($k, $a);
2143 }
2144
2145 return false;
2146}
2147
2154function randString($pass_len = 10, $pass_chars = false)
2155{
2156 if (is_array($pass_chars))
2157 {
2158 return Security\Random::getStringByArray($pass_len, $pass_chars);
2159 }
2160 else
2161 {
2162 if ($pass_chars !== false)
2163 {
2164 return Security\Random::getStringByCharsets($pass_len, $pass_chars);
2165 }
2166 else
2167 {
2168 // Random::ALPHABET_NUM | Random::ALPHABET_ALPHALOWER | Random::ALPHABET_ALPHAUPPER
2169 return Security\Random::getString($pass_len, true);
2170 }
2171 }
2172}
2173
2180function GetRandomCode($len = 8)
2181{
2182 return randString($len);
2183}
2184
2185function TruncateText($strText, $intLen)
2186{
2187 if (mb_strlen($strText) > $intLen)
2188 {
2189 return rtrim(mb_substr($strText, 0, $intLen), ".") . "...";
2190 }
2191 else
2192 {
2193 return $strText;
2194 }
2195}
2196
2197function InsertSpaces($sText, $iMaxChar = 80, $symbol = " ", $bHTML = false)
2198{
2199 $iMaxChar = intval($iMaxChar);
2200 if ($iMaxChar > 0 && mb_strlen($sText) > $iMaxChar)
2201 {
2202 if ($bHTML)
2203 {
2204 $obSpacer = new CSpacer($iMaxChar, $symbol);
2205 return $obSpacer->InsertSpaces($sText);
2206 }
2207 else
2208 {
2209 return preg_replace("/([^() \\n\\r\\t%!?{}\\][-]{" . $iMaxChar . "})/u", "\\1" . $symbol, $sText);
2210 }
2211 }
2212 return $sText;
2213}
2214
2222function TrimEx($str, $symbol, $side = "both")
2223{
2224 $str = trim($str);
2225 if ($side == "both" || $side == "left")
2226 {
2227 if (mb_substr($str, 0, 1) == $symbol)
2228 {
2229 $str = mb_substr($str, 1);
2230 }
2231 }
2232 if ($side == "both" || $side == "right")
2233 {
2234 if (mb_substr($str, -1) == $symbol)
2235 {
2236 $str = mb_substr($str, 0, -1);
2237 }
2238 }
2239 return $str;
2240}
2241
2247function ToUpper($str)
2248{
2249 return mb_strtoupper($str);
2250}
2251
2257function ToLower($str)
2258{
2259 return mb_strtolower($str);
2260}
2261
2262function PrepareTxtForEmail($text, $lang = false, $convert_url_tag = true, $convert_image_tag = true)
2263{
2264 $text = trim($text);
2265 if ($text == '')
2266 {
2267 return "";
2268 }
2269
2270 if ($lang === false)
2271 {
2272 $lang = LANGUAGE_ID;
2273 }
2274
2275 $arMsg = IncludeModuleLangFile(__FILE__, $lang, true);
2276 $helper = new CConvertorsPregReplaceHelper($arMsg["MAIN_CODE_S"]);
2277
2278 $text = preg_replace("#<code(\\s+[^>]*>|>)(.+?)</code(\\s+[^>]*>|>)#is", "[code]\\2[/code]", $text);
2279 $text = preg_replace_callback("#\\[code(\\s+[^\\]]*\\]|\\])(.+?)\\[/code(\\s+[^\\]]*\\]|\\])#is", [$helper, "convertCodeTagForEmail"], $text);
2280
2281 $text = preg_replace("/^(\r|\n)+?(.*)$/", "\\2", $text);
2282 $text = preg_replace("#<b>(.+?)</b>#is", "\\1", $text);
2283 $text = preg_replace("#<i>(.+?)</i>#is", "\\1", $text);
2284 $text = preg_replace("#<u>(.+?)</u>#is", "_\\1_", $text);
2285 $text = preg_replace("#\\[b\\](.+?)\\[/b\\]#is", "\\1", $text);
2286 $text = preg_replace("#\\[i\\](.+?)\\[/i\\]#is", "\\1", $text);
2287 $text = preg_replace("#\\[u\\](.+?)\\[/u\\]#is", "_\\1_", $text);
2288
2289 $text = preg_replace("#<(/?)quote(.*?)>#is", "[\\1quote]", $text);
2290
2291 $s = "-------------- " . $arMsg["MAIN_QUOTE_S"] . " -----------------";
2292 $text = preg_replace("#\\[quote(.*?)\\]#is", "\n>" . $s . "\n", $text);
2293 $text = preg_replace("#\\[/quote(.*?)\\]#is", "\n>" . str_repeat("-", mb_strlen($s)) . "\n", $text);
2294
2295 if ($convert_url_tag)
2296 {
2297 $text = preg_replace("#<a[^>]*href=[\"']?([^>\"' ]+)[\"']?[^>]*>(.+?)</a>#is", "\\2 (URL: \\1)", $text);
2298 $text = preg_replace("#\\[url\\](\\S+?)\\[/url\\]#is", "(URL: \\1)", $text);
2299 $text = preg_replace("#\\[url\\s*=\\s*(\\S+?)\\s*\\](.*?)\\[\\/url\\]#is", "\\2 (URL: \\1)", $text);
2300 }
2301
2302 if ($convert_image_tag)
2303 {
2304 $text = preg_replace("#<img[^>]*src=[\"']?([^>\"' ]+)[\"']?[^>]*>#is", " (IMAGE: \\1) ", $text);
2305 $text = preg_replace("#\\[img\\](.+?)\\[/img\\]#is", " (IMAGE: \\1) ", $text);
2306 }
2307
2308 $text = preg_replace("#<ul(\\s+[^>]*>|>)#is", "\n", $text);
2309 $text = preg_replace("#<ol(\\s+[^>]*>|>)#is", "\n", $text);
2310 $text = preg_replace("#<li(\\s+[^>]*>|>)#is", " [*] ", $text);
2311 $text = preg_replace("#</li>#is", "", $text);
2312 $text = preg_replace("#</ul>#is", "\n\n", $text);
2313 $text = preg_replace("#</ol>#is", "\n\n", $text);
2314
2315 $text = preg_replace("#\\[list\\]#is", "\n", $text);
2316 $text = preg_replace("#\\[/list\\]#is", "\n", $text);
2317
2318 $text = preg_replace("#<br>#is", "\n", $text);
2319 $text = preg_replace("#<wbr>#is", "", $text);
2320
2321 //$text = preg_replace("#<.+?".">#", "", $text);
2322
2323 $text = str_replace("&quot;", "\"", $text);
2324 $text = str_replace("&#092;", "\\", $text);
2325 $text = str_replace("&#036;", "\$", $text);
2326 $text = str_replace("&#33;", "!", $text);
2327 $text = str_replace("&#39;", "'", $text);
2328 $text = str_replace("&lt;", "<", $text);
2329 $text = str_replace("&gt;", ">", $text);
2330 $text = str_replace("&nbsp;", " ", $text);
2331 $text = str_replace("&#124;", '|', $text);
2332 $text = str_replace("&amp;", "&", $text);
2333
2334 return $text;
2335}
2336
2337function delete_special_symbols($text, $replace = "")
2338{
2339 static $arr = [
2340 "\x1", // спецсимвол для преобразования URL'ов протокола http, https, ftp
2341 "\x2", // спецсимвол для пробела ($iMaxStringLen)
2342 "\x3", // спецсимвол для преобразования URL'ов протокола mailto
2343 "\x4", // спецсимвол заменяющий \n (используется для преобразования <code>)
2344 "\x5", // спецсимвол заменяющий \r (используется для преобразования <code>)
2345 "\x6", // спецсимвол заменяющий пробел (используется для преобразования <code>)
2346 "\x7", // спецсимвол заменяющий табуляцию (используется для преобразования <code>)
2347 "\x8", // спецсимвол заменяющий слэш "\"
2348 ];
2349 return str_replace($arr, $replace, $text);
2350}
2351
2353{
2354 $helper = new CConvertorsPregReplaceHelper("");
2355 return $helper->convertCodeTagForHtmlBefore(stripslashes($text));
2356}
2357
2358function convert_code_tag_for_html_after($text = '', $code_table_class = '', $code_head_class = '', $code_body_class = '', $code_textarea_class = '')
2359{
2360 if ($text == '')
2361 {
2362 return '';
2363 }
2364 $helper = new CConvertorsPregReplaceHelper("");
2365 $helper->setCodeClasses($code_table_class, $code_head_class, $code_body_class, $code_textarea_class);
2366 return $helper->convertCodeTagForHtmlAfter(stripslashes($text));
2367}
2368
2369function convert_open_quote_tag($quote_table_class, $quote_head_class, $quote_body_class)
2370{
2371 global $QUOTE_OPENED;
2372 $QUOTE_OPENED++;
2373 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 . "'>";
2374}
2375
2377{
2378 global $QUOTE_ERROR, $QUOTE_OPENED, $QUOTE_CLOSED;
2379 if ($QUOTE_OPENED == 0)
2380 {
2381 $QUOTE_ERROR++;
2382 return '';
2383 }
2384 $QUOTE_CLOSED++;
2385 return "</td></tr></table>";
2386}
2387
2388function convert_quote_tag($text = '', $quote_table_class = '', $quote_head_class = '', $quote_body_class = '')
2389{
2390 global $QUOTE_ERROR, $QUOTE_OPENED, $QUOTE_CLOSED;
2391 if ($text == '')
2392 {
2393 return '';
2394 }
2395 $text = stripslashes($text);
2396 $helper = new CConvertorsPregReplaceHelper("");
2397 $helper->setQuoteClasses($quote_table_class, $quote_head_class, $quote_body_class);
2398 $txt = $text;
2399 $txt = preg_replace_callback("#\\[quote\\]#i", [$helper, "convertOpenQuoteTag"], $txt);
2400 $txt = preg_replace_callback("#\\[/quote\\]#i", [$helper, "convertCloseQuoteTag"], $txt);
2401 if ($helper->checkQuoteError())
2402 {
2403 return $txt;
2404 }
2405 else
2406 {
2407 return $text;
2408 }
2409}
2410
2411function extract_url($s)
2412{
2413 $s2 = '';
2414 while (mb_strpos(",}])>.", mb_substr($s, -1, 1)) !== false)
2415 {
2416 $s2 = mb_substr($s, -1, 1);
2417 $s = mb_substr($s, 0, mb_strlen($s) - 1);
2418 }
2419 $res = chr(1) . $s . "/" . chr(1) . $s2;
2420 return $res;
2421}
2422
2423function convert_to_href($url, $link_class = "", $event1 = "", $event2 = "", $event3 = "", $script = "", $link_target = "_self")
2424{
2425 $url = stripslashes($url);
2426
2427 $target = $link_target == '_self' ? '' : ' target="' . $link_target . '"';
2428
2429 $s = "<a class=\"" . $link_class . "\" href=\"" . delete_special_symbols($url) . "\"" . $target . ">" . $url . "</a>";
2430
2431 return $s;
2432}
2433
2434// используется как вспомогательная функция для TxtToHTML
2435function convert_to_mailto($s, $link_class = "")
2436{
2437 $s = stripslashes($s);
2438 $s = "<a class=\"" . $link_class . "\" href=\"mailto:" . delete_special_symbols($s) . "\" title=\"" . GetMessage("MAIN_MAILTO") . "\">" . $s . "</a>";
2439 return $s;
2440}
2441
2442function TxtToHTML(
2443 $str, // текст для преобразования
2444 $bMakeUrls = true, // true - преобразовавыть URL в <a href="URL">URL</a>
2445 $iMaxStringLen = 0, // максимальная длина фразы без пробелов или символов перевода каретки
2446 $QUOTE_ENABLED = "N", // Y - преобразовать <QUOTE>...</QUOTE> в рамку цитаты
2447 $NOT_CONVERT_AMPERSAND = "Y", // Y - не преобразовывать символ "&" в "&amp;"
2448 $CODE_ENABLED = "N", // Y - преобразовать <CODE>...</CODE> в readonly textarea
2449 $BIU_ENABLED = "N", // Y - преобразовать <B>...</B> и т.д. в соответствующие HTML тэги
2450 $quote_table_class = "quotetable", // css класс на таблицу цитаты
2451 $quote_head_class = "tdquotehead", // css класс на первую TD таблицы цитаты
2452 $quote_body_class = "tdquote", // css класс на вторую TD таблицы цитаты
2453 $code_table_class = "codetable", // css класс на таблицу кода
2454 $code_head_class = "tdcodehead", // css класс на первую TD таблицы кода
2455 $code_body_class = "tdcodebody", // css класс на вторую TD таблицы кода
2456 $code_textarea_class = "codetextarea", // css класс на textarea в таблице кода
2457 $link_class = "txttohtmllink",// css класс на ссылках
2458 $arUrlEvent = [], // deprecated
2459 $link_target = "_self" // tagret открытия страницы
2460)
2461{
2462 global $QUOTE_ERROR, $QUOTE_OPENED, $QUOTE_CLOSED;
2463 $QUOTE_ERROR = $QUOTE_OPENED = $QUOTE_CLOSED = 0;
2464
2466
2467 // вставим спецсимвол chr(2) там где в дальнейшем необходимо вставить пробел
2468 if ($iMaxStringLen > 0)
2469 {
2470 $str = InsertSpaces($str, $iMaxStringLen, chr(2), true);
2471 }
2472
2473 // \ => chr(8)
2474 $str = str_replace("\\", chr(8), $str); // спецсимвол заменяющий слэш "\"
2475
2476 // <quote>...</quote> => [quote]...[/quote]
2477 if ($QUOTE_ENABLED == "Y")
2478 {
2479 $str = preg_replace("#(?:<|\\[)(/?)quote(.*?)(?:>|\\])#is", " [\\1quote]", $str);
2480 }
2481
2482 // <code>...</code> => [code]...[/code]
2483 // \n => chr(4)
2484 // \r => chr(5)
2485 if ($CODE_ENABLED == "Y")
2486 {
2487 $helper = new CConvertorsPregReplaceHelper("");
2488 $str = preg_replace("#<code(\\s+[^>]*>|>)(.+?)</code(\\s+[^>]*>|>)#is", "[code]\\2[/code]", $str);
2489 $str = preg_replace_callback("#\\[code(\\s+[^\\]]*\\]|\\])(.+?)\\[/code(\\s+[^\\]]*\\]|\\])#is", [$helper, "convertCodeTagForHtmlBefore"], $str);
2490 }
2491
2492 // <b>...</b> => [b]...[/b]
2493 // <i>...</i> => [i]...[/i]
2494 // <u>...</u> => [u]...[/u]
2495 if ($BIU_ENABLED == "Y")
2496 {
2497 $str = preg_replace("#<b(\\s+[^>]*>|>)(.+?)</b(\\s+[^>]*>|>)#is", "[b]\\2[/b]", $str);
2498 $str = preg_replace("#<i(\\s+[^>]*>|>)(.+?)</i(\\s+[^>]*>|>)#is", "[i]\\2[/i]", $str);
2499 $str = preg_replace("#<u(\\s+[^>]*>|>)(.+?)</u(\\s+[^>]*>|>)#is", "[u]\\2[/u]", $str);
2500 }
2501
2502 // URL => chr(1).URL."/".chr(1)
2503 // EMail => chr(3).E-Mail.chr(3)
2504 if ($bMakeUrls)
2505 {
2506 //hide @ from next regexp with chr(11)
2507 $str = preg_replace_callback("#((http|https|ftp):\\/\\/[a-z:@,.'/\\#\\%=~\\&?*+\\[\\]_0-9\x01-\x08-]+)#is", ["CConvertorsPregReplaceHelper", "extractUrl"], $str);
2508 $str = preg_replace("#(([=_\\.'0-9a-z+~\x01-\x08-]+)@[_0-9a-z\x01-\x08-.]+\\.[a-z]{2,10})#is", chr(3) . "\\1" . chr(3), $str);
2509 //replace back to @
2510 $str = str_replace(chr(11), '@', $str);
2511 }
2512
2513 // конвертация критичных символов
2514 if ($NOT_CONVERT_AMPERSAND != "Y")
2515 {
2516 $str = str_replace("&", "&amp;", $str);
2517 }
2518 static $search = ["<", ">", "\"", "'", "%", ")", "(", "+"];
2519 static $replace = ["&lt;", "&gt;", "&quot;", "&#39;", "&#37;", "&#41;", "&#40;", "&#43;"];
2520 $str = str_replace($search, $replace, $str);
2521
2522 // chr(1).URL."/".chr(1) => <a href="URL">URL</a>
2523 // chr(3).E-Mail.chr(3) => <a href="mailto:E-Mail">E-Mail</a>
2524 if ($bMakeUrls)
2525 {
2526 $helper = new CConvertorsPregReplaceHelper("");
2527 $helper->setLinkClass($link_class);
2528 $helper->setLinkTarget($link_target);
2529
2530 $str = preg_replace_callback("#\x01([^\n\x01]+?)/\x01#is", [$helper, "convertToHref"], $str);
2531 $str = preg_replace_callback("#\x03([^\n\x03]+?)\x03#is", [$helper, "convertToMailTo"], $str);
2532 }
2533
2534 $str = str_replace("\r\n", "\n", $str);
2535 $str = str_replace("\n", "<br />\n", $str);
2536 $str = preg_replace("# {2}#", "&nbsp;&nbsp;", $str);
2537 $str = preg_replace("#\t#", "&nbsp;&nbsp;&nbsp;&nbsp;", $str);
2538
2539 // chr(2) => " "
2540 if ($iMaxStringLen > 0)
2541 {
2542 $str = str_replace(chr(2), "<wbr>", $str);
2543 }
2544
2545 // [quote]...[/quote] => <table>...</table>
2546 if ($QUOTE_ENABLED == "Y")
2547 {
2548 $helper = new CConvertorsPregReplaceHelper("");
2549 $helper->setQuoteClasses($quote_table_class, $quote_head_class, $quote_body_class);
2550 $str = preg_replace_callback("#(\\[quote(.*?)\\](.*)\\[/quote(.*?)\\])#is", [$helper, "convertQuoteTag"], $str);
2551 }
2552
2553 // [code]...[/code] => <textarea>...</textarea>
2554 // chr(4) => \n
2555 // chr(5) => \r
2556 if ($CODE_ENABLED == "Y")
2557 {
2558 $helper = new CConvertorsPregReplaceHelper("");
2559 $helper->setCodeClasses($code_table_class, $code_head_class, $code_body_class, $code_textarea_class);
2560 $str = preg_replace_callback("#\\[code\\](.*?)\\[/code\\]#is", [$helper, "convertCodeTagForHtmlAfter"], $str);
2561 $str = str_replace(chr(4), "\n", $str);
2562 $str = str_replace(chr(5), "\r", $str);
2563 $str = str_replace(chr(6), " ", $str);
2564 $str = str_replace(chr(7), "\t", $str);
2565 $str = str_replace(chr(16), "[", $str);
2566 $str = str_replace(chr(17), "]", $str);
2567 }
2568
2569 // [b]...[/b] => <b>...</b>
2570 // [i]...[/i] => <i>...</i>
2571 // [u]...[/u] => <u>...</u>
2572 if ($BIU_ENABLED == "Y")
2573 {
2574 $str = preg_replace("#\\[b\\](.*?)\\[/b\\]#is", "<b>\\1</b>", $str);
2575 $str = preg_replace("#\\[i\\](.*?)\\[/i\\]#is", "<i>\\1</i>", $str);
2576 $str = preg_replace("#\\[u\\](.*?)\\[/u\\]#is", "<u>\\1</u>", $str);
2577 }
2578
2579 // chr(8) => \
2580 $str = str_replace(chr(8), "\\", $str);
2581
2583
2584 return $str;
2585}
2586
2587function HTMLToTxt($str, $strSiteUrl = "", $aDelete = [], $maxlen = 70)
2588{
2589 //get rid of whitespace
2590 $str = preg_replace("/[\\t\\n\\r]/", " ", $str);
2591
2592 //replace tags with placeholders
2593 static $search = [
2594 "'<script[^>]*?>.*?</script>'si",
2595 "'<style[^>]*?>.*?</style>'si",
2596 "'<svg[^>]*?>.*?</svg>'si",
2597 "'<select[^>]*?>.*?</select>'si",
2598 "'&(quot|#34);'i",
2599 "'&(iexcl|#161);'i",
2600 "'&(cent|#162);'i",
2601 "'&(copy|#169);'i",
2602 ];
2603
2604 static $replace = [
2605 "",
2606 "",
2607 "",
2608 "",
2609 "\"",
2610 "!",
2611 "c",
2612 "(c)",
2613 ];
2614
2615 $str = preg_replace($search, $replace, $str);
2616
2617 $str = preg_replace("#<[/]{0,1}(b|i|u|em|small|strong)>#i", "", $str);
2618 $str = preg_replace("#<div[^>]*>#i", "\r\n", $str);
2619 $str = preg_replace("#<[/]{0,1}(font|div|span)[^>]*>#i", "", $str);
2620
2621 //replace lists
2622 $str = preg_replace("#<ul[^>]*>#i", "\r\n", $str);
2623 $str = preg_replace("#<li[^>]*>#i", "\r\n - ", $str);
2624
2625 //delete by function parameter
2626 foreach ($aDelete as $del_reg)
2627 {
2628 $str = preg_replace($del_reg, "", $str);
2629 }
2630
2631 //replace images
2632 $str = preg_replace("/(<img\\s[^>]*?src\\s*=\\s*)([\"']?)(\\/.*?)(\\2)(\\s.+?>|\\s*>)/is", "[" . chr(1) . $strSiteUrl . "\\3" . chr(1) . "] ", $str);
2633 $str = preg_replace("/(<img\\s[^>]*?src\\s*=\\s*)([\"']?)(.*?)(\\2)(\\s.+?>|\\s*>)/is", "[" . chr(1) . "\\3" . chr(1) . "] ", $str);
2634
2635 //replace links
2636 $str = preg_replace("/(<a\\s[^>]*?href\\s*=\\s*)([\"']?)(\\/.*?)(\\2)(.*?>)(.*?)<\\/a>/is", "\\6 [" . chr(1) . $strSiteUrl . "\\3" . chr(1) . "] ", $str);
2637 $str = preg_replace("/(<a\\s[^>]*?href\\s*=\\s*)([\"']?)(.*?)(\\2)(.*?>)(.*?)<\\/a>/is", "\\6 [" . chr(1) . "\\3" . chr(1) . "] ", $str);
2638
2639 //replace <br>
2640 $str = preg_replace("#<br[^>]*>#i", "\r\n", $str);
2641
2642 //replace <p>
2643 $str = preg_replace("#<p[^>]*>#i", "\r\n\r\n", $str);
2644
2645 //replace <hr>
2646 $str = preg_replace("#<hr[^>]*>#i", "\r\n----------------------\r\n", $str);
2647
2648 //replace tables
2649 $str = preg_replace("#<[/]{0,1}(thead|tbody)[^>]*>#i", "", $str);
2650 $str = preg_replace("#<([/]{0,1})th[^>]*>#i", "<\\1td>", $str);
2651
2652 $str = preg_replace("#</td>#i", "\t", $str);
2653 $str = preg_replace("#</tr>#i", "\r\n", $str);
2654 $str = preg_replace("#<table[^>]*>#i", "\r\n", $str);
2655
2656 $str = preg_replace("#\r\n[ ]+#", "\r\n", $str);
2657
2658 //remove all tags
2659 $str = preg_replace("#<[/]{0,1}[^>]+>#i", "", $str);
2660
2661 $str = preg_replace("#[ ]+ #", " ", $str);
2662 $str = str_replace("\t", " ", $str);
2663
2664 //wrap long lines
2665 if ($maxlen > 0)
2666 {
2667 $str = preg_replace("#(^|[\\r\\n])([^\\n\\r]{" . intval($maxlen) . "}[^ \\r\\n]*[\\] ])([^\\r])#", "\\1\\2\r\n\\3", $str);
2668 }
2669
2670 $str = str_replace(chr(1), " ", $str);
2671
2672 return trim($str);
2673}
2674
2675function FormatText($strText, $strTextType = "text")
2676{
2677 if (strtolower($strTextType) == "html")
2678 {
2679 return $strText;
2680 }
2681
2682 return TxtToHtml($strText);
2683}
2684
2686{
2687 static $search = ["&amp;", "&lt;", "&gt;", "&quot;", "&#34;", "&#x22;", "&#39;", "&#x27;", "<", ">", "\""];
2688 static $replace = ["&amp;amp;", "&amp;lt;", "&amp;gt;", "&amp;quot;", "&amp;#34;", "&amp;#x22;", "&amp;#39;", "&amp;#x27;", "&lt;", "&gt;", "&quot;"];
2689
2690 return Text\StringHelper::str_replace($search, $replace, $str);
2691}
2692
2694{
2695 static $search = ["&lt;", "&gt;", "&quot;", "&apos;", "&amp;"];
2696 static $replace = ["<", ">", "\"", "'", "&"];
2697
2698 return Text\StringHelper::str_replace($search, $replace, $str);
2699}
2700
2701function htmlspecialcharsbx($string, $flags = ENT_COMPAT, $doubleEncode = true)
2702{
2703 //function for php 5.4 where default encoding is UTF-8
2704 return htmlspecialchars((string)$string, $flags, "UTF-8", $doubleEncode);
2705}
2706
2708{
2709 //remove file name
2710 if (!str_ends_with($path, "/"))
2711 {
2712 $p = mb_strrpos($path, "/");
2713 $path = mb_substr($path, 0, $p);
2714 }
2715
2716 $path = rtrim($path, "/");
2717
2718 if ($path == "")
2719 {
2720 //current folder always exists
2721 return true;
2722 }
2723
2724 if (!file_exists($path))
2725 {
2726 return mkdir($path, BX_DIR_PERMISSIONS, true);
2727 }
2728
2729 return is_dir($path);
2730}
2731
2732function CopyDirFiles($path_from, $path_to, $ReWrite = true, $Recursive = false, $bDeleteAfterCopy = false, $strExclude = "")
2733{
2734 if (mb_strpos($path_to . "/", $path_from . "/") === 0 || realpath($path_to) === realpath($path_from))
2735 {
2736 return false;
2737 }
2738
2739 if (is_dir($path_from))
2740 {
2741 CheckDirPath($path_to . "/");
2742 }
2743 elseif (is_file($path_from))
2744 {
2745 $p = bxstrrpos($path_to, "/");
2746 $path_to_dir = mb_substr($path_to, 0, $p);
2747 CheckDirPath($path_to_dir . "/");
2748
2749 if (file_exists($path_to) && !$ReWrite)
2750 {
2751 return false;
2752 }
2753
2754 @copy($path_from, $path_to);
2755 if (is_file($path_to))
2756 {
2757 @chmod($path_to, BX_FILE_PERMISSIONS);
2758 }
2759
2760 if ($bDeleteAfterCopy)
2761 {
2762 @unlink($path_from);
2763 }
2764
2765 return true;
2766 }
2767 else
2768 {
2769 return true;
2770 }
2771
2772 if ($handle = @opendir($path_from))
2773 {
2774 while (($file = readdir($handle)) !== false)
2775 {
2776 if ($file == "." || $file == "..")
2777 {
2778 continue;
2779 }
2780
2781 if ($strExclude <> '' && str_starts_with($file, $strExclude))
2782 {
2783 continue;
2784 }
2785
2786 if (is_dir($path_from . "/" . $file) && $Recursive)
2787 {
2788 CopyDirFiles($path_from . "/" . $file, $path_to . "/" . $file, $ReWrite, $Recursive, $bDeleteAfterCopy, $strExclude);
2789 if ($bDeleteAfterCopy)
2790 {
2791 @rmdir($path_from . "/" . $file);
2792 }
2793 }
2794 elseif (is_file($path_from . "/" . $file))
2795 {
2796 if (file_exists($path_to . "/" . $file) && !$ReWrite)
2797 {
2798 continue;
2799 }
2800
2801 @copy($path_from . "/" . $file, $path_to . "/" . $file);
2802 @chmod($path_to . "/" . $file, BX_FILE_PERMISSIONS);
2803
2804 if ($bDeleteAfterCopy)
2805 {
2806 @unlink($path_from . "/" . $file);
2807 }
2808 }
2809 }
2810 @closedir($handle);
2811
2812 if ($bDeleteAfterCopy)
2813 {
2814 @rmdir($path_from);
2815 }
2816
2817 return true;
2818 }
2819
2820 return false;
2821}
2822
2823function DeleteDirFilesEx($path, $root = null)
2824{
2825 if ($path == '' || $path == '/')
2826 {
2827 return false;
2828 }
2829
2830 if ($root === null)
2831 {
2832 $root = $_SERVER["DOCUMENT_ROOT"];
2833 }
2834
2835 $full_path = $root . "/" . $path;
2836 $full_path = preg_replace("#[\\\\\\/]+#", "/", $full_path);
2837
2838 $f = true;
2839 if (is_file($full_path) || is_link($full_path))
2840 {
2841 if (@unlink($full_path))
2842 {
2843 return true;
2844 }
2845 return false;
2846 }
2847 elseif (is_dir($full_path))
2848 {
2849 if ($handle = opendir($full_path))
2850 {
2851 while (($file = readdir($handle)) !== false)
2852 {
2853 if ($file == "." || $file == "..")
2854 {
2855 continue;
2856 }
2857
2858 if (!DeleteDirFilesEx($path . "/" . $file, $root))
2859 {
2860 $f = false;
2861 }
2862 }
2863 closedir($handle);
2864 }
2865 if (!@rmdir($full_path))
2866 {
2867 return false;
2868 }
2869 return $f;
2870 }
2871 return false;
2872}
2873
2874function DeleteDirFiles($frDir, $toDir, $arExept = [])
2875{
2876 if (is_dir($frDir))
2877 {
2878 $d = dir($frDir);
2879 while ($entry = $d->read())
2880 {
2881 if ($entry == "." || $entry == "..")
2882 {
2883 continue;
2884 }
2885 if (in_array($entry, $arExept))
2886 {
2887 continue;
2888 }
2889 @unlink($toDir . "/" . $entry);
2890 }
2891 $d->close();
2892 }
2893}
2894
2895function RewriteFile($abs_path, $strContent)
2896{
2898 if (file_exists($abs_path) && !is_writable($abs_path))
2899 {
2900 @chmod($abs_path, BX_FILE_PERMISSIONS);
2901 }
2902 $fd = fopen($abs_path, "wb");
2903 if (!fwrite($fd, $strContent))
2904 {
2905 return false;
2906 }
2907 @chmod($abs_path, BX_FILE_PERMISSIONS);
2908 fclose($fd);
2909 return true;
2910}
2911
2913{
2914 static $FILEMAN_SCRIPT_EXT = false;
2915 if ($FILEMAN_SCRIPT_EXT !== false)
2916 {
2917 return $FILEMAN_SCRIPT_EXT;
2918 }
2919
2920 $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");
2921 $arScriptFiles = [];
2922 foreach (explode(",", mb_strtolower($script_files)) as $ext)
2923 {
2924 if (($e = trim($ext)) != "")
2925 {
2926 $arScriptFiles[] = $e;
2927 }
2928 }
2929
2930 $FILEMAN_SCRIPT_EXT = $arScriptFiles;
2931 return $arScriptFiles;
2932}
2933
2935{
2936 return rtrim($path, "\0.\\/+ ");
2937}
2938
2939function RemoveScriptExtension($check_name)
2940{
2941 $arExt = GetScriptFileExt();
2942
2943 $name = GetFileName($check_name);
2944 $arParts = explode(".", $name);
2945 foreach ($arParts as $i => $part)
2946 {
2947 if ($i > 0 && in_array(mb_strtolower(TrimUnsafe($part)), $arExt))
2948 {
2949 unset($arParts[$i]);
2950 }
2951 }
2952 $path = mb_substr(TrimUnsafe($check_name), 0, -mb_strlen($name));
2953 return $path . implode(".", $arParts);
2954}
2955
2956function HasScriptExtension($check_name)
2957{
2958 $arExt = GetScriptFileExt();
2959
2960 $check_name = GetFileName($check_name);
2961 $arParts = explode(".", $check_name);
2962 foreach ($arParts as $i => $part)
2963 {
2964 if ($i > 0 && in_array(mb_strtolower(TrimUnsafe($part)), $arExt))
2965 {
2966 return true;
2967 }
2968 }
2969 return false;
2970}
2971
2973{
2975 if ($path <> '')
2976 {
2977 $pos = bxstrrpos($path, '.');
2978 if ($pos !== false)
2979 {
2980 return mb_substr($path, $pos + 1);
2981 }
2982 }
2983 return '';
2984}
2985
2987{
2989 if ($path <> '')
2990 {
2991 $pos = bxstrrpos($path, '.');
2992 if ($pos !== false)
2993 {
2994 $path = mb_substr($path, 0, $pos);
2995 }
2996 return trim($path, '.');
2997 }
2998 return '';
2999}
3000
3002{
3004 $path = str_replace("\\", "/", $path);
3005 $path = rtrim($path, "/");
3006
3007 $p = bxstrrpos($path, "/");
3008 if ($p !== false)
3009 {
3010 return mb_substr($path, $p + 1);
3011 }
3012
3013 return $path;
3014}
3015
3017{
3018 static $arFiles = false;
3019 if ($arFiles === false)
3020 {
3021 $fileList = COption::GetOptionString("main", "~unsafe_files", ".htaccess,.htpasswd,web.config,global.asax");
3022 $arFiles = explode(",", mb_strtolower($fileList));
3023 }
3025 return in_array(mb_strtolower(TrimUnsafe($name)), $arFiles);
3026}
3027
3028function IsConfigFile(string $path): bool
3029{
3031
3032 static $list = [
3033 "/bitrix/.settings.php",
3034 "/.access.php",
3035 ];
3036
3037 foreach ($list as $file)
3038 {
3039 if (str_ends_with($path, $file))
3040 {
3041 return true;
3042 }
3043 }
3044 return false;
3045}
3046
3048{
3049 $extension = GetFileExtension(mb_strtolower($path));
3050 switch ($extension)
3051 {
3052 case "jpg":
3053 case "jpeg":
3054 case "gif":
3055 case "bmp":
3056 case "png":
3057 $type = "IMAGE";
3058 break;
3059 case "swf":
3060 $type = "FLASH";
3061 break;
3062 case "html":
3063 case "htm":
3064 case "asp":
3065 case "aspx":
3066 case "phtml":
3067 case "php":
3068 case "php3":
3069 case "php4":
3070 case "php5":
3071 case "php6":
3072 case "shtml":
3073 case "sql":
3074 case "txt":
3075 case "inc":
3076 case "js":
3077 case "vbs":
3078 case "tpl":
3079 case "css":
3080 case "shtm":
3081 $type = "SOURCE";
3082 break;
3083 default:
3084 $type = "UNKNOWN";
3085 }
3086 return $type;
3087}
3088
3089function GetDirectoryIndex($path, $strDirIndex = false)
3090{
3091 return GetDirIndex($path, $strDirIndex);
3092}
3093
3094function GetDirIndex($path, $strDirIndex = false)
3095{
3096 $doc_root = ($_SERVER["DOCUMENT_ROOT"] <> '' ? $_SERVER["DOCUMENT_ROOT"] : $GLOBALS["DOCUMENT_ROOT"]);
3098 $arrDirIndex = GetDirIndexArray($strDirIndex);
3099 if (is_array($arrDirIndex) && !empty($arrDirIndex))
3100 {
3101 foreach ($arrDirIndex as $page_index)
3102 {
3103 if (file_exists($doc_root . $dir . $page_index))
3104 {
3105 return $page_index;
3106 }
3107 }
3108 }
3109 return "index.php";
3110}
3111
3112function GetDirIndexArray($strDirIndex = false)
3113{
3114 static $arDefault = ["index.php", "index.html", "index.htm", "index.phtml", "default.html", "index.php3"];
3115
3116 if ($strDirIndex === false && !defined("DIRECTORY_INDEX"))
3117 {
3118 return $arDefault;
3119 }
3120
3121 if ($strDirIndex === false && defined("DIRECTORY_INDEX"))
3122 {
3123 $strDirIndex = DIRECTORY_INDEX;
3124 }
3125
3126 $arrRes = [];
3127 $arr = explode(" ", $strDirIndex);
3128 foreach ($arr as $page_index)
3129 {
3130 $page_index = trim($page_index);
3131 if ($page_index <> '')
3132 {
3133 $arrRes[] = $page_index;
3134 }
3135 }
3136 return $arrRes;
3137}
3138
3139function GetPagePath($page = false, $get_index_page = null)
3140{
3141 if (null === $get_index_page)
3142 {
3143 if (defined('BX_DISABLE_INDEX_PAGE'))
3144 {
3145 $get_index_page = !BX_DISABLE_INDEX_PAGE;
3146 }
3147 else
3148 {
3149 $get_index_page = true;
3150 }
3151 }
3152
3153 if ($page === false && !empty($_SERVER["REQUEST_URI"]))
3154 {
3155 $page = $_SERVER["REQUEST_URI"];
3156 }
3157 if ($page === false)
3158 {
3159 $page = $_SERVER["SCRIPT_NAME"];
3160 }
3161
3162 $sPath = $page;
3163
3164 static $terminate = ["?", "#"];
3165 foreach ($terminate as $term)
3166 {
3167 if (($found = mb_strpos($sPath, $term)) !== false)
3168 {
3169 $sPath = mb_substr($sPath, 0, $found);
3170 }
3171 }
3172
3173 //nginx fix
3174 $sPath = preg_replace("/%+[0-9a-f]{0,1}$/i", "", $sPath);
3175
3176 $sPath = urldecode($sPath);
3177
3178 if (mb_substr($sPath, -1, 1) == "/" && $get_index_page)
3179 {
3180 $sPath .= GetDirectoryIndex($sPath);
3181 }
3182
3183 $sPath = Rel2Abs("/", $sPath);
3184
3185 static $aSearch = ["<", ">", "\"", "'", "%", "\r", "\n", "\t", "\\"];
3186 static $aReplace = ["&lt;", "&gt;", "&quot;", "&#039;", "%25", "%0d", "%0a", "%09", "%5C"];
3187 $sPath = str_replace($aSearch, $aReplace, $sPath);
3188
3189 return $sPath;
3190}
3191
3193{
3194 $uriPath = "/" . ltrim($_SERVER["REQUEST_URI"] ?? '', "/");
3195 if (($index = mb_strpos($uriPath, "?")) !== false)
3196 {
3197 $uriPath = mb_substr($uriPath, 0, $index);
3198 }
3199
3200 if (defined("BX_DISABLE_INDEX_PAGE") && BX_DISABLE_INDEX_PAGE === true)
3201 {
3202 if (str_ends_with($uriPath, "/index.php"))
3203 {
3204 $uriPath = substr($uriPath, 0, -9);
3205 }
3206 }
3207
3208 $queryString = DeleteParam(["bxrand"]);
3209 if ($queryString != "")
3210 {
3211 $uriPath = $uriPath . "?" . $queryString;
3212 }
3213
3214 return $uriPath;
3215}
3216
3217//light version of GetPagePath() for menu links
3218function GetFileFromURL($page, $get_index_page = null)
3219{
3220 if (null === $get_index_page)
3221 {
3222 if (defined('BX_DISABLE_INDEX_PAGE'))
3223 {
3224 $get_index_page = !BX_DISABLE_INDEX_PAGE;
3225 }
3226 else
3227 {
3228 $get_index_page = true;
3229 }
3230 }
3231
3232 $found = mb_strpos($page, "?");
3233 $sPath = ($found !== false ? mb_substr($page, 0, $found) : $page);
3234
3235 $sPath = urldecode($sPath);
3236
3237 if (mb_substr($sPath, -1, 1) == "/" && $get_index_page)
3238 {
3239 $sPath .= GetDirectoryIndex($sPath);
3240 }
3241
3242 return $sPath;
3243}
3244
3245function GetDirPath($sPath)
3246{
3247 if ($sPath <> '')
3248 {
3249 $p = mb_strrpos($sPath, "/");
3250 if ($p === false)
3251 {
3252 return '/';
3253 }
3254 else
3255 {
3256 return mb_substr($sPath, 0, $p + 1);
3257 }
3258 }
3259 else
3260 {
3261 return '/';
3262 }
3263}
3264
3265/*
3266This function emulates php internal function basename
3267but does not behave badly on broken locale settings
3268*/
3269function bx_basename($path, $ext = "")
3270{
3271 $path = rtrim($path, "\\/");
3272 if (preg_match("#[^\\\\/]+$#", $path, $match))
3273 {
3274 $path = $match[0];
3275 }
3276
3277 if ($ext)
3278 {
3279 $ext_len = mb_strlen($ext);
3280 if (mb_strlen($path) > $ext_len && mb_substr($path, -$ext_len) == $ext)
3281 {
3282 $path = mb_substr($path, 0, -$ext_len);
3283 }
3284 }
3285
3286 return $path;
3287}
3288
3292function bxstrrpos($haystack, $needle)
3293{
3294 return Text\UtfSafeString::getLastPosition($haystack, $needle);
3295}
3296
3297function Rel2Abs($curdir, $relpath)
3298{
3299 if ($relpath == "")
3300 {
3301 return false;
3302 }
3303
3304 if (str_starts_with($relpath, "/") || preg_match("#^[a-z]:/#i", $relpath))
3305 {
3306 $res = $relpath;
3307 }
3308 else
3309 {
3310 if (!str_starts_with($curdir, "/") && !preg_match("#^[a-z]:/#i", $curdir))
3311 {
3312 $curdir = "/" . $curdir;
3313 }
3314 if (!str_ends_with($curdir, "/"))
3315 {
3316 $curdir .= "/";
3317 }
3318 $res = $curdir . $relpath;
3319 }
3320
3321 if ((mb_strpos($res, "\0")) !== false)
3322 {
3324 }
3325
3327
3328 if (!str_starts_with($res, "/") && !preg_match("#^[a-z]:/#i", $res))
3329 {
3330 $res = "/" . $res;
3331 }
3332
3333 $res = rtrim($res, ".\\+ ");
3334
3335 return $res;
3336}
3337
3341function _normalizePath($strPath)
3342{
3343 $strResult = '';
3344 if ($strPath <> '')
3345 {
3346 if (strncasecmp(PHP_OS, "WIN", 3) == 0)
3347 {
3348 //slashes doesn't matter for Windows
3349 $strPath = str_replace("\\", "/", $strPath);
3350 }
3351
3352 $arPath = explode('/', $strPath);
3353 $nPath = count($arPath);
3354 $pathStack = [];
3355
3356 for ($i = 0; $i < $nPath; $i++)
3357 {
3358 if ($arPath[$i] === ".")
3359 {
3360 continue;
3361 }
3362 if (($arPath[$i] === '') && ($i !== ($nPath - 1)) && ($i !== 0))
3363 {
3364 continue;
3365 }
3366
3367 if ($arPath[$i] === "..")
3368 {
3369 array_pop($pathStack);
3370 }
3371 else
3372 {
3373 array_push($pathStack, $arPath[$i]);
3374 }
3375 }
3376
3377 $strResult = implode("/", $pathStack);
3378 }
3379 return $strResult;
3380}
3381
3383{
3384 if (mb_substr($path, 0, mb_strlen($_SERVER["DOCUMENT_ROOT"])) == $_SERVER["DOCUMENT_ROOT"])
3385 {
3386 return "/" . ltrim(mb_substr($path, mb_strlen($_SERVER["DOCUMENT_ROOT"])), "/");
3387 }
3388
3389 return $path;
3390}
3391
3392function GetMessageJS($name, $aReplace = false)
3393{
3394 return CUtil::JSEscape(GetMessage($name, $aReplace));
3395}
3396
3397function GetMessage($name, $aReplace = null)
3398{
3399 global $MESS;
3400 if (isset($MESS[$name]))
3401 {
3402 $s = $MESS[$name];
3403
3404 if (is_array($aReplace))
3405 {
3406 $s = strtr($s, $aReplace);
3407 }
3408
3409 return $s;
3410 }
3411
3412 return Main\Localization\Loc::getMessage($name, $aReplace);
3413}
3414
3419{
3420 global $MESS;
3421 return isset($MESS[$name]);
3422}
3423
3425$ALL_LANG_FILES = [];
3426
3428function GetLangFileName($before, $after, $lang = false)
3429{
3430 if ($lang === false)
3431 {
3432 $lang = LANGUAGE_ID;
3433 }
3434
3435 global $ALL_LANG_FILES;
3436 $ALL_LANG_FILES[] = $before . $lang . $after;
3437
3438 if (Main\Localization\Translation::allowConvertEncoding())
3439 {
3441 if (file_exists($langFile))
3442 {
3443 return $langFile;
3444 }
3445 }
3446
3447 if (file_exists($before . $lang . $after))
3448 {
3449 return $before . $lang . $after;
3450 }
3451 if (file_exists($before . "en" . $after))
3452 {
3453 return $before . "en" . $after;
3454 }
3455
3456 if (!str_contains($before, "/bitrix/modules/"))
3457 {
3458 return $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/lang/en/tools.php";
3459 }
3460
3461 $old_path = rtrim($before, "/");
3462 $old_path = mb_substr($old_path, mb_strlen($_SERVER["DOCUMENT_ROOT"]));
3463 $path = mb_substr($old_path, 16);
3464 $module = mb_substr($path, 0, mb_strpos($path, "/"));
3465 $path = mb_substr($path, mb_strpos($path, "/"));
3466 if (str_ends_with($path, "/lang"))
3467 {
3468 $path = substr($path, 0, -5);
3469 }
3470 IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/" . $module . $path . $after, $lang);
3471 return $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/" . $module . "/lang/" . $lang . $path . $after;
3472}
3473
3477function __IncludeLang($path, $bReturnArray = false, $bFileChecked = false)
3478{
3479 global $ALL_LANG_FILES;
3481
3482 if (Main\Localization\Translation::allowConvertEncoding())
3483 {
3484 // extract language from path
3485 $language = '';
3486 $arr = explode('/', $path);
3487 $langKey = array_search('lang', $arr);
3488 if ($langKey !== false && isset($arr[$langKey + 1]))
3489 {
3490 $language = $arr[$langKey + 1];
3491 }
3492
3493 static $encodingCache = [];
3494 if (isset($encodingCache[$language]))
3495 {
3496 [$convertEncoding, $targetEncoding, $sourceEncoding] = $encodingCache[$language];
3497 }
3498 else
3499 {
3500 $convertEncoding = Main\Localization\Translation::needConvertEncoding($language);
3501 $targetEncoding = $sourceEncoding = '';
3502 if ($convertEncoding)
3503 {
3505 $sourceEncoding = Main\Localization\Translation::getSourceEncoding($language);
3506 }
3507
3508 $encodingCache[$language] = [$convertEncoding, $targetEncoding, $sourceEncoding];
3509 }
3510
3511 $MESS = [];
3512 if ($bFileChecked)
3513 {
3514 include($path);
3515 }
3516 else
3517 {
3519 if (file_exists($path))
3520 {
3521 include($path);
3522 }
3523 }
3524
3525 if (!empty($MESS))
3526 {
3527 if ($convertEncoding)
3528 {
3530 }
3531
3532 foreach ($MESS as $key => $val)
3533 {
3534 if ($convertEncoding)
3535 {
3536 if ($targetEncoding !== 'utf-8' || !preg_match('//u', $val))
3537 {
3538 $val = Main\Text\Encoding::convertEncoding($val, $sourceEncoding, $targetEncoding);
3539 }
3540 }
3541
3542 $MESS[$key] = $val;
3543
3544 if (!$bReturnArray)
3545 {
3546 $GLOBALS['MESS'][$key] = $val;
3547 }
3548 }
3549 }
3550 }
3551 else
3552 {
3553 if ($bReturnArray)
3554 {
3555 $MESS = [];
3556 }
3557 else
3558 {
3559 global $MESS;
3560 }
3561
3562 if ($bFileChecked)
3563 {
3564 include($path);
3565 }
3566 else
3567 {
3569 if (file_exists($path))
3570 {
3571 include($path);
3572 }
3573 }
3574 }
3575
3576 //read messages from user lang file
3577 static $bFirstCall = true;
3578 if ($bFirstCall)
3579 {
3580 $bFirstCall = false;
3581 $fname = getLocalPath("php_interface/user_lang/" . LANGUAGE_ID . "/lang.php");
3582 if ($fname !== false)
3583 {
3584 $arMess = __IncludeLang($_SERVER["DOCUMENT_ROOT"] . $fname, true, true);
3585 foreach ($arMess as $key => $val)
3586 {
3587 $GLOBALS["MESS"][str_replace("\\", "/", realpath($_SERVER["DOCUMENT_ROOT"] . $key))] = $val;
3588 }
3589 }
3590 }
3591
3592 //redefine messages from user lang file
3593 $path = str_replace("\\", "/", realpath($path));
3594 if (isset($GLOBALS["MESS"][$path]) && is_array($GLOBALS["MESS"][$path]))
3595 {
3596 foreach ($GLOBALS["MESS"][$path] as $key => $val)
3597 {
3598 $MESS[$key] = $val;
3599 }
3600 }
3601
3602 if ($bReturnArray)
3603 {
3604 return $MESS;
3605 }
3606 else
3607 {
3608 return true;
3609 }
3610}
3611
3615function IncludeTemplateLangFile($filepath, $lang = false)
3616{
3617 $filepath = rtrim(preg_replace("'[\\\\/]+'", "/", $filepath), "/ ");
3618 $module_path = "/bitrix/modules/";
3619 $module_name = $templ_path = $file_name = $template_name = "";
3620
3621 $dirs = [
3622 "/local/templates/",
3623 BX_PERSONAL_ROOT . "/templates/",
3624 ];
3625 foreach ($dirs as $dir)
3626 {
3627 if (str_contains($filepath, $dir))
3628 {
3629 $templ_path = $dir;
3630 $templ_pos = mb_strlen($filepath) - mb_strpos(strrev($filepath), strrev($templ_path));
3631 $rel_path = mb_substr($filepath, $templ_pos);
3632 $p = mb_strpos($rel_path, "/");
3633 if (!$p)
3634 {
3635 return null;
3636 }
3637 $template_name = mb_substr($rel_path, 0, $p);
3638 $file_name = mb_substr($rel_path, $p + 1);
3639 $p = mb_strpos($file_name, "/");
3640 if ($p > 0)
3641 {
3642 $module_name = mb_substr($file_name, 0, $p);
3643 }
3644 break;
3645 }
3646 }
3647 if ($templ_path == "")
3648 {
3649 if (str_contains($filepath, $module_path))
3650 {
3651 $templ_pos = mb_strlen($filepath) - mb_strpos(strrev($filepath), strrev($module_path));
3652 $rel_path = mb_substr($filepath, $templ_pos);
3653 $p = mb_strpos($rel_path, "/");
3654 if (!$p)
3655 {
3656 return null;
3657 }
3658 $module_name = mb_substr($rel_path, 0, $p);
3659 if (defined("SITE_TEMPLATE_ID"))
3660 {
3661 $template_name = SITE_TEMPLATE_ID;
3662 }
3663 else
3664 {
3665 $template_name = ".default";
3666 }
3667 $file_name = mb_substr($rel_path, $p + mb_strlen("/install/templates/"));
3668 }
3669 else
3670 {
3671 return false;
3672 }
3673 }
3674
3675 $BX_DOC_ROOT = rtrim(preg_replace("'[\\\\/]+'", "/", $_SERVER["DOCUMENT_ROOT"]), "/ ");
3676 $module_path = $BX_DOC_ROOT . $module_path;
3677
3678 if ($lang === false)
3679 {
3680 $lang = LANGUAGE_ID;
3681 }
3682
3683 $subst_lang = LangSubst($lang);
3684
3685 if ((str_ends_with($file_name, ".description.php")) && $module_name != "")
3686 {
3687 if ($subst_lang <> $lang)
3688 {
3689 $fname = $module_path . $module_name . "/install/templates/lang/" . $subst_lang . "/" . $file_name;
3690 $fname = Main\Localization\Translation::convertLangPath($fname, $subst_lang);
3691 if (file_exists($fname))
3692 {
3693 __IncludeLang($fname, false, true);
3694 }
3695 }
3696
3697 $fname = $module_path . $module_name . "/install/templates/lang/" . $lang . "/" . $file_name;
3699 if (file_exists($fname))
3700 {
3701 __IncludeLang($fname, false, true);
3702 }
3703 }
3704
3705 $checkModule = true;
3706 if ($templ_path <> "")
3707 {
3708 $templ_path = $BX_DOC_ROOT . $templ_path;
3709 $checkDefault = true;
3710
3711 // default
3712 if ($subst_lang <> $lang)
3713 {
3714 $fname = $templ_path . $template_name . "/lang/" . $subst_lang . "/" . $file_name;
3715 $fname = Main\Localization\Translation::convertLangPath($fname, $subst_lang);
3716 if (file_exists($fname))
3717 {
3718 __IncludeLang($fname, false, true);
3719 $checkDefault = $checkModule = false;
3720 }
3721 }
3722
3723 // required lang
3724 $fname = $templ_path . $template_name . "/lang/" . $lang . "/" . $file_name;
3726 if (file_exists($fname))
3727 {
3728 __IncludeLang($fname, false, true);
3729 $checkDefault = $checkModule = false;
3730 }
3731
3732 // template .default
3733 if ($checkDefault && $template_name != ".default")
3734 {
3735 if ($subst_lang <> $lang)
3736 {
3737 $fname = $templ_path . ".default/lang/" . $subst_lang . "/" . $file_name;
3738 $fname = Main\Localization\Translation::convertLangPath($fname, $subst_lang);
3739 if (file_exists($fname))
3740 {
3741 __IncludeLang($fname, false, true);
3742 $checkModule = false;
3743 }
3744 }
3745
3746 $fname = $templ_path . ".default/lang/" . $lang . "/" . $file_name;
3748 if (file_exists($fname))
3749 {
3750 __IncludeLang($fname, false, true);
3751 $checkModule = false;
3752 }
3753 }
3754 }
3755 if ($checkModule && $module_name != "")
3756 {
3757 if ($subst_lang <> $lang)
3758 {
3759 $fname = $module_path . $module_name . "/install/templates/lang/" . $subst_lang . "/" . $file_name;
3760 $fname = Main\Localization\Translation::convertLangPath($fname, $subst_lang);
3761 if (file_exists($fname))
3762 {
3763 __IncludeLang($fname, false, true);
3764 }
3765 }
3766
3767 $fname = $module_path . $module_name . "/install/templates/lang/" . $lang . "/" . $file_name;
3769 if (file_exists($fname))
3770 {
3771 __IncludeLang($fname, false, true);
3772 }
3773 }
3774
3775 return null;
3776}
3777
3778function IncludeModuleLangFile($filepath, $lang = false, $bReturnArray = false)
3779{
3780 if ($lang === false && $bReturnArray === false)
3781 {
3783 return true;
3784 }
3785
3786 $filepath = rtrim(preg_replace("'[\\\\/]+'", "/", $filepath), "/ ");
3787 $module_path = "/modules/";
3788 if (str_contains($filepath, $module_path))
3789 {
3790 $pos = mb_strlen($filepath) - mb_strpos(strrev($filepath), strrev($module_path));
3791 $rel_path = mb_substr($filepath, $pos);
3792 $p = mb_strpos($rel_path, "/");
3793 if (!$p)
3794 {
3795 return false;
3796 }
3797
3798 $module_name = mb_substr($rel_path, 0, $p);
3799 $rel_path = mb_substr($rel_path, $p + 1);
3800 $BX_DOC_ROOT = rtrim(preg_replace("'[\\\\/]+'", "/", $_SERVER["DOCUMENT_ROOT"]), "/ ");
3801 $module_path = $BX_DOC_ROOT . getLocalPath($module_path . $module_name);
3802 }
3803 elseif (str_contains($filepath, "/.last_version/"))
3804 {
3805 $pos = mb_strlen($filepath) - mb_strpos(strrev($filepath), strrev("/.last_version/"));
3806 $rel_path = mb_substr($filepath, $pos);
3807 $module_path = mb_substr($filepath, 0, $pos - 1);
3808 }
3809 else
3810 {
3811 return false;
3812 }
3813
3814 if ($lang === false)
3815 {
3816 $lang = (defined('LANGUAGE_ID') ? LANGUAGE_ID : 'en');
3817 }
3818
3819 $lang_subst = LangSubst($lang);
3820
3821 $arMess = [];
3822 if ($lang_subst <> $lang)
3823 {
3824 $fname = $module_path . "/lang/" . $lang_subst . "/" . $rel_path;
3825 $fname = Main\Localization\Translation::convertLangPath($fname, $lang_subst);
3826 if (file_exists($fname))
3827 {
3828 $arMess = __IncludeLang($fname, $bReturnArray, true);
3829 }
3830 }
3831
3832 $fname = $module_path . "/lang/" . $lang . "/" . $rel_path;
3834 if (file_exists($fname))
3835 {
3836 $msg = __IncludeLang($fname, $bReturnArray, true);
3837 if (is_array($msg))
3838 {
3839 $arMess = array_merge($arMess, $msg);
3840 }
3841 }
3842
3843 if ($bReturnArray)
3844 {
3845 return $arMess;
3846 }
3847
3848 return true;
3849}
3850
3858
3859function mydump($thing, $maxdepth = -1, $depth = 0)
3860{
3861 $res = "";
3862 $fmt = sprintf("%%%ds", 4 * $depth);
3863 $pfx = sprintf($fmt, "");
3864 $type = gettype($thing);
3865 if ($type == 'array')
3866 {
3867 $n = sizeof($thing);
3868 $res .= "$pfx array($n) => \n";
3869 foreach (array_keys($thing) as $key)
3870 {
3871 $res .= " $pfx" . "[" . $key . "] =>\n";
3872 $res .= mydump($thing[$key], $maxdepth, $depth + 1);
3873 }
3874 }
3875 elseif ($type == 'string')
3876 {
3877 $n = mb_strlen($thing);
3878 $res .= "$pfx string($n) =>\n";
3879 $res .= "$pfx\"" . $thing . "\"\n";
3880 }
3881 elseif ($type == 'object')
3882 {
3883 $name = get_class($thing);
3884 $res .= "$pfx object($name) =>\n";
3885 $methodArray = get_class_methods($name);
3886 foreach (array_keys($methodArray) as $m)
3887 {
3888 $res .= " $pfx method($m) => $methodArray" . "[" . $m . "]\n";
3889 }
3890 $classVars = get_class_vars($name);
3891 foreach (array_keys($classVars) as $v)
3892 {
3893 $res .= " $pfx default => $v =>\n";
3894 $res .= mydump($classVars[$v], $maxdepth, $depth + 2);
3895 }
3896 $objectVars = get_object_vars($thing);
3897 foreach (array_keys($objectVars) as $v)
3898 {
3899 $res .= " $pfx $v =>\n";
3900 $res .= mydump($objectVars[$v], $maxdepth, $depth + 2);
3901 }
3902 }
3903 elseif ($type == 'boolean')
3904 {
3905 if ($thing)
3906 {
3907 $res .= "$pfx boolean(true)\n";
3908 }
3909 else
3910 {
3911 $res .= "$pfx boolean(false)\n";
3912 }
3913 }
3914 else
3915 {
3916 $res .= "$pfx $type(" . $thing . ")\n";
3917 }
3918
3919 return $res;
3920}
3921
3923{
3924 if (defined('ERROR_EMAIL') && ERROR_EMAIL <> '')
3925 {
3926 $from = (defined('ERROR_EMAIL_FROM') && ERROR_EMAIL_FROM <> '' ? ERROR_EMAIL_FROM : 'error@bitrix.ru');
3927 $reply_to = (defined('ERROR_EMAIL_REPLY_TO') && ERROR_EMAIL_REPLY_TO <> '' ? ERROR_EMAIL_REPLY_TO : 'admin@bitrix.ru');
3928 bxmail(ERROR_EMAIL, $_SERVER['HTTP_HOST'] . ": Error!",
3929 $error .
3930 "HTTP_GET_VARS:\n" . mydump($_GET) . "\n\n" .
3931 "HTTP_POST_VARS:\n" . mydump($_POST) . "\n\n" .
3932 "HTTP_COOKIE_VARS:\n" . mydump($_COOKIE) . "\n\n" .
3933 "HTTP_SERVER_VARS:\n" . mydump($_SERVER) . "\n\n",
3934 "From: " . $from . "\r\n" .
3935 "Reply-To: " . $reply_to . "\r\n" .
3936 "X-Mailer: PHP/" . phpversion()
3937 );
3938 }
3939}
3940
3941function AddMessage2Log($text, $module = '', $traceDepth = 6, $showArgs = false)
3942{
3943 if (defined('LOG_FILENAME') && LOG_FILENAME <> '')
3944 {
3945 $logger = Diag\Logger::create('main.Default', [LOG_FILENAME, $showArgs]);
3946 if ($logger === null)
3947 {
3948 $logger = new Diag\FileLogger(LOG_FILENAME, 0);
3949 $formatter = new Diag\LogFormatter($showArgs);
3950 $logger->setFormatter($formatter);
3951 }
3952
3953 $trace = '';
3954 if ($traceDepth > 0)
3955 {
3956 $trace = Main\Diag\Helper::getBackTrace($traceDepth, ($showArgs ? null : DEBUG_BACKTRACE_IGNORE_ARGS));
3957 }
3958
3959 $context = [
3960 'module' => $module,
3961 'message' => $text,
3962 'trace' => $trace,
3963 ];
3964
3965 $message = "Host: {host}\n"
3966 . "Date: {date}\n"
3967 . ($module != '' ? "Module: {module}\n" : '')
3968 . "{message}\n"
3969 . "{trace}"
3970 . "{delimiter}\n";
3971
3972 $logger->debug($message, $context);
3973 }
3974}
3975
3976function AddEventToStatFile($module, $action, $tag, $label, $action_type = '', $user_id = null)
3977{
3978 global $USER;
3979
3980 static $search = ["\t", "\n", "\r"];
3981 static $replace = " ";
3982
3983 if (defined('ANALYTICS_FILENAME') && is_writable(ANALYTICS_FILENAME))
3984 {
3985 if ($user_id === null && is_object($USER) && !defined("BX_CHECK_AGENT_START"))
3986 {
3987 $user_id = $USER->GetID();
3988 }
3989 $content =
3990 '{date}'
3991 . "\t" . '{host}'
3992 . "\t" . str_replace($search, $replace, $module)
3993 . "\t" . str_replace($search, $replace, $action)
3994 . "\t" . str_replace($search, $replace, $tag)
3995 . "\t" . str_replace($search, $replace, $label)
3996 . "\t" . str_replace($search, $replace, $action_type)
3997 . "\t" . intval($user_id)
3998 . "\n";
3999
4000 $logger = new Diag\FileLogger(ANALYTICS_FILENAME, 0);
4001 $logger->debug($content);
4002 }
4003}
4004
4005function LocalRedirect($url, $skip_security_check = false, $status = "302 Found")
4006{
4007 $redirectResponse = Context::getCurrent()->getResponse()->redirectTo($url);
4008 $redirectResponse
4009 ->setSkipSecurity($skip_security_check)
4010 ->setStatus($status)
4011 ;
4012
4013 Application::getInstance()->end(0, $redirectResponse);
4014}
4015
4017{
4018 echo $message;
4019 exit;
4020}
4021
4022function 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")
4023{
4025 global $APPLICATION;
4026
4027 $selfFolderUrl = (defined("SELF_FOLDER_URL") ? SELF_FOLDER_URL : "/bitrix/admin/");
4028 $search_page = str_replace("/bitrix/admin/", $selfFolderUrl, $search_page);
4029 $tag_name_x = preg_replace("/([^a-z0-9]|\\[|\\])/is", "x", $tag_name);
4030 if ($APPLICATION->GetGroupRight("main") >= "R")
4031 {
4032 $strReturn = "
4033<input type=\"text\" name=\"" . $tag_name . "\" id=\"" . $tag_name . "\" value=\"" . htmlspecialcharsbx($tag_value) . "\" size=\"" . $tag_size . "\" maxlength=\"" . $tag_maxlength . "\" class=\"" . $tag_class . "\">
4034<iframe style=\"width:0; height:0; border:0\" src=\"javascript:''\" name=\"hiddenframe" . $tag_name . "\" id=\"hiddenframe" . $tag_name . "\"></iframe>
4035<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 . "\">
4036<span id=\"div_" . $tag_name . "\" class=\"adm-filter-text-search\">" . $user_name . "</span>
4037<script>
4038";
4039 if ($user_name == "")
4040 {
4041 $strReturn .= "var tv" . $tag_name_x . "='';\n";
4042 }
4043 else
4044 {
4045 $strReturn .= "var tv" . $tag_name_x . "='" . CUtil::JSEscape($tag_value) . "';\n";
4046 }
4047
4048 $strReturn .= "
4049function Ch" . $tag_name_x . "()
4050{
4051 var DV_" . $tag_name_x . ";
4052 DV_" . $tag_name_x . " = BX(\"div_" . $tag_name . "\");
4053 if (!!DV_" . $tag_name_x . ")
4054 {
4055 if (tv" . $tag_name_x . "!=document." . $form_name . "['" . $tag_name . "'].value)
4056 {
4057 tv" . $tag_name_x . "=document." . $form_name . "['" . $tag_name . "'].value;
4058 if (tv" . $tag_name_x . "!='')
4059 {
4060 DV_" . $tag_name_x . ".innerHTML = '<i>" . GetMessage("MAIN_WAIT") . "</i>';
4061 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" : "") . "';
4062 }
4063 else
4064 {
4065 DV_" . $tag_name_x . ".innerHTML = '';
4066 }
4067 }
4068 }
4069 setTimeout(function(){Ch" . $tag_name_x . "()},1000);
4070}
4071
4072BX.ready(function(){
4073 //js error during admin filter initialization, IE9, http://msdn.microsoft.com/en-us/library/gg622929%28v=VS.85%29.aspx?ppud=4, mantis: 33208
4074 if(BX.browser.IsIE)
4075 {
4076 setTimeout(function(){Ch" . $tag_name_x . "()},3000);
4077 }
4078 else
4079 Ch" . $tag_name_x . "();
4080
4081});
4082</script>
4083";
4084 }
4085 else
4086 {
4087 $strReturn = "
4088 <input type=\"text\" name=\"$tag_name\" id=\"$tag_name\" value=\"" . htmlspecialcharsbx($tag_value) . "\" size=\"$tag_size\" maxlength=\"strMaxLenght\">
4089 <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\">
4090 $user_name
4091 ";
4092 }
4093 return $strReturn;
4094}
4095
4096function GetWhoisLink($ip, $class = '')
4097{
4098 $URL = COption::GetOptionString('main', 'whois_service_url', 'http://whois.domaintools.com/#IP#');
4099 $URL = str_replace("#IP#", urlencode($ip), $URL);
4100 return '<a href="' . $URL . '"' . ($class <> '' ? ' class="' . $class . '"' : '') . ' target="_blank" title="' . GetMessage("WHOIS_SERVICE") . '">' . htmlspecialcharsbx($ip) . '</a>';
4101}
4102
4103function IsIE()
4104{
4105 global $HTTP_USER_AGENT;
4106 if (
4107 !str_contains($HTTP_USER_AGENT, "Opera")
4108 && preg_match('#(MSIE|Internet Explorer) ([0-9]+)\\.([0-9]+)#', $HTTP_USER_AGENT, $version)
4109 )
4110 {
4111 if (intval($version[2]) > 0)
4112 {
4113 return doubleval($version[2] . "." . $version[3]);
4114 }
4115 else
4116 {
4117 return false;
4118 }
4119 }
4120 else
4121 {
4122 return false;
4123 }
4124}
4125
4126function GetCountryByID($id, $lang = LANGUAGE_ID)
4127{
4128 $msg = IncludeModuleLangFile(__FILE__, $lang, true);
4129 return $msg["COUNTRY_" . $id] ?? '';
4130}
4131
4132function GetCountryArray($lang = LANGUAGE_ID)
4133{
4134 $arMsg = IncludeModuleLangFile(__FILE__, $lang, true);
4135 $arr = [];
4136 if (is_array($arMsg))
4137 {
4138 foreach ($arMsg as $id => $country)
4139 {
4140 if (str_starts_with($id, "COUNTRY_"))
4141 {
4142 $arr[intval(mb_substr($id, 8))] = $country;
4143 }
4144 }
4145 }
4146 asort($arr);
4147 $arCountry = ["reference_id" => array_keys($arr), "reference" => array_values($arr)];
4148 return $arCountry;
4149}
4150
4151function GetCountries($lang = LANGUAGE_ID)
4152{
4153 static $countries = null;
4154 if (isset($countries[$lang]))
4155 {
4156 return $countries[$lang];
4157 }
4158
4159 include __DIR__ . '/countries.php';
4160 $msg = IncludeModuleLangFile(__FILE__, $lang, true);
4161
4162 $countries[$lang] = [];
4164 foreach ($arCounries as $country => $countryId)
4165 {
4166 $countries[$lang][$country] = [
4167 'ID' => $countryId,
4168 'CODE' => $country,
4169 'NAME' => $msg['COUNTRY_' . $countryId],
4170 ];
4171 }
4172 return $countries[$lang];
4173}
4174
4176{
4177 $code = strtoupper($code);
4178 $countries = GetCountries();
4179
4180 return $countries[$code]['ID'] ?? false;
4181}
4182
4183function GetCountryCodeById($countryId)
4184{
4185 $countryId = (int)$countryId;
4186
4187 static $countryCodes = null;
4188 if ($countryCodes === null)
4189 {
4190 include __DIR__ . '/countries.php';
4192 $countryCodes = array_flip($arCounries);
4193 }
4194
4195 return $countryCodes[$countryId] ?? '';
4196}
4197
4198function minimumPHPVersion($vercheck)
4199{
4200 $minver = explode(".", $vercheck);
4201 $curver = explode(".", phpversion());
4202 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]))))
4203 {
4204 return false;
4205 }
4206 else
4207 {
4208 return true;
4209 }
4210}
4211
4212function FormDecode()
4213{
4214 $superglobals = [
4215 '_GET' => 1, '_SESSION' => 1, '_POST' => 1, '_COOKIE' => 1, '_REQUEST' => 1, '_FILES' => 1, '_SERVER' => 1, 'GLOBALS' => 1, '_ENV' => 1,
4216 'DBType' => 1, 'DBDebug' => 1, 'DBDebugToFile' => 1, 'DBHost' => 1, 'DBName' => 1, 'DBLogin' => 1, 'DBPassword' => 1,
4217 'HTTP_ENV_VARS' => 1, 'HTTP_GET_VARS' => 1, 'HTTP_POST_VARS' => 1, 'HTTP_POST_FILES' => 1, 'HTTP_COOKIE_VARS' => 1, 'HTTP_SERVER_VARS' => 1,
4218 'this' => 1,
4219 ];
4220
4221 foreach ($superglobals as $gl => $t)
4222 {
4223 unset($_REQUEST[$gl]);
4224 unset($_GET[$gl]);
4225 unset($_POST[$gl]);
4226 unset($_COOKIE[$gl]);
4227 }
4228
4229 $register_globals = ini_get_bool("register_globals");
4230 if (!$register_globals)
4231 {
4232 $toGlobals = [];
4233
4234 foreach ($_ENV as $key => $val)
4235 {
4236 if (!isset($superglobals[$key]))
4237 {
4238 $toGlobals[$key] = $val;
4239 }
4240 }
4241
4242 foreach ($_GET as $key => $val)
4243 {
4244 if (!isset($superglobals[$key]))
4245 {
4246 $toGlobals[$key] = $val;
4247 }
4248 }
4249
4250 foreach ($_POST as $key => $val)
4251 {
4252 if (!isset($superglobals[$key]))
4253 {
4254 $toGlobals[$key] = $val;
4255 }
4256 }
4257
4258 foreach ($_COOKIE as $key => $val)
4259 {
4260 if (!isset($superglobals[$key]))
4261 {
4262 $toGlobals[$key] = $val;
4263 }
4264 }
4265
4266 foreach ($_SERVER as $key => $val)
4267 {
4268 if (!isset($superglobals[$key]))
4269 {
4270 $toGlobals[$key] = $val;
4271 }
4272 }
4273
4274 foreach ($toGlobals as $key => $val)
4275 {
4276 if (!isset($GLOBALS[$key]))
4277 {
4278 $GLOBALS[$key] = $val;
4279 }
4280 }
4281 }
4282}
4283
4287function QueryGetData($SITE, $PORT, $PATH, $QUERY_STR, &$errno, &$errstr, $sMethod = "GET", $sProto = "", $sContentType = 'N')
4288{
4289 $ob = new CHTTP();
4290 $ob->Query(
4291 $sMethod,
4292 $SITE,
4293 $PORT,
4294 $PATH . ($sMethod == 'GET' ? ((!str_contains($PATH, '?') ? '?' : '&') . $QUERY_STR) : ''),
4295 $sMethod == 'POST' ? $QUERY_STR : false,
4296 $sProto,
4297 $sContentType
4298 );
4299
4300 $errno = $ob->errno;
4301 $errstr = $ob->errstr;
4302
4303 return $ob->result;
4304}
4305
4307{
4308 $data = trim($data);
4309 $vals = $index = $array = [];
4310 $parser = xml_parser_create("ISO-8859-1");
4311 xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
4312 xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
4313 xml_parse_into_struct($parser, $data, $vals, $index);
4314 xml_parser_free($parser);
4315
4316 $i = 0;
4317
4318 $tagname = $vals[$i]['tag'];
4319 if (isset($vals[$i]['attributes']))
4320 {
4321 $array[$tagname]['@'] = $vals[$i]['attributes'];
4322 }
4323 else
4324 {
4325 $array[$tagname]['@'] = [];
4326 }
4327
4328 $array[$tagname]["#"] = xml_depth_xmldata($vals, $i);
4329
4330 return $array;
4331}
4332
4333function xml_depth_xmldata($vals, &$i)
4334{
4335 $children = [];
4336
4337 if (isset($vals[$i]['value']))
4338 {
4339 array_push($children, $vals[$i]['value']);
4340 }
4341
4342 while (++$i < count($vals))
4343 {
4344 switch ($vals[$i]['type'])
4345 {
4346 case 'open':
4347 $tagname = $vals[$i]['tag'] ?? '';
4348
4349 if (isset($children[$tagname]))
4350 {
4351 $size = sizeof($children[$tagname]);
4352 }
4353 else
4354 {
4355 $size = 0;
4356 }
4357
4358 if (isset($vals[$i]['attributes']))
4359 {
4360 $children[$tagname][$size]['@'] = $vals[$i]["attributes"];
4361 }
4362 $children[$tagname][$size]['#'] = xml_depth_xmldata($vals, $i);
4363 break;
4364
4365 case 'cdata':
4366 array_push($children, $vals[$i]['value']);
4367 break;
4368
4369 case 'complete':
4370 $tagname = $vals[$i]['tag'];
4371
4372 if (isset($children[$tagname]))
4373 {
4374 $size = sizeof($children[$tagname]);
4375 }
4376 else
4377 {
4378 $size = 0;
4379 }
4380
4381 if (isset($vals[$i]['value']))
4382 {
4383 $children[$tagname][$size]["#"] = $vals[$i]['value'];
4384 }
4385 else
4386 {
4387 $children[$tagname][$size]["#"] = '';
4388 }
4389
4390 if (isset($vals[$i]['attributes']))
4391 {
4392 $children[$tagname][$size]['@'] = $vals[$i]['attributes'];
4393 }
4394 break;
4395
4396 case 'close':
4397 return $children;
4398 }
4399 }
4400
4401 return $children;
4402}
4403
4404function Help($module = "", $anchor = "", $help_file = "")
4405{
4407 global $APPLICATION, $IS_HELP;
4408 if ($help_file == '')
4409 {
4410 $help_file = basename($APPLICATION->GetCurPage());
4411 }
4412 if ($anchor <> '')
4413 {
4414 $anchor = "#" . $anchor;
4415 }
4416
4417 if ($IS_HELP !== true)
4418 {
4419 $height = "500";
4420 //$width = "545";
4421 $width = "780";
4422 echo "<script>
4423 function Help(file, module, anchor)
4424 {
4425 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));
4426 }
4427 </script>";
4428 $IS_HELP = true;
4429 }
4430 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>";
4431}
4432
4433function InitBVar(&$var)
4434{
4435 $var = ($var == "Y") ? "Y" : "N";
4436}
4437
4439{
4441}
4442
4443function InitURLParam($url = false)
4444{
4445 if ($url === false)
4446 {
4447 $url = $_SERVER["REQUEST_URI"];
4448 }
4449 $start = mb_strpos($url, "?");
4450 if ($start !== false)
4451 {
4452 $end = mb_strpos($url, "#");
4453 $length = ($end > 0) ? $end - $start - 1 : mb_strlen($url);
4454 $params = mb_substr($url, $start + 1, $length);
4455 parse_str($params, $_GET);
4456 parse_str($params, $arr);
4457 $_REQUEST += $arr;
4458
4459 foreach ($arr as $key => $val)
4460 {
4461 if (!isset($GLOBALS[$key]))
4462 {
4463 $GLOBALS[$key] = $val;
4464 }
4465 }
4466 }
4467}
4468
4470{
4471 $str = str_replace(["<br>", "<br />", "<BR>", "<BR />"], "\n", $str);
4472 $str = htmlspecialcharsbx($str, ENT_COMPAT, false);
4473 $str = nl2br($str);
4474 return $str;
4475}
4476
4477function ShowNote($strNote, $cls = "notetext")
4478{
4480 global $APPLICATION;
4481
4482 if ($strNote <> "")
4483 {
4484 $APPLICATION->IncludeComponent(
4485 "bitrix:system.show_message",
4486 ".default",
4487 [
4488 "MESSAGE" => $strNote,
4489 "STYLE" => $cls,
4490 ],
4491 null,
4492 [
4493 "HIDE_ICONS" => "Y",
4494 ]
4495 );
4496 }
4497}
4498
4499function ShowError($strError, $cls = "errortext")
4500{
4502 global $APPLICATION;
4503
4504 if ($strError <> "")
4505 {
4506 $APPLICATION->IncludeComponent(
4507 "bitrix:system.show_message",
4508 ".default",
4509 [
4510 "MESSAGE" => $strError,
4511 "STYLE" => $cls,
4512 ],
4513 null,
4514 [
4515 "HIDE_ICONS" => "Y",
4516 ]
4517 );
4518 }
4519}
4520
4521function ShowMessage($arMess)
4522{
4524 global $APPLICATION;
4525
4526 if (!is_array($arMess))
4527 {
4528 $arMess = ["MESSAGE" => $arMess, "TYPE" => "ERROR"];
4529 }
4530
4531 if (!empty($arMess["MESSAGE"]))
4532 {
4533 $APPLICATION->IncludeComponent(
4534 "bitrix:system.show_message",
4535 ".default",
4536 [
4537 "MESSAGE" => $arMess["MESSAGE"],
4538 "STYLE" => ($arMess["TYPE"] == "OK" ? "notetext" : "errortext"),
4539 ],
4540 null,
4541 [
4542 "HIDE_ICONS" => "Y",
4543 ]
4544 );
4545 }
4546}
4547
4548function DeleteParam($ParamNames)
4549{
4550 if (empty($_GET))
4551 {
4552 return '';
4553 }
4554
4555 $aParams = $_GET;
4556 foreach (array_keys($aParams) as $key)
4557 {
4558 foreach ($ParamNames as $param)
4559 {
4560 if (strcasecmp($param, $key) == 0)
4561 {
4562 unset($aParams[$key]);
4563 break;
4564 }
4565 }
4566 }
4567
4568 return http_build_query($aParams, "", "&");
4569}
4570
4571function check_email($email, $strict = false, $domainCheck = false)
4572{
4573 if (!$strict)
4574 {
4575 $email = trim($email);
4576 if (preg_match("#.*?[<\\[\\(](.*?)[>\\]\\)].*#i", $email, $arr) && $arr[1] <> '')
4577 {
4578 $email = $arr[1];
4579 }
4580 }
4581
4582 //http://tools.ietf.org/html/rfc2821#section-4.5.3.1
4583 //4.5.3.1. Size limits and minimums
4584 if (mb_strlen($email) > 320)
4585 {
4586 return false;
4587 }
4588
4589 //http://tools.ietf.org/html/rfc2822#section-3.2.4
4590 //3.2.4. Atom
4591 //added \p{L} for international symbols
4592 static $atom = "\\p{L}=_0-9a-z+~'!\$&*^`|\\#%/?{}-";
4593 static $domain = "\\p{L}a-z0-9-";
4594
4595 //"." can't be in the beginning or in the end of local-part
4596 //dot-atom-text = 1*atext *("." 1*atext)
4597 if (preg_match("#^[{$atom}]+(\\.[{$atom}]+)*@(([{$domain}]+\\.)+)([{$domain}]{2,20})$#ui", $email))
4598 {
4599 if ($domainCheck)
4600 {
4602 $parts = explode('@', $email);
4603 $host = $parts[1] . '.';
4604
4605 return (checkdnsrr($host, 'MX') || checkdnsrr($host, 'A'));
4606 }
4607
4608 return true;
4609 }
4610
4611 return false;
4612}
4613
4614function initvar($varname, $value = '')
4615{
4616 global $$varname;
4617 if (!isset($$varname))
4618 {
4619 $$varname = $value;
4620 }
4621}
4622
4623function ClearVars($prefix = "str_")
4624{
4625 $n = mb_strlen($prefix);
4626 foreach ($GLOBALS as $key => $val)
4627 {
4628 if (strncmp($key, $prefix, $n) == 0)
4629 {
4630 unset($GLOBALS[$key]);
4631 }
4632 }
4633}
4634
4635function roundEx($value, $prec = 0)
4636{
4637 $eps = 1.00 / pow(10, $prec + 4);
4638 return round(doubleval($value) + $eps, $prec);
4639}
4640
4641function roundDB($value, $len = 18, $dec = 4)
4642{
4643 if ($value >= 0)
4644 {
4645 $value = "0" . $value;
4646 }
4647 $value = roundEx(DoubleVal($value), $len);
4648 $value = sprintf("%01." . $dec . "f", $value);
4649 if ($len > 0 && mb_strlen($value) > $len - $dec)
4650 {
4651 $value = trim(mb_substr($value, 0, $len - $dec), ".");
4652 }
4653 return $value;
4654}
4655
4657{
4658 $kernelSession = Application::getInstance()->getKernelSession();
4659 if (!$kernelSession->has('fixed_session_id'))
4660 {
4662 }
4663
4664 return $kernelSession->get('fixed_session_id');
4665}
4666
4667function bitrix_sessid_set($val = false)
4668{
4669 if ($val === false)
4670 {
4672 }
4673 Application::getInstance()->getKernelSession()->set("fixed_session_id", $val);
4674}
4675
4677{
4678 return md5(CMain::GetServerUniqID() . Application::getInstance()->getKernelSession()->getId());
4679}
4680
4682{
4683 return md5("nobody" . CMain::GetServerUniqID() . "nowhere");
4684}
4685
4686function check_bitrix_sessid($varname = 'sessid')
4687{
4688 $request = Main\Context::getCurrent()->getRequest();
4689 return (
4690 $request[$varname] === bitrix_sessid() ||
4691 $request->getHeader('X-Bitrix-Csrf-Token') === bitrix_sessid()
4692 );
4693}
4694
4695function bitrix_sessid_get($varname = 'sessid')
4696{
4697 return $varname . "=" . bitrix_sessid();
4698}
4699
4700function bitrix_sessid_post($varname = 'sessid', $returnInvocations = false)
4701{
4702 static $invocations = 0;
4703 if ($returnInvocations)
4704 {
4705 return $invocations;
4706 }
4707
4708 $id = $invocations ? $varname . '_' . $invocations : $varname;
4709 $invocations++;
4710
4711 return '<input type="hidden" name="' . $varname . '" id="' . $id . '" value="' . bitrix_sessid() . '" />';
4712}
4713
4714function print_url($strUrl, $strText, $sParams = "")
4715{
4716 return ($strUrl == '' ? $strText : "<a href=\"" . $strUrl . "\" " . $sParams . ">" . $strText . "</a>");
4717}
4718
4719function IncludeAJAX()
4720{
4722 global $APPLICATION;
4723
4724 $APPLICATION->AddHeadString('<script>var ajaxMessages = {wait:"' . CUtil::JSEscape(GetMessage('AJAX_WAIT')) . '"}</script>', true);
4725 $APPLICATION->AddHeadScript('/bitrix/js/main/cphttprequest.js', true);
4726}
4727
4728function GetMenuTypes($site = false, $default_value = false)
4729{
4730 if ($default_value === false)
4731 {
4732 $default_value = "left=" . GetMessage("main_tools_menu_left") . ",top=" . GetMessage("main_tools_menu_top");
4733 }
4734
4735 $mt = COption::GetOptionString("fileman", "menutypes", $default_value, $site);
4736 if (!$mt)
4737 {
4738 return [];
4739 }
4740
4741 $armt_ = unserialize(stripslashes($mt), ['allowed_classes' => false]);
4742 $armt = [];
4743 if (is_array($armt_))
4744 {
4745 foreach ($armt_ as $key => $title)
4746 {
4747 $key = trim($key);
4748 if ($key == '')
4749 {
4750 continue;
4751 }
4752 $armt[$key] = trim($title);
4753 }
4754 return $armt;
4755 }
4756
4757 $armt_ = explode(",", $mt);
4758 for ($i = 0, $c = count($armt_); $i < $c; $i++)
4759 {
4760 $pos = mb_strpos($armt_[$i], '=');
4761 if ($pos === false)
4762 {
4763 continue;
4764 }
4765 $key = trim(mb_substr($armt_[$i], 0, $pos));
4766 if ($key == '')
4767 {
4768 continue;
4769 }
4770 $armt[$key] = trim(mb_substr($armt_[$i], $pos + 1));
4771 }
4772 return $armt;
4773}
4774
4775function SetMenuTypes($armt, $site = '', $description = false)
4776{
4777 return COption::SetOptionString('fileman', "menutypes", addslashes(serialize($armt)), $description, $site);
4778}
4779
4781{
4783 // Parse prolog, epilog, title
4785 $filesrc = trim($filesrc);
4786 $prolog = $epilog = '';
4787
4788 $php_doubleq = false;
4789 $php_singleq = false;
4790 $php_comment = false;
4791 $php_star_comment = false;
4792 $php_line_comment = false;
4793
4794 if (!empty($params["use_php_parser"]) && str_starts_with($filesrc, "<?"))
4795 {
4796 $phpChunks = PHPParser::getPhpChunks($filesrc);
4797 if (!empty($phpChunks))
4798 {
4799 $prolog = $phpChunks[0];
4800 $filesrc = mb_substr($filesrc, mb_strlen($prolog));
4801 }
4802 }
4803 elseif (str_starts_with($filesrc, "<?"))
4804 {
4805 $fl = mb_strlen($filesrc);
4806 $p = 2;
4807 while ($p < $fl)
4808 {
4809 $ch2 = mb_substr($filesrc, $p, 2);
4810 $ch1 = mb_substr($ch2, 0, 1);
4811
4812 if ($ch2 == "?>" && !$php_doubleq && !$php_singleq && !$php_star_comment)
4813 {
4814 $p += 2;
4815 break;
4816 }
4817 elseif (!$php_comment && $ch2 == "//" && !$php_doubleq && !$php_singleq)
4818 {
4819 $php_comment = $php_line_comment = true;
4820 $p++;
4821 }
4822 elseif ($php_line_comment && ($ch1 == "\n" || $ch1 == "\r" || $ch2 == "?>"))
4823 {
4824 $php_comment = $php_line_comment = false;
4825 }
4826 elseif (!$php_comment && $ch2 == "/*" && !$php_doubleq && !$php_singleq)
4827 {
4828 $php_comment = $php_star_comment = true;
4829 $p++;
4830 }
4831 elseif ($php_star_comment && $ch2 == "*/")
4832 {
4833 $php_comment = $php_star_comment = false;
4834 $p++;
4835 }
4836 elseif (!$php_comment)
4837 {
4838 if (($php_doubleq || $php_singleq) && $ch2 == "\\\\")
4839 {
4840 $p++;
4841 }
4842 elseif (!$php_doubleq && $ch1 == '"')
4843 {
4844 $php_doubleq = true;
4845 }
4846 elseif ($php_doubleq && $ch1 == '"' && mb_substr($filesrc, $p - 1, 1) != '\\')
4847 {
4848 $php_doubleq = false;
4849 }
4850 elseif (!$php_doubleq)
4851 {
4852 if (!$php_singleq && $ch1 == "'")
4853 {
4854 $php_singleq = true;
4855 }
4856 elseif ($php_singleq && $ch1 == "'" && mb_substr($filesrc, $p - 1, 1) != '\\')
4857 {
4858 $php_singleq = false;
4859 }
4860 }
4861 }
4862
4863 $p++;
4864 }
4865
4866 $prolog = mb_substr($filesrc, 0, $p);
4867 $filesrc = mb_substr($filesrc, $p);
4868 }
4869 elseif (preg_match("'(.*?<title>.*?</title>)(.*)$'is", $filesrc, $reg))
4870 {
4871 $prolog = $reg[1];
4872 $filesrc = $reg[2];
4873 }
4874
4875 $title = PHPParser::getPageTitle($filesrc, $prolog);
4876
4877 $arPageProps = [];
4878 if ($prolog <> '')
4879 {
4880 if (preg_match_all("'\\\$APPLICATION->SetPageProperty\\(([\"\\'])(.*?)(?<!\\\\)[\"\\'] *, *([\"\\'])(.*?)(?<!\\\\)[\"\\']\\);'i", $prolog, $out))
4881 {
4882 foreach ($out[2] as $i => $m1)
4883 {
4884 $arPageProps[UnEscapePHPString($m1, $out[1][$i])] = UnEscapePHPString($out[4][$i], $out[3][$i]);
4885 }
4886 }
4887 }
4888
4889 if (str_ends_with($filesrc, "?>"))
4890 {
4891 if (isset($phpChunks) && count($phpChunks) > 1)
4892 {
4893 $epilog = $phpChunks[count($phpChunks) - 1];
4894 $filesrc = mb_substr($filesrc, 0, -mb_strlen($epilog));
4895 }
4896 else
4897 {
4898 $p = mb_strlen($filesrc) - 2;
4899 while (($p > 0) && (mb_substr($filesrc, $p, 2) != "<?"))
4900 {
4901 $p--;
4902 }
4903 $epilog = mb_substr($filesrc, $p);
4904 $filesrc = mb_substr($filesrc, 0, $p);
4905 }
4906 }
4907
4908 return [
4909 "PROLOG" => $prolog,
4910 "TITLE" => $title,
4911 "PROPERTIES" => $arPageProps,
4912 "CONTENT" => $filesrc,
4913 "EPILOG" => $epilog,
4914 ];
4915}
4916
4917function EscapePHPString($str, $encloser = '"')
4918{
4919 if ($encloser == "'")
4920 {
4921 $from = ["\\", "'"];
4922 $to = ["\\\\", "\\'"];
4923 }
4924 else
4925 {
4926 $from = ["\\", "\$", "\""];
4927 $to = ["\\\\", "\\\$", "\\\""];
4928 }
4929
4930 return str_replace($from, $to, $str);
4931}
4932
4933function UnEscapePHPString($str, $encloser = '"')
4934{
4935 if ($encloser == "'")
4936 {
4937 $from = ["\\\\", "\\'"];
4938 $to = ["\\", "'"];
4939 }
4940 else
4941 {
4942 $from = ["\\\\", "\\\$", "\\\""];
4943 $to = ["\\", "\$", "\""];
4944 }
4945
4946 return str_replace($from, $to, $str);
4947}
4948
4949function CheckSerializedData($str, $max_depth = 200)
4950{
4951 if (preg_match('/(^|;)[OC]\\:\\+{0,1}\\d+:/', $str)) // serialized objects
4952 {
4953 return false;
4954 }
4955
4956 return true;
4957}
4958
4959function NormalizePhone($number, $minLength = 10)
4960{
4961 $minLength = intval($minLength);
4962 if ($minLength <= 0 || mb_strlen($number) < $minLength)
4963 {
4964 return false;
4965 }
4966
4967 if (mb_strlen($number) >= 10 && str_starts_with($number, '+8'))
4968 {
4969 $number = '00' . mb_substr($number, 1);
4970 }
4971
4972 $number = preg_replace("/[^0-9\#\*,;]/i", "", $number);
4973 if (mb_strlen($number) >= 10)
4974 {
4975 if (str_starts_with($number, '80') || str_starts_with($number, '81') || str_starts_with($number, '82'))
4976 {
4977 }
4978 elseif (str_starts_with($number, '00'))
4979 {
4980 $number = substr($number, 2);
4981 }
4982 elseif (str_starts_with($number, '011'))
4983 {
4984 $number = substr($number, 3);
4985 }
4986 elseif (str_starts_with($number, '8'))
4987 {
4988 $number = '7' . substr($number, 1);
4989 }
4990 elseif (str_starts_with($number, '0'))
4991 {
4992 $number = substr($number, 1);
4993 }
4994 }
4995
4996 return $number;
4997}
4998
4999function bxmail($to, $subject, $message, $additional_headers = "", $additional_parameters = "", Main\Mail\Context $context = null)
5000{
5001 if (empty($context))
5002 {
5004 }
5005
5006 $event = new Main\Event(
5007 'main',
5008 'OnBeforePhpMail',
5009 [
5010 'arguments' => (object)[
5011 'to' => &$to,
5012 'subject' => &$subject,
5013 'message' => &$message,
5014 'additional_headers' => &$additional_headers,
5015 'additional_parameters' => &$additional_parameters,
5016 'context' => &$context,
5017 ],
5018 ]
5019 );
5020 $event->send();
5021
5022 $defaultMailConfiguration = Configuration::getValue("smtp");
5023 $smtpEnabled =
5024 is_array($defaultMailConfiguration)
5025 && isset($defaultMailConfiguration['enabled'])
5026 && $defaultMailConfiguration['enabled'] === true;
5027
5028 if (
5029 $smtpEnabled
5030 && (
5031 $context->getSmtp() !== null
5032 || (!empty($defaultMailConfiguration['host']) && !empty($defaultMailConfiguration['login']))
5033 )
5034 )
5035 {
5037 return $mailer->sendMailBySmtp($to, $subject, $message, $additional_headers, $additional_parameters);
5038 }
5039
5040 //message must not contain any null bytes
5041 $message = str_replace("\0", ' ', $message);
5042
5043 if (function_exists("custom_mail"))
5044 {
5045 return custom_mail($to, $subject, $message, $additional_headers, $additional_parameters, $context);
5046 }
5047
5048 if ($additional_parameters != "")
5049 {
5050 return @mail($to, $subject, $message, $additional_headers, $additional_parameters);
5051 }
5052
5053 return @mail($to, $subject, $message, $additional_headers);
5054}
5055
5060{
5061 Application::resetAccelerator();
5062}
5063
5067function ini_get_bool($param)
5068{
5069 return Main\Config\Ini::getBool((string)$param);
5070}
5071
5087function sortByColumn(array &$array, $columns, $callbacks = '', $defaultValueIfNotSetValue = null, $preserveKeys = false)
5088{
5089 Main\Type\Collection::sortByColumn($array, $columns, $callbacks, $defaultValueIfNotSetValue, $preserveKeys);
5090}
5091
5092function getLocalPath($path, $baseFolder = "/bitrix")
5093{
5094 $root = rtrim($_SERVER["DOCUMENT_ROOT"], "\\/");
5095
5096 static $hasLocalDir = null;
5097 if ($hasLocalDir === null)
5098 {
5099 $hasLocalDir = is_dir($root . "/local");
5100 }
5101
5102 if ($hasLocalDir && file_exists($root . "/local/" . $path))
5103 {
5104 return "/local/" . $path;
5105 }
5106 elseif (file_exists($root . $baseFolder . "/" . $path))
5107 {
5108 return $baseFolder . "/" . $path;
5109 }
5110
5111 // cli repository mode
5112 if (empty($_SERVER["DOCUMENT_ROOT"]) || defined('REPOSITORY_ROOT'))
5113 {
5114 $root = realpath(__DIR__ . '/../../');
5115 $localPath = $root . '/' . $path;
5116
5117 if (file_exists($localPath))
5118 {
5119 return $localPath;
5120 }
5121 }
5122
5123 return false;
5124}
5125
5130function setSessionExpired($pIsExpired = true)
5131{
5132 Application::getInstance()->getKernelSession()->set("IS_EXPIRED", $pIsExpired);
5133}
5134
5139{
5140 return Application::getInstance()->getKernelSession()->get("IS_EXPIRED") === true;
5141}
5142
5144
5145function ShowImage($PICTURE_ID, $iMaxW = 0, $iMaxH = 0, $sParams = false, $strImageUrl = "", $bPopup = false, $strPopupTitle = false, $iSizeWHTTP = 0, $iSizeHHTTP = 0)
5146{
5147 return CFile::ShowImage($PICTURE_ID, $iMaxW, $iMaxH, $sParams, $strImageUrl, $bPopup, $strPopupTitle, $iSizeWHTTP, $iSizeHHTTP);
5148}
5149
5150function BXClearCache($full = false, $initdir = '')
5151{
5152 CPHPCache::ClearCache($full, $initdir);
5153}
5154
5155function RegisterModule($id)
5156{
5158}
5159
5160function UnRegisterModule($id)
5161{
5163}
5164
5165function AddEventHandler($FROM_MODULE_ID, $MESSAGE_ID, $CALLBACK, $SORT = 100, $FULL_PATH = false)
5166{
5168 return $eventManager->addEventHandlerCompatible($FROM_MODULE_ID, $MESSAGE_ID, $CALLBACK, $FULL_PATH, $SORT);
5169}
5170
5171function RemoveEventHandler($FROM_MODULE_ID, $MESSAGE_ID, $iEventHandlerKey)
5172{
5174 return $eventManager->removeEventHandler($FROM_MODULE_ID, $MESSAGE_ID, $iEventHandlerKey);
5175}
5176
5177function GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray = false)
5178{
5180 $arrResult = $eventManager->findEventHandlers($MODULE_ID, $MESSAGE_ID);
5181
5182 foreach ($arrResult as $k => $event)
5183 {
5184 $arrResult[$k]['FROM_MODULE_ID'] = $MODULE_ID;
5185 $arrResult[$k]['MESSAGE_ID'] = $MESSAGE_ID;
5186 }
5187
5188 if ($bReturnArray)
5189 {
5190 return $arrResult;
5191 }
5192 else
5193 {
5194 $resRS = new CDBResult;
5195 $resRS->InitFromArray($arrResult);
5196 return $resRS;
5197 }
5198}
5199
5203function ExecuteModuleEvent($arEvent)
5204{
5205 $args = [];
5206 for ($i = 1, $nArgs = func_num_args(); $i < $nArgs; $i++)
5207 {
5208 $args[] = func_get_arg($i);
5209 }
5210
5211 return ExecuteModuleEventEx($arEvent, $args);
5212}
5213
5214function ExecuteModuleEventEx($arEvent, $arParams = [])
5215{
5216 $result = true;
5217
5218 if (
5219 isset($arEvent["TO_MODULE_ID"])
5220 && $arEvent["TO_MODULE_ID"] <> ""
5221 && $arEvent["TO_MODULE_ID"] <> "main"
5222 )
5223 {
5224 if (!CModule::IncludeModule($arEvent["TO_MODULE_ID"]))
5225 {
5226 return null;
5227 }
5228 }
5229 elseif (
5230 isset($arEvent["TO_PATH"])
5231 && $arEvent["TO_PATH"] <> ""
5232 && file_exists($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . $arEvent["TO_PATH"])
5233 )
5234 {
5235 $result = include_once($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . $arEvent["TO_PATH"]);
5236 }
5237 elseif (
5238 isset($arEvent["FULL_PATH"])
5239 && $arEvent["FULL_PATH"] <> ""
5240 && file_exists($arEvent["FULL_PATH"])
5241 )
5242 {
5243 $result = include_once($arEvent["FULL_PATH"]);
5244 }
5245
5246 if ((empty($arEvent["TO_CLASS"]) || empty($arEvent["TO_METHOD"])) && !isset($arEvent["CALLBACK"]))
5247 {
5248 return $result;
5249 }
5250
5251 if (isset($arEvent["TO_METHOD_ARG"]) && is_array($arEvent["TO_METHOD_ARG"]) && !empty($arEvent["TO_METHOD_ARG"]))
5252 {
5253 $args = array_merge($arEvent["TO_METHOD_ARG"], $arParams);
5254 }
5255 else
5256 {
5257 $args = $arParams;
5258 }
5259
5260 //TODO: Возможно заменить на EventManager::getInstance()->getLastEvent();
5261 global $BX_MODULE_EVENT_LAST;
5262 $BX_MODULE_EVENT_LAST = $arEvent;
5263
5264 if (isset($arEvent["CALLBACK"]))
5265 {
5266 $result = call_user_func_array($arEvent["CALLBACK"], $args);
5267 }
5268 else
5269 {
5270 //php bug: http://bugs.php.net/bug.php?id=47948
5271 if (class_exists($arEvent["TO_CLASS"]) && is_callable([$arEvent["TO_CLASS"], $arEvent["TO_METHOD"]]))
5272 {
5273 $result = call_user_func_array([$arEvent["TO_CLASS"], $arEvent["TO_METHOD"]], $args);
5274 }
5275 else
5276 {
5277 $exception = new SystemException("Event handler error: could not invoke {$arEvent["TO_CLASS"]}::{$arEvent["TO_METHOD"]}. Class or method does not exist.");
5278 $application = Application::getInstance();
5279 $exceptionHandler = $application->getExceptionHandler();
5280 $exceptionHandler->writeToLog($exception);
5281
5282 $result = null;
5283 }
5284 }
5285
5286 return $result;
5287}
5288
5289function UnRegisterModuleDependences($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS = "", $TO_METHOD = "", $TO_PATH = "", $TO_METHOD_ARG = [])
5290{
5292 $eventManager->unRegisterEventHandler($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS, $TO_METHOD, $TO_PATH, $TO_METHOD_ARG);
5293}
5294
5295function RegisterModuleDependences($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS = "", $TO_METHOD = "", $SORT = 100, $TO_PATH = "", $TO_METHOD_ARG = [])
5296{
5298 $eventManager->registerEventHandlerCompatible($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS, $TO_METHOD, $SORT, $TO_PATH, $TO_METHOD_ARG);
5299}
5300
5305
5307{
5308 $arr = explode("/", $str);
5309 $i = array_search("modules", $arr);
5310 return $arr[$i + 1];
5311}
5312
5319function CheckVersion($version1, $version2)
5320{
5321 return (version_compare($version1, $version2) >= 0);
5322}
$arParams
Определения access_dialog.php:21
$path
Определения access_edit.php:21
$type
Определения options.php:106
const BX_ROOT
Определения bx_root.php:3
global $APPLICATION
Определения include.php:80
$module_id
Определения options.php:6
if(!Loader::includeModule('catalog')) if(!AccessController::getCurrent() ->check(ActionDictionary::ACTION_PRICE_EDIT)) if(!check_bitrix_sessid()) $request
Определения catalog_reindex.php:36
static getBool(string $param)
Определения ini.php:7
static getBackTrace($limit=0, $options=null, $skip=1)
Определения helper.php:26
static create(string $id, $params=[])
Определения logger.php:121
static getInstance()
Определения eventmanager.php:31
static getCurrentLang()
Определения loc.php:79
static loadMessages($file)
Определения loc.php:65
static getDefaultLang($lang)
Определения loc.php:463
static getMessage($code, $replace=null, $language=null)
Определения loc.php:30
static getSourceEncoding($lang)
Определения translation.php:59
static getCurrentEncoding()
Определения translation.php:104
static needConvertEncoding($language, $targetEncoding=null)
Определения translation.php:122
static checkPathRestrictionConvertEncoding($langFile)
Определения translation.php:150
static convertLangPath($langFile, $language)
Определения translation.php:267
static toPunycode($to)
Определения mail.php:1300
static getInstance(Context $context)
Определения mailer.php:283
static unRegisterModule($moduleName)
Определения modulemanager.php:165
static registerModule($moduleName)
Определения modulemanager.php:157
static isModuleInstalled($moduleName)
Определения modulemanager.php:125
static getString($length, $caseSensitive=false)
Определения random.php:76
static getStringByArray(int $length, array $charsetList)
Определения random.php:135
static getStringByCharsets($length, $charsetList)
Определения random.php:115
static convertEncoding($data, $charsetFrom, $charsetTo)
Определения encoding.php:17
static str_replace($search, $replace, $str)
Определения stringhelper.php:74
static getLastPosition($haystack, $needle)
Определения utfsafestring.php:12
static sortByColumn(array &$array, $columns, $callbacks='', $defaultValueIfNotSetValue=null, $preserveKeys=false)
Определения collection.php:24
static CalendarDate($sFieldName, $sValue="", $size="10", $bTime=false)
Определения admin_calendar.php:78
static CalendarPeriod($sFromName, $sToName, $sFromVal="", $sToVal="", $bSelectShow=false, $size=10, $bTime=false)
Определения admin_calendar.php:142
static Calendar($sFieldName, $sFromName="", $sToName="", $bTime=false)
Определения admin_calendar.php:60
Определения http.php:7
Определения spacer.php:4
$children
Определения sync.php:12
$str
Определения commerceml2.php:63
$content
Определения commerceml.php:144
$abs_path
Определения component_props2.php:76
$f
Определения component_props.php:52
$filesrc
Определения component_props.php:53
$langFile
Определения .description.php:2
$data['IS_AVAILABLE']
Определения .description.php:13
$selfFolderUrl
Определения discount_coupon_list.php:18
$arPath
Определения file_edit.php:72
$arr
Определения file_new.php:624
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$armt
Определения options.php:675
$res
Определения filter_act.php:7
$handle
Определения include.php:55
$_REQUEST["admin_mnu_menu_id"]
Определения get_menu.php:8
$result
Определения get_property_values.php:14
$start
Определения get_search.php:9
$p
Определения group_list_element_edit.php:23
if(Loader::includeModule( 'bitrix24')) elseif(Loader::includeModule('intranet') &&CIntranetUtils::getPortalZone() !=='ru') $description
Определения .description.php:24
$host
Определения .description.php:9
ShowMessage()
Определения idea_sonet_notify.php:443
global $MESS
Определения bill.php:2
$strError
Определения options_user_settings.php:4
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $DB
Определения cron_frame.php:29
global $USER
Определения csv_new_run.php:40
$context
Определения csv_new_setup.php:223
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
$application
Определения bitrix.php:23
const AM_PM_LOWER
Определения constants.php:117
const AM_PM_NONE(!defined('BX_CRONTAB_SUPPORT'))
Определения constants.php:115
const AM_PM_UPPER
Определения constants.php:116
const FORMAT_DATETIME
Определения include.php:64
if(!defined('SITE_ID')) $lang
Определения include.php:91
const FORMAT_DATE
Определения include.php:63
$culture
Определения include.php:61
$kernelSession
Определения include.php:181
$status
Определения session.php:10
CheckSerializedData($str, $max_depth=200)
Определения tools.php:4949
EscapePHPString($str, $encloser='"')
Определения tools.php:4917
InitURLParam($url=false)
Определения tools.php:4443
IsAmPmMode($returnConst=false)
Определения tools.php:803
mydump($thing, $maxdepth=-1, $depth=0)
Определения tools.php:3859
bitrix_sessid_post($varname='sessid', $returnInvocations=false)
Определения tools.php:4700
ClearVars($prefix="str_")
Определения tools.php:4623
ConvertDateTime($datetime, $to_format=false, $from_site=false, $bSearchInSitesOnly=false)
Определения tools.php:724
WriteFinalMessage($message="")
Определения tools.php:4016
roundEx($value, $prec=0)
Определения tools.php:4635
GetModuleID($str)
Определения tools.php:5306
minimumPHPVersion($vercheck)
Определения tools.php:4198
_ShowHtmlspec($str)
Определения tools.php:4469
GetFileExtension($path)
Определения tools.php:2972
isSessionExpired()
Определения tools.php:5138
check_bitrix_sessid($varname='sessid')
Определения tools.php:4686
roundDB($value, $len=18, $dec=4)
Определения tools.php:4641
convert_open_quote_tag($quote_table_class, $quote_head_class, $quote_body_class)
Определения tools.php:2369
PHPFormatDateTime($strDateTime, $format="d.m.Y H:i:s")
Определения tools.php:2027
InsertSpaces($sText, $iMaxChar=80, $symbol=" ", $bHTML=false)
Определения tools.php:2197
GetDirectoryIndex($path, $strDirIndex=false)
Определения tools.php:3089
CheckDirPath($path)
Определения tools.php:2707
GetDirIndexArray($strDirIndex=false)
Определения tools.php:3112
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
FormatText($strText, $strTextType="text")
Определения tools.php:2675
AddMessage2Log($text, $module='', $traceDepth=6, $showArgs=false)
Определения tools.php:3941
TrimArr(&$arr, $trim_value=false)
Определения tools.php:2110
CalendarDate($fieldName, $value, $formName="", $size="10", $param="class=\"typeinput\"")
Определения tools.php:319
Help($module="", $anchor="", $help_file="")
Определения tools.php:4404
IsFileUnsafe($name)
Определения tools.php:3016
GetCountryByID($id, $lang=LANGUAGE_ID)
Определения tools.php:4126
bitrix_sessid()
Определения tools.php:4656
ToLower($str)
Определения tools.php:2257
SetMenuTypes($armt, $site='', $description=false)
Определения tools.php:4775
GetFileFromURL($page, $get_index_page=null)
Определения tools.php:3218
convert_code_tag_for_html_before($text="")
Определения tools.php:2352
CalendarPeriod($sFromName, $sFromVal, $sToName, $sToVal, $sFormName="skform", $show_select="N", $field_select="class=\"typeselect\"", $field_input="class=\"typeinput\"", $size="10")
Определения tools.php:329
ToUpper($str)
Определения tools.php:2247
PrepareTxtForEmail($text, $lang=false, $convert_url_tag=true, $convert_image_tag=true)
Определения tools.php:2262
GetPagePath($page=false, $get_index_page=null)
Определения tools.php:3139
DeleteParam($ParamNames)
Определения tools.php:4548
SendError($error)
Определения tools.php:3922
GetCountryIdByCode($code)
Определения tools.php:4175
ParseFileContent($filesrc, $params=[])
Определения tools.php:4780
NormalizePhone($number, $minLength=10)
Определения tools.php:4959
GetRequestUri()
Определения tools.php:3192
setSessionExpired($pIsExpired=true)
Определения tools.php:5130
bxstrrpos($haystack, $needle)
Определения tools.php:3292
bitrix_sess_sign()
Определения tools.php:4681
removeDocRoot($path)
Определения tools.php:3382
GetMenuTypes($site=false, $default_value=false)
Определения tools.php:4728
QueryGetData($SITE, $PORT, $PATH, $QUERY_STR, &$errno, &$errstr, $sMethod="GET", $sProto="", $sContentType='N')
Определения tools.php:4287
extract_url($s)
Определения tools.php:2411
FormatDate($format="", $timestamp=false, $now=false, ?string $languageId=null)
Определения tools.php:871
htmlspecialcharsback($str)
Определения tools.php:2693
IsModuleInstalled($module_id)
Определения tools.php:5301
TrimUnsafe($path)
Определения tools.php:2934
RemoveScriptExtension($check_name)
Определения tools.php:2939
GetCountryArray($lang=LANGUAGE_ID)
Определения tools.php:4132
GetScriptFileExt()
Определения tools.php:2912
InputType($strType, $strName, $strValue, $strCmp, $strPrintValue=false, $strPrint="", $field1="", $strId="")
Определения tools.php:35
initvar($varname, $value='')
Определения tools.php:4614
DeleteDirFiles($frDir, $toDir, $arExept=[])
Определения tools.php:2874
bitrix_sessid_val()
Определения tools.php:4676
ExecuteModuleEvent($arEvent)
Определения tools.php:5203
ShowImage($PICTURE_ID, $iMaxW=0, $iMaxH=0, $sParams=false, $strImageUrl="", $bPopup=false, $strPopupTitle=false, $iSizeWHTTP=0, $iSizeHHTTP=0)
Определения tools.php:5145
CheckVersion($version1, $version2)
Определения tools.php:5319
delete_special_symbols($text, $replace="")
Определения tools.php:2337
HasScriptExtension($check_name)
Определения tools.php:2956
ParseDateTime($datetime, $format=false)
Определения tools.php:638
SelectBox($strBoxName, $a, $strDetText="", $strSelectedVal="", $field1="class=\"typeselect\"")
Определения tools.php:77
RegisterModuleDependences($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS="", $TO_METHOD="", $SORT=100, $TO_PATH="", $TO_METHOD_ARG=[])
Определения tools.php:5295
bx_basename($path, $ext="")
Определения tools.php:3269
SelectBoxM($strBoxName, $a, $arr, $strDetText="", $strDetText_selected=false, $size="5", $field1="class=\"typeselect\"")
Определения tools.php:119
GetDirPath($sPath)
Определения tools.php:3245
FmtDate($str_date, $format=false, $site=false, $bSearchInSitesOnly=false)
Определения tools.php:745
LangSubst($lang)
Определения tools.php:3854
bx_accelerator_reset()
Определения tools.php:5059
InitBVarFromArr($arr)
Определения tools.php:2098
print_url($strUrl, $strText, $sParams="")
Определения tools.php:4714
FormatDateEx($strDate, $format=false, $new_format=false)
Определения tools.php:1598
AddEventHandler($FROM_MODULE_ID, $MESSAGE_ID, $CALLBACK, $SORT=100, $FULL_PATH=false)
Определения tools.php:5165
ShowError($strError, $cls="errortext")
Определения tools.php:4499
UnRegisterModuleDependences($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS="", $TO_METHOD="", $TO_PATH="", $TO_METHOD_ARG=[])
Определения tools.php:5289
RewriteFile($abs_path, $strContent)
Определения tools.php:2895
convert_close_quote_tag()
Определения tools.php:2376
DelDuplicateSort(&$arSort)
Определения tools.php:2055
SelectBoxMFromArray($strBoxName, $a, $arr, $strDetText="", $strDetText_selected=false, $size="5", $field1="class='typeselect'")
Определения tools.php:163
Calendar($fieldName, $formName="")
Определения tools.php:291
GetFileType($path)
Определения tools.php:3047
_FormatDateMessage($value, $messages, ?string $languageId=null)
Определения tools.php:766
convert_to_mailto($s, $link_class="")
Определения tools.php:2435
AddEventToStatFile($module, $action, $tag, $label, $action_type='', $user_id=null)
Определения tools.php:3976
htmlspecialcharsEx($str)
Определения tools.php:2685
HTMLToTxt($str, $strSiteUrl="", $aDelete=[], $maxlen=70)
Определения tools.php:2587
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
GetTime($timestamp, $type="SHORT", $site=false, $bSearchInSitesOnly=false)
Определения tools.php:1890
IncludeAJAX()
Определения tools.php:4719
init_get_params($url)
Определения tools.php:4438
TxtToHTML( $str, $bMakeUrls=true, $iMaxStringLen=0, $QUOTE_ENABLED="N", $NOT_CONVERT_AMPERSAND="Y", $CODE_ENABLED="N", $BIU_ENABLED="N", $quote_table_class="quotetable", $quote_head_class="tdquotehead", $quote_body_class="tdquote", $code_table_class="codetable", $code_head_class="tdcodehead", $code_body_class="tdcodebody", $code_textarea_class="codetextarea", $link_class="txttohtmllink", $arUrlEvent=[], $link_target="_self")
Определения tools.php:2442
GetRandomCode($len=8)
Определения tools.php:2180
ConvertTimeStamp($timestamp=false, $type="SHORT", $site=false, $bSearchInSitesOnly=false)
Определения tools.php:733
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
RegisterModule($id)
Определения tools.php:5155
GetNumMonth($month)
Определения tools.php:519
HasMessage($name)
Определения tools.php:3418
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
DeleteDirFilesEx($path, $root=null)
Определения tools.php:2823
Rel2Abs($curdir, $relpath)
Определения tools.php:3297
is_set($a, $k=false)
Определения tools.php:2133
CopyDirFiles($path_from, $path_to, $ReWrite=true, $Recursive=false, $bDeleteAfterCopy=false, $strExclude="")
Определения tools.php:2732
GetMessage($name, $aReplace=null)
Определения tools.php:3397
FormDecode()
Определения tools.php:4212
BXClearCache($full=false, $initdir='')
Определения tools.php:5150
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")
Определения tools.php:4022
ParseDate($strDate, $format="dmy")
Определения tools.php:1951
sortByColumn(array &$array, $columns, $callbacks='', $defaultValueIfNotSetValue=null, $preserveKeys=false)
Определения tools.php:5087
check_email($email, $strict=false, $domainCheck=false)
Определения tools.php:4571
IsConfigFile(string $path)
Определения tools.php:3028
array_convert_name_2_value($arr)
Определения tools.php:2084
AddToTimeStamp($arrAdd, $stmp=false)
Определения tools.php:687
getLocalPath($path, $baseFolder="/bitrix")
Определения tools.php:5092
CheckDateTime($datetime, $format=false)
Определения tools.php:398
IsIE()
Определения tools.php:4103
_normalizePath($strPath)
Определения tools.php:3341
MkDateTime($strDT, $format="d.m.Y H:i:s")
Определения tools.php:1977
bitrix_sessid_set($val=false)
Определения tools.php:4667
ShowNote($strNote, $cls="notetext")
Определения tools.php:4477
randString($pass_len=10, $pass_chars=false)
Определения tools.php:2154
GetLangFileName($before, $after, $lang=false)
Определения tools.php:3428
convertTimeToMilitary($strTime, $fromFormat='H:MI T', $toFormat='HH:MI')
Определения tools.php:820
getmicrotime()
Определения tools.php:23
FormatDateFromDB($date, $format='FULL', $phpFormat=false)
Определения tools.php:1875
UnEscapePHPString($str, $encloser='"')
Определения tools.php:4933
xmlize_xmldata($data)
Определения tools.php:4306
ini_get_bool($param)
Определения tools.php:5067
GetFileNameWithoutExtension($path)
Определения tools.php:2986
__IncludeLang($path, $bReturnArray=false, $bFileChecked=false)
Определения tools.php:3477
convert_to_href($url, $link_class="", $event1="", $event2="", $event3="", $script="", $link_target="_self")
Определения tools.php:2423
GetFileName($path)
Определения tools.php:3001
GetWhoisLink($ip, $class='')
Определения tools.php:4096
MakeTimeStamp($datetime, $format=false)
Определения tools.php:538
InitBVar(&$var)
Определения tools.php:4433
bxmail($to, $subject, $message, $additional_headers="", $additional_parameters="", Main\Mail\Context $context=null)
Определения tools.php:4999
IncludeTemplateLangFile($filepath, $lang=false)
Определения tools.php:3615
xml_depth_xmldata($vals, &$i)
Определения tools.php:4333
bitrix_sessid_get($varname='sessid')
Определения tools.php:4695
UnRegisterModule($id)
Определения tools.php:5160
LocalRedirect($url, $skip_security_check=false, $status="302 Found")
Определения tools.php:4005
$SHOWIMAGEFIRST
Определения tools.php:5143
global $ALL_LANG_FILES
Определения tools.php:3424
GetDirIndex($path, $strDirIndex=false)
Определения tools.php:3094
SelectBoxFromArray( $strBoxName, $db_array, $strSelectedVal="", $strDetText="", $field1="class='typeselect'", $go=false, $form="form1")
Определения tools.php:216
RemoveEventHandler($FROM_MODULE_ID, $MESSAGE_ID, $iEventHandlerKey)
Определения tools.php:5171
TruncateText($strText, $intLen)
Определения tools.php:2185
TrimEx($str, $symbol, $side="both")
Определения tools.php:2222
convert_quote_tag($text='', $quote_table_class='', $quote_head_class='', $quote_body_class='')
Определения tools.php:2388
AddTime($stmp, $add, $type="D")
Определения tools.php:1909
convert_code_tag_for_html_after($text='', $code_table_class='', $code_head_class='', $code_body_class='', $code_textarea_class='')
Определения tools.php:2358
GetMessageJS($name, $aReplace=false)
Определения tools.php:3392
$name
Определения menu_edit.php:35
Определения culture.php:9
Определения cachetracker.php:2
Определения address.php:8
Определения base32.php:2
Определения collection.php:2
$order
Определения payment.php:8
$year
Определения payment.php:9
$country
Определения payment.php:59
$time
Определения payment.php:61
$var
Определения payment.php:63
$email
Определения payment.php:49
$message
Определения payment.php:8
$arFiles
Определения options.php:60
$event
Определения prolog_after.php:141
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$ar
Определения options.php:199
$dir
Определения quickway.php:303
if(empty($signedUserToken)) $key
Определения quickway.php:257
$text
Определения template_pdf.php:79
const ADMIN_SECTION
Определения rss.php:2
$i
Определения factura.php:643
$page
Определения order_form.php:33
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
$width
Определения html.php:68
$messages
Определения template.php:8
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
else $a
Определения template.php:137
$title
Определения pdf.php:123
$val
Определения options.php:1793
$eventManager
Определения include.php:412
const SITE_ID
Определения sonet_set_content_view.php:12
$error
Определения subscription_card_product.php:20
$k
Определения template_pdf.php:567
$localPath
Определения template_copy.php:184
$action
Определения file_dialog.php:21
$GLOBALS['_____370096793']
Определения update_client.php:1
$n
Определения update_log.php:107
$url
Определения iframe.php:7
$site
Определения yandex_run.php:614