14 private static $arRegisteredExt =
array();
15 private static $arCurrentlyLoadedExt =
array();
17 private static $bInited =
false;
59 $arPaths[
'lang'] = str_replace(
'/lang/'.LANGUAGE_ID.
'/',
'/',
$arPaths[
'lang']);
66 public static function Init($arExt =
array(), $bReturn =
false)
70 self::_RegisterStandardExt();
71 self::$bInited =
true;
74 if (!is_array($arExt) && $arExt <>
'')
75 $arExt =
array($arExt);
77 $bReturn = ($bReturn ===
true);
82 foreach ($arExt as $ext)
85 isset(self::$arRegisteredExt[$ext])
87 !isset(self::$arRegisteredExt[$ext][
'skip_core'])
88 || !self::$arRegisteredExt[$ext][
'skip_core']
104 if ($bNeedCore && !self::isCoreLoaded())
106 $config = self::getCoreConfig();
112 if (is_array(
$config[
'includes']))
114 foreach (
$config[
'includes'] as $item)
119 $assets = Extension::getAssets(
$config[
'includes']);
120 $includes .= static::registerAssetsAsLoaded($assets);
127 $relativities .= self::init(
$config[
'rel'],
true);
130 $coreLang = self::_loadLang(
$config[
'lang'],
true);
131 $coreSettings = self::loadSettings(
'main.core',
$config[
'settings'],
true);
132 $coreJs = self::_loadJS(
$config[
'js'],
true);
138 $ret .= $coreSettings;
139 $ret .= $relativities;
141 $ret .= $registerExtension;
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);
154 for (
$i = 0, $len =
count($arExt);
$i < $len;
$i++)
156 $ret .= self::_loadExt($arExt[
$i], $bReturn);
159 if (!defined(
'PUBLIC_MODE') && defined(
'BX_PUBLIC_MODE') &&
BX_PUBLIC_MODE == 1)
162 return $bReturn ? $ret :
true;
167 if (is_array($assets))
171 if (!empty($assets[
'js']) && is_array($assets[
'js']))
173 $result .=
"BX.setJSList(".Json::encode($assets[
'js']).
");\n";
176 if (!empty($assets[
'css']) && is_array($assets[
'css']))
178 $result .=
"BX.setCSSList(".Json::encode($assets[
'css']).
");";
181 return '<script>'.$result.
'</script>';
192 self::$arCurrentlyLoadedExt[
$code] =
true;
202 self::isExtensionLoaded(
"core")
203 || self::isExtensionLoaded(
"main.core")
214 return isset(self::$arCurrentlyLoadedExt[
$code]) && self::$arCurrentlyLoadedExt[
$code];
219 if (!self::IsCoreLoaded())
224 return self::_loadLang(
"",
true, self::GetCoreMessages($compositeMode));
230 "LANGUAGE_ID" => LANGUAGE_ID,
233 "COOKIE_PREFIX" => COption::GetOptionString(
"main",
"cookie_name",
"BITRIX_SM"),
234 "SERVER_TZ_OFFSET" => date(
"Z"),
240 $arMessages[
"SITE_ID"] =
SITE_ID;
249 if (is_object(
$USER))
251 $autoTimeZone =
$USER->GetParam(
"AUTO_TIME_ZONE");
252 $autoTimeZone = $autoTimeZone ? trim(
$USER->GetParam(
"AUTO_TIME_ZONE")) :
null;
253 if (
$USER->GetID() > 0)
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";
271 $tmp = self::$arCurrentlyLoadedExt;
272 self::$arCurrentlyLoadedExt =
array();
274 self::$arCurrentlyLoadedExt =
$tmp;
289 var ht = d.documentElement;
290 var htc = ht ? ht.className : undefined;
291 if (htc === undefined || htc.indexOf(cl) !== -1)
296 var ua = n.userAgent;
297 if (/(iPad;)|(iPhone;)/i.test(ua))
301 else if (/Windows/i.test(ua))
305 else if (/Macintosh/i.test(ua))
309 else if (/Linux/i.test(ua) && !/Android/i.test(ua))
313 else if (/Android/i.test(ua))
318 cl += (/(ipad|iphone|android|mobile|touch)/i.test(ua) ?
" bx-touch" :
" bx-no-touch");
320 cl += w.devicePixelRatio && w.devicePixelRatio >= 2
324 if (/AppleWebKit/.test(ua))
328 else if (/Opera/.test(ua))
332 else if (/Firefox/.test(ua))
337 ht.className = htc ? htc +
" " + cl : cl;
339 })(window, document, navigator);
341 return '<script data-skip-moving="true">'.str_replace(
array(
"\n",
"\t"),
"", $js).
"</script>";
346 $scriptsList =
array();
347 foreach(self::$arCurrentlyLoadedExt as $ext=>$q)
349 if($ext!=
'core' && isset(self::$arRegisteredExt[$ext][
'js']))
351 if(is_array(self::$arRegisteredExt[$ext][
'js']))
353 $scriptsList = array_merge($scriptsList, self::$arRegisteredExt[$ext][
'js']);
357 $scriptsList[] = self::$arRegisteredExt[$ext][
'js'];
366 return Extension::getConfig(
'main.core');
369 private static function _loadExt($ext, $bReturn)
373 if (!self::IsExtRegistered($ext))
375 $success = Extension::register($ext);
382 if (self::isExtensionLoaded($ext))
387 if(isset(self::$arRegisteredExt[$ext][
'oninit']) && is_callable(self::$arRegisteredExt[$ext][
'oninit']))
389 $callbackResult = call_user_func_array(
390 self::$arRegisteredExt[$ext][
'oninit'],
391 array(self::$arRegisteredExt[$ext])
394 if(is_array($callbackResult))
396 foreach($callbackResult as
$key => $value)
398 if(!is_array($value))
403 if(!isset(self::$arRegisteredExt[$ext][
$key]))
405 self::$arRegisteredExt[$ext][
$key] =
array();
407 elseif(!is_array(self::$arRegisteredExt[$ext][
$key]))
409 self::$arRegisteredExt[$ext][
$key] =
array(self::$arRegisteredExt[$ext][
$key]);
412 self::$arRegisteredExt[$ext][
$key] = array_merge(self::$arRegisteredExt[$ext][
$key], $value);
416 unset(self::$arRegisteredExt[$ext][
'oninit']);
421 if (isset(self::$arRegisteredExt[$ext][
'rel']) && is_array(self::$arRegisteredExt[$ext][
'rel']))
423 foreach (self::$arRegisteredExt[$ext][
'rel'] as $rel_ext)
425 $ret .= self::_loadExt($rel_ext, $bReturn);
429 if (!empty(self::$arRegisteredExt[$ext][
'css']))
431 if (!empty(self::$arRegisteredExt[$ext][
'bundle_css']))
433 self::registerCssBundle(
434 self::$arRegisteredExt[$ext][
'bundle_css'],
435 self::$arRegisteredExt[$ext][
'css']
439 $ret .= self::_loadCSS(self::$arRegisteredExt[$ext][
'css'], $bReturn);
442 if (isset(self::$arRegisteredExt[$ext][
'js']))
444 if (!empty(self::$arRegisteredExt[$ext][
'bundle_js']))
446 self::registerJsBundle(
447 self::$arRegisteredExt[$ext][
'bundle_js'],
448 self::$arRegisteredExt[$ext][
'js']
452 $ret .= self::_loadJS(self::$arRegisteredExt[$ext][
'js'], $bReturn);
455 if (isset(self::$arRegisteredExt[$ext][
'lang']) || isset(self::$arRegisteredExt[$ext][
'lang_additional']))
457 $ret .= self::_loadLang(
458 self::$arRegisteredExt[$ext][
'lang'] ??
null,
460 !empty(self::$arRegisteredExt[$ext][
'lang_additional'])? self::$arRegisteredExt[$ext][
'lang_additional']:
false
464 if (isset(self::$arRegisteredExt[$ext][
'settings']))
466 $ret .= self::loadSettings($ext, self::$arRegisteredExt[$ext][
'settings'], $bReturn);
469 if (isset(self::$arRegisteredExt[$ext][
'post_rel']) && is_array(self::$arRegisteredExt[$ext][
'post_rel']))
471 foreach (self::$arRegisteredExt[$ext][
'post_rel'] as $rel_ext)
473 $ret .= self::_loadExt($rel_ext, $bReturn);
484 if (self::isCoreLoaded())
487 'name' => $extension,
488 'namespace' =>
'window',
492 $bundleConfig = Extension::getBundleConfig($extension);
493 if (is_array($bundleConfig))
495 if (isset($bundleConfig[
'namespace']) && is_string($bundleConfig[
'namespace']))
497 $options[
'namespace'] = $bundleConfig[
'namespace'];
501 $jsOptions = Json::encode(
$options);
502 $result =
'<script>BX.Runtime.registerExtension(' . $jsOptions .
');</script>';
509 Asset::getInstance()->addString(
$result,
true, AssetLocation::AFTER_CSS);
521 $arJSParams =
array();
528 $arJSParams[
'accuracy'] = intval(
$params[
'accuracy']).
'000';
530 $res =
'<span id="'.htmlspecialcharsbx($id).
'"></span>';
531 $res .=
'<script>BX.timer(\''.CUtil::JSEscape($id).
'\',
'.Json::encode($arJSParams).')</script>
';
536 public static function IsExtRegistered($ext)
538 return isset(self::$arRegisteredExt[$ext]) && is_array(self::$arRegisteredExt[$ext]);
541 public static function getExtInfo($ext)
543 return self::$arRegisteredExt[$ext] ?? null;
546 private static function _RegisterStandardExt()
548 require_once($_SERVER['DOCUMENT_ROOT
'].BX_ROOT.'/modules/main/jscore.php
');
551 private static function _loadJS($js, $bReturn)
556 $js = (is_array($js) ? $js : array($js));
560 foreach ($js as $val)
562 $fullPath = Asset::getInstance()->getFullAssetPath($val);
566 $res .= '<script src=
"'.$fullPath.'"></script>
'."\r\n";
573 foreach ($js as $val)
575 $APPLICATION->AddHeadScript($val);
581 private static function _loadLang($lang, $bReturn, $arAdditionalMess = false)
587 if (!is_array($lang))
592 foreach ($lang as $path)
594 if (is_string($path))
596 $messLang = \Bitrix\Main\Localization\Loc::loadLanguageFile($_SERVER['DOCUMENT_ROOT
'].$path);
597 if (!empty($messLang))
599 $jsMsg .= '(window.BX||
top.BX).message(
'.Json::encode($messLang).');
';
604 if (is_array($arAdditionalMess))
606 $jsMsg = '(window.BX||
top.BX).message(
'.Json::encode($arAdditionalMess).');
'.$jsMsg;
611 $jsMsg = '<script>
'.$jsMsg.'</script>
';
614 return $jsMsg."\r\n";
618 $APPLICATION->AddLangJS($jsMsg);
625 private static function _loadCSS($css, $bReturn)
633 foreach ($css as $css_file)
634 $ret .= self::_loadCSS($css_file, $bReturn);
638 $css_filename = $_SERVER['DOCUMENT_ROOT
'].$css;
640 if (!file_exists($css_filename))
645 $fullPath = Asset::getInstance()->getFullAssetPath($css);
649 return '<link href=
"'.$fullPath.'" type=
"text/css" rel=
"stylesheet" />
'."\r\n";
655 $APPLICATION->SetAdditionalCSS($css);
667 private static function loadSettings($extension, $settings, $bReturn = false)
669 if (is_array($settings) && !empty($settings))
671 $encodedSettings = Main\Web\Json::encode($settings);
672 $result = '<script type=
"extension/settings" data-extension=
"'.$extension.'">
';
673 $result .= $encodedSettings;
674 $result .= '</script>
';
681 Asset::getInstance()->addString($result, true, AssetLocation::AFTER_CSS);
687 private static function registerJsBundle($bundleName, $files)
689 $files = is_array($files) ? $files : array($files);
691 Asset::getInstance()->addJsKernelInfo($bundleName, $files);
694 private static function registerCssBundle($bundleName, $files)
696 $files = is_array($files) ? $files : array($files);
698 Asset::getInstance()->addCssKernelInfo($bundleName, $files);
const SITE_DIR(!defined('LANG'))
if(!defined('SITE_ID')) $lang
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)