LoadModules(); $this->InitModules(); $this->InitHooks(); } /** * Завершение работы модуля * */ public function Shutdown() { $this->ShutdownModules(); } /** * Производит инициализацию всех модулей * */ protected function InitModules() { foreach ($this->aModules as $oModule) { $oModule->Init(); } } /** * Завершаем работу всех модулей * */ protected function ShutdownModules() { foreach ($this->aModules as $sKey => $oModule) { $oModule->Shutdown(); } } /** * Выполняет загрузку модуля по его названию * * @param string $sModuleName * @param bool $bInit - инициализировать модуль или нет * @return unknown */ protected function LoadModule($sModuleName,$bInit=false) { $tm1=microtime(true); if ($this->isFileExists(Config::Get('path.root.engine')."/modules/".strtolower($sModuleName)."/".$sModuleName.".class.php")) { require_once(Config::Get('path.root.engine')."/modules/".strtolower($sModuleName)."/".$sModuleName.".class.php"); } elseif ($this->isFileExists(Config::Get('path.root.server')."/classes/modules/".strtolower($sModuleName)."/".$sModuleName.".class.php")) { require_once(Config::Get('path.root.server')."/classes/modules/".strtolower($sModuleName)."/".$sModuleName.".class.php"); } else { throw new Exception($this->Lang_Get('system_error_module')." - ".$sModuleName); } /** * Проверяем наличие кастомного класса. Также можно переопределить системный модуль */ $sPrefixCustom=''; if ($this->isFileExists(Config::Get('path.root.server')."/classes/modules/".strtolower($sModuleName)."/".$sModuleName.".class.custom.php")) { require_once(Config::Get('path.root.server')."/classes/modules/".strtolower($sModuleName)."/".$sModuleName.".class.custom.php"); $sPrefixCustom='_custom'; } /** * Создаем объект модуля */ $sModuleNameClass='Ls'.$sModuleName.$sPrefixCustom; $oModule=new $sModuleNameClass($this); if ($bInit or $sModuleName=='Cache') { $oModule->Init(); } $this->aModules[$sModuleName]=$oModule; $tm2=microtime(true); $this->iTimeLoadModule+=$tm2-$tm1; dump("load $sModuleName - \t\t".($tm2-$tm1).""); return $oModule; } /** * Загружает все используемые модули и передает им в конструктор ядро * */ protected function LoadModules() { $this->LoadConfig(); foreach ($this->aConfigModule['autoLoad'] as $sModuleName) { $this->LoadModule($sModuleName); } } /** * Выполняет загрузку конфигов * */ protected function LoadConfig() { $this->aConfigModule = Config::Get('module'); /** * Рефакторинг - переход на использование конфигурационных массивов * $this->aConfigModule=include(Config::Get('path.root.server')."/config/config.module.php"); /// /// Ищет конфиги модулей и объединяет их с текущим /// $sDirConfig=Config::Get('path.root.server').'/config/modules/'; if ($hDirConfig = opendir($sDirConfig)) { while (false !== ($sDirModule = readdir($hDirConfig))) { if ($sDirModule !='.' and $sDirModule !='..' and is_dir($sDirConfig.$sDirModule)) { $sFileConfig=$sDirConfig.$sDirModule.'/config.module.php'; if (file_exists($sFileConfig)) { $aConfigModule=include($sFileConfig); $this->aConfigModule=array_merge_recursive($this->aConfigModule,$aConfigModule); } } } closedir($hDirConfig); } **/ } /** * Регистрирует хуки из /classes/hooks/ * */ protected function InitHooks() { $sDirHooks=Config::Get('path.root.server').'/classes/hooks/'; if ($hDir = opendir($sDirHooks)) { while (false !== ($sFile = readdir($hDir))) { if ($sFile !='.' and $sFile !='..' and is_file($sDirHooks.$sFile)) { if (preg_match("/^Hook([\w]+)\.class\.php$/i",$sFile,$aMatch)) { require_once($sDirHooks.$sFile); $sClassName='Hook'.$aMatch[1]; $oHook=new $sClassName; $oHook->RegisterHook(); } } } closedir($hDir); } } /** * Проверяет файл на существование, если используется кеширование memcache то кеширует результат работы * * @param unknown_type $sFile * @return unknown */ public function isFileExists($sFile,$iTime=3600) { return file_exists($sFile); if (strpos($sFile,'/Cache.class.')!==false) { return file_exists($sFile); } if (SYS_CACHE_USE and SYS_CACHE_TYPE==SYS_CACHE_TYPE_MEMORY) { if (false === ($data = $this->Cache_Get("file_exists_{$sFile}"))) { $data=file_exists($sFile); $this->Cache_Set((int)$data, "file_exists_{$sFile}", array(), $iTime); } return $data; } else { return file_exists($sFile); } } /** * Вызывает метод нужного модуля * * @param string $sName * @param array $aArgs * @return unknown */ public function _CallModule($sName,$aArgs) { $sArgs=''; $aStrArgs=array(); foreach ($aArgs as $sKey => $arg) { $aStrArgs[]='$aArgs['.$sKey.']'; } $sArgs=join(',',$aStrArgs); $aName=explode("_",$sName); $sModuleName=$aName[0]; if (isset($this->aModules[$sModuleName])) { $oModule=$this->aModules[$sModuleName]; } else { $oModule=$this->LoadModule($sModuleName,true); } if (!method_exists($oModule,$aName[1])) { throw new Exception($this->Lang_Get('system_error_module_no_method').": ".$sModuleName.'->'.$aName[1].'()'); } $sCmd='$result=$oModule->'.$aName[1].'('.$sArgs.');'; $oProfiler=ProfilerSimple::getInstance(); $iTimeId=$oProfiler->Start('callModule',$sModuleName.'->'.$aName[1].'()'); eval($sCmd); $oProfiler->Stop($iTimeId); return $result; } public function getStats() { return array('sql'=>$this->Database_GetStats(),'cache'=>$this->Cache_GetStats(),'engine'=>array('time_load_module'=>round($this->iTimeLoadModule,3))); } /** * Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля * * @param string $sName * @param array $aArgs * @return unknown */ public function __call($sName,$aArgs) { return $this->_CallModule($sName,$aArgs); } /** * Блокируем копирование/клонирование объекта роутинга * */ protected function __clone() { } } /** * Автозагрузка кслассов * * @param unknown_type $sClassName */ function __autoload($sClassName) { /** * Если класс подходит под шблон класса сущности то згружаем его */ if (preg_match("/^(\w+)Entity\_(\w+)$/i",$sClassName,$aMatch)) { $tm1=microtime(true); $sFileClass=Config::get('path.root.server').'/classes/modules/'.strtolower($aMatch[1]).'/entity/'.$aMatch[2].'.entity.class.php'; if (file_exists($sFileClass)) { require_once($sFileClass); $tm2=microtime(true); dump($sClassName." - \t\t".($tm2-$tm1)); } } } ?>