70 if (!is_string($moduleName) || $moduleName ==
"")
74 if (preg_match(
"#[^a-zA-Z0-9._]#", $moduleName))
76 throw new LoaderException(sprintf(
"Module name '%s' is not correct", $moduleName));
79 $moduleName = strtolower($moduleName);
83 if (!isset(self::$safeModeModules[$moduleName]))
89 if (isset(self::$loadedModules[$moduleName]))
91 return self::$loadedModules[$moduleName];
94 if (isset(self::$semiloadedModules[$moduleName]))
96 trigger_error(
"Module '".$moduleName.
"' is in loading progress", E_USER_WARNING);
100 if (!isset($arInstalledModules[$moduleName]))
102 return (self::$loadedModules[$moduleName] =
false);
108 $pathToInclude = $documentRoot.
"/".$moduleHolder.
"/modules/".$moduleName;
109 if (!file_exists($pathToInclude))
112 $pathToInclude = $documentRoot.
"/".$moduleHolder.
"/modules/".$moduleName;
113 if (!file_exists($pathToInclude))
115 return (self::$loadedModules[$moduleName] =
false);
120 if(strpos($moduleName,
".") !==
false)
123 $baseName = str_replace(
".",
"\\", ucwords($moduleName,
"."));
128 $baseName =
"Bitrix\\".ucfirst($moduleName);
132 self::$modulesHolders[$moduleName] = $moduleHolder;
135 if(file_exists($pathToInclude.
"/include.php"))
138 self::$semiloadedModules[$moduleName] =
true;
140 $res = self::includeModuleInternal($pathToInclude.
"/include.php");
142 unset(self::$semiloadedModules[$moduleName]);
145 self::$loadedModules[$moduleName] = ($res !==
false);
147 if(self::$loadedModules[$moduleName] ==
false)
154 ServiceLocator::getInstance()->registerByModuleSettings($moduleName);
157 return self::$loadedModules[$moduleName];
172 if (!$included && self::$requireThrowException)
174 throw new LoaderException(
"Required module `{$moduleName}` was not found");
180 private static function includeModuleInternal($path)
184 return include_once($path);
198 if (isset(self::$sharewareModules[$moduleName]))
200 return self::$sharewareModules[$moduleName];
203 $module = str_replace(
".",
"_", $moduleName);
205 if (self::includeModule($moduleName))
207 if (defined($module.
"_DEMO") && constant($module.
"_DEMO") ==
"Y")
216 return self::$sharewareModules[$moduleName];
219 if (defined($module.
"_DEMO") && constant($module.
"_DEMO") ==
"Y")
221 return (self::$sharewareModules[$moduleName] = self::MODULE_DEMO_EXPIRED);
224 return (self::$sharewareModules[$moduleName] = self::MODULE_NOT_FOUND);
229 if (!is_string($moduleName) || $moduleName ==
"")
234 if($moduleName !==
"main")
236 unset(self::$loadedModules[$moduleName]);
237 unset(self::$modulesHolders[$moduleName]);
240 unset(self::$sharewareModules[$moduleName]);
250 static $documentRoot =
null;
251 if ($documentRoot ===
null)
253 $documentRoot = rtrim($_SERVER[
"DOCUMENT_ROOT"],
"/\\");
255 return $documentRoot;
273 if (($moduleName !==
null) && empty($moduleName))
275 throw new LoaderException(sprintf(
"Module name '%s' is not correct", $moduleName));
278 foreach ($classes as $class => $file)
280 $class = ltrim($class,
"\\");
281 $class = strtolower($class);
283 self::$autoLoadClasses[$class] = [
284 "module" => $moduleName,
299 $namespace = trim($namespace,
"\\").
"\\";
300 $namespace = strtolower($namespace);
302 $path = rtrim($path,
"/\\");
303 $depth = substr_count(rtrim($namespace,
"\\"),
"\\");
305 self::$namespaces[$namespace][] = [
317 $namespace = trim($namespace,
"\\").
"\\";
318 $namespace = strtolower($namespace);
320 unset(self::$namespaces[$namespace]);
329 \spl_autoload_register($handler);
341 $className = ltrim($className,
"\\");
343 $classLower = strtolower($className);
345 static $documentRoot =
null;
346 if ($documentRoot ===
null)
352 if (isset(self::$autoLoadClasses[$classLower]))
354 $pathInfo = self::$autoLoadClasses[$classLower];
355 if ($pathInfo[
"module"] !=
"")
357 $module = $pathInfo[
"module"];
358 $holder = (isset(self::$modulesHolders[$module])? self::$modulesHolders[$module] :
self::BITRIX_HOLDER);
360 $filePath = (defined(
'REPOSITORY_ROOT'))
362 :
"{$documentRoot}/{$holder}/modules";
364 $filePath .=
'/'.$module.
"/".$pathInfo[
"file"];
366 require_once($filePath);
370 require_once($documentRoot.$pathInfo[
"file"]);
375 if (preg_match(
"#[^\\\\/a-zA-Z0-9_]#", $className))
381 "real" => $className,
382 "lower" => $classLower,
385 if (substr($classLower, -5) ==
"table")
389 "real" => substr($className, 0, -5),
390 "lower" => substr($classLower, 0, -5),
394 foreach ($tryFiles as $classInfo)
396 $classParts = explode(
"\\", $classInfo[
"lower"]);
399 array_pop($classParts);
401 while(!empty($classParts))
404 $namespace = implode(
"\\", $classParts).
"\\";
406 if(isset(self::$namespaces[$namespace]))
409 foreach (self::$namespaces[$namespace] as $namespaceLocation)
411 $depth = $namespaceLocation[
"depth"];
412 $path = $namespaceLocation[
"path"];
414 $fileParts = explode(
"\\", $classInfo[
"real"]);
416 for ($i=0; $i <= $depth; $i++)
418 array_shift($fileParts);
421 $classPath = implode(
"/", $fileParts);
423 $classPathLower = strtolower($classPath);
426 $filePath = $path.
'/'.$classPathLower.
".php";
428 if (file_exists($filePath))
430 require_once($filePath);
435 $filePath = $path.
'/'.$classPath.
".php";
437 if (file_exists($filePath))
439 require_once($filePath);
446 array_pop($classParts);
458 $file = ltrim($className,
"\\");
459 $file = strtolower($file);
461 if (preg_match(
"#[^\\\\/a-zA-Z0-9_]#", $file))
466 if (substr($file, -5) ==
"table")
469 $tryFiles[] = substr($file, 0, -5);
472 foreach ($tryFiles as $file)
474 $file = str_replace(
'\\',
'/', $file);
475 $arFile = explode(
"/", $file);
477 if ($arFile[0] ===
"bitrix")
479 array_shift($arFile);
486 $module = array_shift($arFile);
487 if ($module ==
null || empty($arFile))
494 $module1 = array_shift($arFile);
495 $module2 = array_shift($arFile);
497 if ($module1 ==
null || $module2 ==
null || empty($arFile))
502 $module = $module1.
".".$module2;
505 if (!self::includeModule($module))
508 "There is no `%s` class, module `%s` is unavailable", $className, $module
523 public static function getLocal($path, $root =
null)
530 if (file_exists($root.
"/local/".$path))
532 return $root.
"/local/".$path;
534 elseif (file_exists($root.
"/bitrix/".$path))
536 return $root.
"/bitrix/".$path;
554 $personal = (isset($_SERVER[
"BX_PERSONAL_ROOT"])? $_SERVER[
"BX_PERSONAL_ROOT"] :
"");
556 if ($personal <>
'' && file_exists($root.$personal.
"/".$path))
558 return $root.$personal.
"/".$path;
579 parent::__construct($message, $code, $previous);
__construct($message="", $code=0, \Exception $previous=null)
static requireModule($moduleName)
static includeModule($moduleName)
const MODULE_DEMO_EXPIRED
static clearModuleCache($moduleName)
static registerHandler(callable $handler)
static registerAutoLoadClasses($moduleName, array $classes)
static unregisterNamespace($namespace)
static registerNamespace($namespace, $path)
static includeSharewareModule($moduleName)
static $semiloadedModules
static getLocal($path, $root=null)
static setRequireThrowException($requireThrowException)
static getPersonal($path)
static requireClass($className)
static autoLoad($className)
static $requireThrowException
static getInstalledModules()