1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
jscore.php
См. документацию.
1<?php
2
4use Bitrix\Main\Page\Asset;
8
9class CJSCore
10{
11 const USE_ADMIN = 'admin';
12 const USE_PUBLIC = 'public';
13
14 private static $arRegisteredExt = array();
15 private static $arCurrentlyLoadedExt = array();
16
17 private static $bInited = false;
18
19 /*
20 ex: CJSCore::RegisterExt('timeman', array(
21 'js' => '/bitrix/js/timeman/core_timeman.js',
22 'css' => '/bitrix/js/timeman/css/core_timeman.css',
23 'lang' => '/bitrix/modules/timeman/js_core_timeman.php',
24 'rel' => array(needed extensions for automatic inclusion),
25 'use' => CJSCore::USE_ADMIN|CJSCore::USE_PUBLIC
26 ));
27 */
28 public static function RegisterExt($name, $arPaths)
29 {
30 if(isset($arPaths['use']))
31 {
32 switch($arPaths['use'])
33 {
35 if(defined("ADMIN_SECTION") && ADMIN_SECTION === true)
36 return;
37
38 break;
40 if(!defined("ADMIN_SECTION") || ADMIN_SECTION !== true)
41 return;
42
43 break;
44 }
45 }
46
47 //An old path format required a language id.
48 if (isset($arPaths['lang']))
49 {
50 if (is_array($arPaths['lang']))
51 {
52 foreach ($arPaths['lang'] as $key => $lang)
53 {
54 $arPaths['lang'][$key] = str_replace('/lang/'.LANGUAGE_ID.'/', '/', $lang);
55 }
56 }
57 else
58 {
59 $arPaths['lang'] = str_replace('/lang/'.LANGUAGE_ID.'/', '/', $arPaths['lang']);
60 }
61 }
62
63 self::$arRegisteredExt[$name] = $arPaths;
64 }
65
66 public static function Init($arExt = array(), $bReturn = false)
67 {
68 if (!self::$bInited)
69 {
70 self::_RegisterStandardExt();
71 self::$bInited = true;
72 }
73
74 if (!is_array($arExt) && $arExt <> '')
75 $arExt = array($arExt);
76
77 $bReturn = ($bReturn === true); // prevent syntax mistake
78
79 $bNeedCore = false;
80 if (!empty($arExt))
81 {
82 foreach ($arExt as $ext)
83 {
84 if (
85 isset(self::$arRegisteredExt[$ext])
86 && (
87 !isset(self::$arRegisteredExt[$ext]['skip_core'])
88 || !self::$arRegisteredExt[$ext]['skip_core']
89 )
90 )
91 {
92 $bNeedCore = true;
93 break;
94 }
95 }
96 }
97 else
98 {
99 $bNeedCore = true;
100 }
101
102 $ret = '';
103
104 if ($bNeedCore && !self::isCoreLoaded())
105 {
106 $config = self::getCoreConfig();
107
109 self::markExtensionLoaded('main.core');
110
111 $includes = '';
112 if (is_array($config['includes']))
113 {
114 foreach ($config['includes'] as $item)
115 {
117 }
118
119 $assets = Extension::getAssets($config['includes']);
120 $includes .= static::registerAssetsAsLoaded($assets);
121 }
122
123 $relativities = '';
124
125 if (is_array($config['rel']))
126 {
127 $relativities .= self::init($config['rel'], true);
128 }
129
130 $coreLang = self::_loadLang($config['lang'], true);
131 $coreSettings = self::loadSettings('main.core', $config['settings'], true);
132 $coreJs = self::_loadJS($config['js'], true);
133 $registerExtension = self::registerExtensionAsLoaded('main.core', true);
134
135 if ($bReturn)
136 {
137 $ret .= $coreLang;
138 $ret .= $coreSettings;
139 $ret .= $relativities;
140 $ret .= $coreJs;
141 $ret .= $registerExtension;
142 $ret .= $includes;
143 }
144
145 $asset = Asset::getInstance();
146 $asset->addString($coreLang, true, AssetLocation::AFTER_CSS);
147 $asset->addString($coreSettings, true, AssetLocation::AFTER_CSS);
148 $asset->addString($relativities, true, AssetLocation::AFTER_CSS);
149 $asset->addString($coreJs, true, AssetLocation::AFTER_CSS);
150 $asset->addString($registerExtension, true, AssetLocation::AFTER_CSS);
151 $asset->addString($includes, true, AssetLocation::AFTER_CSS);
152 }
153
154 for ($i = 0, $len = count($arExt); $i < $len; $i++)
155 {
156 $ret .= self::_loadExt($arExt[$i], $bReturn);
157 }
158
159 if (!defined('PUBLIC_MODE') && defined('BX_PUBLIC_MODE') && BX_PUBLIC_MODE == 1)
160 echo $ret;
161
162 return $bReturn ? $ret : true;
163 }
164
165 protected static function registerAssetsAsLoaded($assets)
166 {
167 if (is_array($assets))
168 {
169 $result = '';
170
171 if (!empty($assets['js']) && is_array($assets['js']))
172 {
173 $result .= "BX.setJSList(".Json::encode($assets['js']).");\n";
174 }
175
176 if (!empty($assets['css']) && is_array($assets['css']))
177 {
178 $result .= "BX.setCSSList(".Json::encode($assets['css']).");";
179 }
180
181 return '<script>'.$result.'</script>';
182 }
183
184 return '';
185 }
186
190 public static function markExtensionLoaded($code)
191 {
192 self::$arCurrentlyLoadedExt[$code] = true;
193 }
194
199 public static function IsCoreLoaded()
200 {
201 return (
202 self::isExtensionLoaded("core")
203 || self::isExtensionLoaded("main.core")
204 );
205 }
206
212 public static function isExtensionLoaded($code)
213 {
214 return isset(self::$arCurrentlyLoadedExt[$code]) && self::$arCurrentlyLoadedExt[$code];
215 }
216
217 public static function GetCoreMessagesScript($compositeMode = false)
218 {
219 if (!self::IsCoreLoaded())
220 {
221 return "";
222 }
223
224 return self::_loadLang("", true, self::GetCoreMessages($compositeMode));
225 }
226
227 public static function GetCoreMessages($compositeMode = false)
228 {
229 $arMessages = array(
230 "LANGUAGE_ID" => LANGUAGE_ID,
231 "FORMAT_DATE" => FORMAT_DATE,
232 "FORMAT_DATETIME" => FORMAT_DATETIME,
233 "COOKIE_PREFIX" => COption::GetOptionString("main", "cookie_name", "BITRIX_SM"),
234 "SERVER_TZ_OFFSET" => date("Z"),
235 "UTF_MODE" => 'Y',
236 );
237
238 if (!defined("ADMIN_SECTION") || ADMIN_SECTION !== true)
239 {
240 $arMessages["SITE_ID"] = SITE_ID;
241 $arMessages["SITE_DIR"] = SITE_DIR;
242 }
243
244 if (!$compositeMode)
245 {
246 global $USER;
247 $userId = "";
248 $autoTimeZone = "N";
249 if (is_object($USER))
250 {
251 $autoTimeZone = $USER->GetParam("AUTO_TIME_ZONE");
252 $autoTimeZone = $autoTimeZone ? trim($USER->GetParam("AUTO_TIME_ZONE")) : null;
253 if ($USER->GetID() > 0)
254 {
255 $userId = $USER->GetID();
256 }
257 }
258
259 $arMessages["USER_ID"] = $userId;
260 $arMessages["SERVER_TIME"] = time();
261 $arMessages["USER_TZ_OFFSET"] = CTimeZone::GetOffset();
262 $arMessages["USER_TZ_AUTO"] = $autoTimeZone === "N" ? "N": "Y";
263 $arMessages["bitrix_sessid"] = bitrix_sessid();
264 }
265
266 return $arMessages;
267 }
268
269 public static function GetHTML($arExt)
270 {
271 $tmp = self::$arCurrentlyLoadedExt;
272 self::$arCurrentlyLoadedExt = array();
273 $res = self::Init($arExt, true);
274 self::$arCurrentlyLoadedExt = $tmp;
275 return $res;
276 }
277
283 public static function GetInlineCoreJs()
284 {
285 $js = <<<JS
286 (function(w, d, n) {
287
288 var cl = "bx-core";
289 var ht = d.documentElement;
290 var htc = ht ? ht.className : undefined;
291 if (htc === undefined || htc.indexOf(cl) !== -1)
292 {
293 return;
294 }
295
296 var ua = n.userAgent;
297 if (/(iPad;)|(iPhone;)/i.test(ua))
298 {
299 cl += " bx-ios";
300 }
301 else if (/Windows/i.test(ua))
302 {
303 cl += ' bx-win';
304 }
305 else if (/Macintosh/i.test(ua))
306 {
307 cl += " bx-mac";
308 }
309 else if (/Linux/i.test(ua) && !/Android/i.test(ua))
310 {
311 cl += " bx-linux";
312 }
313 else if (/Android/i.test(ua))
314 {
315 cl += " bx-android";
316 }
317
318 cl += (/(ipad|iphone|android|mobile|touch)/i.test(ua) ? " bx-touch" : " bx-no-touch");
319
320 cl += w.devicePixelRatio && w.devicePixelRatio >= 2
321 ? " bx-retina"
322 : " bx-no-retina";
323
324 if (/AppleWebKit/.test(ua))
325 {
326 cl += " bx-chrome";
327 }
328 else if (/Opera/.test(ua))
329 {
330 cl += " bx-opera";
331 }
332 else if (/Firefox/.test(ua))
333 {
334 cl += " bx-firefox";
335 }
336
337 ht.className = htc ? htc + " " + cl : cl;
338
339 })(window, document, navigator);
340JS;
341 return '<script data-skip-moving="true">'.str_replace(array("\n", "\t"), "", $js)."</script>";
342 }
343
344 public static function GetScriptsList()
345 {
346 $scriptsList = array();
347 foreach(self::$arCurrentlyLoadedExt as $ext=>$q)
348 {
349 if($ext!='core' && isset(self::$arRegisteredExt[$ext]['js']))
350 {
351 if(is_array(self::$arRegisteredExt[$ext]['js']))
352 {
353 $scriptsList = array_merge($scriptsList, self::$arRegisteredExt[$ext]['js']);
354 }
355 else
356 {
357 $scriptsList[] = self::$arRegisteredExt[$ext]['js'];
358 }
359 }
360 }
361 return $scriptsList;
362 }
363
364 public static function GetCoreConfig()
365 {
366 return Extension::getConfig('main.core');
367 }
368
369 private static function _loadExt($ext, $bReturn)
370 {
371 $ret = '';
372
373 if (!self::IsExtRegistered($ext))
374 {
375 $success = Extension::register($ext);
376 if (!$success)
377 {
378 return "";
379 }
380 }
381
382 if (self::isExtensionLoaded($ext))
383 {
384 return "";
385 }
386
387 if(isset(self::$arRegisteredExt[$ext]['oninit']) && is_callable(self::$arRegisteredExt[$ext]['oninit']))
388 {
389 $callbackResult = call_user_func_array(
390 self::$arRegisteredExt[$ext]['oninit'],
391 array(self::$arRegisteredExt[$ext])
392 );
393
394 if(is_array($callbackResult))
395 {
396 foreach($callbackResult as $key => $value)
397 {
398 if(!is_array($value))
399 {
400 $value = array($value);
401 }
402
403 if(!isset(self::$arRegisteredExt[$ext][$key]))
404 {
405 self::$arRegisteredExt[$ext][$key] = array();
406 }
407 elseif(!is_array(self::$arRegisteredExt[$ext][$key]))
408 {
409 self::$arRegisteredExt[$ext][$key] = array(self::$arRegisteredExt[$ext][$key]);
410 }
411
412 self::$arRegisteredExt[$ext][$key] = array_merge(self::$arRegisteredExt[$ext][$key], $value);
413 }
414 }
415
416 unset(self::$arRegisteredExt[$ext]['oninit']);
417 }
418
420
421 if (isset(self::$arRegisteredExt[$ext]['rel']) && is_array(self::$arRegisteredExt[$ext]['rel']))
422 {
423 foreach (self::$arRegisteredExt[$ext]['rel'] as $rel_ext)
424 {
425 $ret .= self::_loadExt($rel_ext, $bReturn);
426 }
427 }
428
429 if (!empty(self::$arRegisteredExt[$ext]['css']))
430 {
431 if (!empty(self::$arRegisteredExt[$ext]['bundle_css']))
432 {
433 self::registerCssBundle(
434 self::$arRegisteredExt[$ext]['bundle_css'],
435 self::$arRegisteredExt[$ext]['css']
436 );
437 }
438
439 $ret .= self::_loadCSS(self::$arRegisteredExt[$ext]['css'], $bReturn);
440 }
441
442 if (isset(self::$arRegisteredExt[$ext]['js']))
443 {
444 if (!empty(self::$arRegisteredExt[$ext]['bundle_js']))
445 {
446 self::registerJsBundle(
447 self::$arRegisteredExt[$ext]['bundle_js'],
448 self::$arRegisteredExt[$ext]['js']
449 );
450 }
451
452 $ret .= self::_loadJS(self::$arRegisteredExt[$ext]['js'], $bReturn);
453 }
454
455 if (isset(self::$arRegisteredExt[$ext]['lang']) || isset(self::$arRegisteredExt[$ext]['lang_additional']))
456 {
457 $ret .= self::_loadLang(
458 self::$arRegisteredExt[$ext]['lang'] ?? null,
459 $bReturn,
460 !empty(self::$arRegisteredExt[$ext]['lang_additional'])? self::$arRegisteredExt[$ext]['lang_additional']: false
461 );
462 }
463
464 if (isset(self::$arRegisteredExt[$ext]['settings']))
465 {
466 $ret .= self::loadSettings($ext, self::$arRegisteredExt[$ext]['settings'], $bReturn);
467 }
468
469 if (isset(self::$arRegisteredExt[$ext]['post_rel']) && is_array(self::$arRegisteredExt[$ext]['post_rel']))
470 {
471 foreach (self::$arRegisteredExt[$ext]['post_rel'] as $rel_ext)
472 {
473 $ret .= self::_loadExt($rel_ext, $bReturn);
474 }
475 }
476
477 $ret .= self::registerExtensionAsLoaded($ext, $bReturn);
478
479 return $ret;
480 }
481
482 public static function registerExtensionAsLoaded($extension, $bReturn = false): string
483 {
484 if (self::isCoreLoaded())
485 {
486 $options = [
487 'name' => $extension,
488 'namespace' => 'window',
489 'loaded' => true,
490 ];
491
492 $bundleConfig = Extension::getBundleConfig($extension);
493 if (is_array($bundleConfig))
494 {
495 if (isset($bundleConfig['namespace']) && is_string($bundleConfig['namespace']))
496 {
497 $options['namespace'] = $bundleConfig['namespace'];
498 }
499 }
500
501 $jsOptions = Json::encode($options);
502 $result = '<script>BX.Runtime.registerExtension(' . $jsOptions . ');</script>';
503
504 if ($bReturn)
505 {
506 return $result;
507 }
508
509 Asset::getInstance()->addString($result, true, AssetLocation::AFTER_CSS);
510 }
511
512 return '';
513 }
514
515 public static function ShowTimer($params)
516 {
517 $id = $params['id'] ? $params['id'] : 'timer_'.RandString(7);
518
519 self::Init(array('timer'));
520
521 $arJSParams = array();
522 if ($params['from'])
523 $arJSParams['from'] = MakeTimeStamp($params['from']).'000';
524 elseif ($params['to'])
525 $arJSParams['to'] = MakeTimeStamp($params['to']).'000';
526
527 if ($params['accuracy'])
528 $arJSParams['accuracy'] = intval($params['accuracy']).'000';
529
530 $res = '<span id="'.htmlspecialcharsbx($id).'"></span>';
531 $res .= '<script>BX.timer(\''.CUtil::JSEscape($id).'\', '.Json::encode($arJSParams).')</script>';
532
533 return $res;
534 }
535
536 public static function IsExtRegistered($ext)
537 {
538 return isset(self::$arRegisteredExt[$ext]) && is_array(self::$arRegisteredExt[$ext]);
539 }
540
541 public static function getExtInfo($ext)
542 {
543 return self::$arRegisteredExt[$ext] ?? null;
544 }
545
546 private static function _RegisterStandardExt()
547 {
548 require_once($_SERVER['DOCUMENT_ROOT'].BX_ROOT.'/modules/main/jscore.php');
549 }
550
551 private static function _loadJS($js, $bReturn)
552 {
554 global $APPLICATION;
555
556 $js = (is_array($js) ? $js : array($js));
557 if ($bReturn)
558 {
559 $res = '';
560 foreach ($js as $val)
561 {
562 $fullPath = Asset::getInstance()->getFullAssetPath($val);
563
564 if ($fullPath)
565 {
566 $res .= '<script src="'.$fullPath.'"></script>'."\r\n";
567 }
568 }
569 return $res;
570 }
571 else
572 {
573 foreach ($js as $val)
574 {
575 $APPLICATION->AddHeadScript($val);
576 }
577 }
578 return '';
579 }
580
581 private static function _loadLang($lang, $bReturn, $arAdditionalMess = false)
582 {
584 global $APPLICATION;
585 $jsMsg = '';
586
587 if (!is_array($lang))
588 {
589 $lang = [$lang];
590 }
591
592 foreach ($lang as $path)
593 {
594 if (is_string($path))
595 {
596 $messLang = \Bitrix\Main\Localization\Loc::loadLanguageFile($_SERVER['DOCUMENT_ROOT'].$path);
597 if (!empty($messLang))
598 {
599 $jsMsg .= '(window.BX||top.BX).message('.Json::encode($messLang).');';
600 }
601 }
602 }
603
604 if (is_array($arAdditionalMess))
605 {
606 $jsMsg = '(window.BX||top.BX).message('.Json::encode($arAdditionalMess).');'.$jsMsg;
607 }
608
609 if ($jsMsg !== '')
610 {
611 $jsMsg = '<script>'.$jsMsg.'</script>';
612 if ($bReturn)
613 {
614 return $jsMsg."\r\n";
615 }
616 else
617 {
618 $APPLICATION->AddLangJS($jsMsg);
619 }
620 }
621
622 return $jsMsg;
623 }
624
625 private static function _loadCSS($css, $bReturn)
626 {
628 global $APPLICATION;
629
630 if (is_array($css))
631 {
632 $ret = '';
633 foreach ($css as $css_file)
634 $ret .= self::_loadCSS($css_file, $bReturn);
635 return $ret;
636 }
637
638 $css_filename = $_SERVER['DOCUMENT_ROOT'].$css;
639
640 if (!file_exists($css_filename))
641 return '';
642
643 if ($bReturn)
644 {
645 $fullPath = Asset::getInstance()->getFullAssetPath($css);
646
647 if ($fullPath)
648 {
649 return '<link href="'.$fullPath.'" type="text/css" rel="stylesheet" />'."\r\n";
650 }
651
652 return '';
653 }
654
655 $APPLICATION->SetAdditionalCSS($css);
656
657 return '';
658 }
659
667 private static function loadSettings($extension, $settings, $bReturn = false)
668 {
669 if (is_array($settings) && !empty($settings))
670 {
671 $encodedSettings = Main\Web\Json::encode($settings);
672 $result = '<script type="extension/settings" data-extension="'.$extension.'">';
673 $result .= $encodedSettings;
674 $result .= '</script>';
675
676 if ($bReturn)
677 {
678 return $result;
679 }
680
681 Asset::getInstance()->addString($result, true, AssetLocation::AFTER_CSS);
682 }
683
684 return '';
685 }
686
687 private static function registerJsBundle($bundleName, $files)
688 {
689 $files = is_array($files) ? $files : array($files);
690
691 Asset::getInstance()->addJsKernelInfo($bundleName, $files);
692 }
693
694 private static function registerCssBundle($bundleName, $files)
695 {
696 $files = is_array($files) ? $files : array($files);
697
698 Asset::getInstance()->addCssKernelInfo($bundleName, $files);
699 }
700}
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
Определения json.php:9
Определения jscore.php:10
static GetCoreMessages($compositeMode=false)
Определения jscore.php:227
static ShowTimer($params)
Определения jscore.php:515
static registerExtensionAsLoaded($extension, $bReturn=false)
Определения jscore.php:482
static Init($arExt=array(), $bReturn=false)
Определения jscore.php:66
static GetInlineCoreJs()
Определения jscore.php:283
static GetHTML($arExt)
Определения jscore.php:269
static GetScriptsList()
Определения jscore.php:344
static isExtensionLoaded($code)
Определения jscore.php:212
static GetCoreMessagesScript($compositeMode=false)
Определения jscore.php:217
const USE_PUBLIC
Определения jscore.php:12
static markExtensionLoaded($code)
Определения jscore.php:190
static RegisterExt($name, $arPaths)
Определения jscore.php:28
static registerAssetsAsLoaded($assets)
Определения jscore.php:165
static IsCoreLoaded()
Определения jscore.php:199
static GetCoreConfig()
Определения jscore.php:364
const USE_ADMIN
Определения jscore.php:11
$options
Определения commerceml2.php:49
if(!is_array($prop["VALUES"])) $tmp
Определения component_props.php:203
const BX_PUBLIC_MODE
Определения file_edit.php:2
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
bx_acc_lim_group_list limitGroupList[] multiple<?=$group[ 'ID']?> ID selected margin top
Определения file_new.php:657
$res
Определения filter_act.php:7
$result
Определения get_property_values.php:14
$arPaths
Определения options.php:169
global $USER
Определения csv_new_run.php:40
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
$success
Определения mail_entry.php:69
const SITE_DIR(!defined('LANG'))
Определения include.php:72
const FORMAT_DATETIME
Определения include.php:64
if(!defined('SITE_ID')) $lang
Определения include.php:91
const FORMAT_DATE
Определения include.php:63
bitrix_sessid()
Определения tools.php:4656
MakeTimeStamp($datetime, $format=false)
Определения tools.php:538
$name
Определения menu_edit.php:35
$value
Определения Param.php:39
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$config
Определения quickway.php:69
if(empty($signedUserToken)) $key
Определения quickway.php:257
const ADMIN_SECTION
Определения rss.php:2
$i
Определения factura.php:643
</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
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
const SITE_ID
Определения sonet_set_content_view.php:12