Ticket #132: Engine.class.php.patch

File Engine.class.php.patch, 4.5 KB (added by 1d1ot, 22 months ago)

idiot

  • Engine.class.php

     
    120120                                */ 
    121121                                $oProfiler=ProfilerSimple::getInstance(); 
    122122                                $iTimeId=$oProfiler->Start('InitModule',get_class($oModule)); 
    123  
    124                                 $oModule->Init(); 
    125                                 $oModule->SetInit(); 
     123                                 
     124                                $this->InitModule($oModule); 
    126125 
    127126                                $oProfiler->Stop($iTimeId); 
    128127                        } 
     
    146145                        $oProfiler->Stop($iTimeId); 
    147146                } 
    148147        } 
     148         
     149        /** 
     150         * �нициализация модуля 
     151         *  
     152         * @param unknown_type $oModule 
     153         * @param unknown_type $bHookParent 
     154         */ 
     155        protected function InitModule($oModule, $bHookParent = true){ 
     156                $sOrigClassName = $sClassName = get_class($oModule); 
     157                if($this->isInit($sClassName)){ 
     158                        return; 
     159                } 
     160                $bRunHooks = false; 
     161                if($this->isInit('hook')){ 
     162                        $bRunHooks = true; 
     163                        if($bHookParent){ 
     164                                while(preg_match('#^Plugin#i', $sClassName)){ 
     165                                        $sParentClassName = get_parent_class($sClassName); 
     166                                        if($sParentClassName == 'Module'){ 
     167                                                break; 
     168                                        } 
     169                                        $sClassName = $sParentClassName; 
     170                                } 
     171                        } 
     172                } 
     173                if($bRunHooks){ 
     174                        $this->Hook_Run($sClassName.'_init_start'); 
     175                } 
     176                $oModule->Init(); 
     177                $oModule->SetInit(); 
     178                if(!isset($this->aModules[$sOrigClassName])){ 
     179                        $this->aModules[$sOrigClassName] = &$oModule; 
     180                } 
     181                if($bRunHooks || $sClassName == 'ModuleHook'){ 
     182                        $this->Hook_Run($sClassName.'_init_complete'); 
     183                } 
     184        } 
     185         
    149186        /** 
    150187         * Выполняет загрузку модуля по его названию 
    151188         * 
    152          * @param  string $sModuleName 
     189         * @param  string $sModuleClass 
    153190         * @param  bool $bInit - инициализировать модуль или нет 
    154191         * @return Module 
    155192         */ 
    156         public function LoadModule($sModuleName,$bInit=false) { 
     193        public function &LoadModule($sModuleClass,$bInit=false) { 
    157194                $tm1=microtime(true); 
    158195                 
    159                 /**               
    160                  * Создаем объект модуля 
    161                  */              
    162                 $oModule=new $sModuleName($this); 
    163                 if ($bInit or $sModuleName=='Cache') { 
    164                         $oModule->Init(); 
    165                         $oModule->SetInit(); 
     196                if (isset($this->aModules[$sModuleClass])) { 
     197                        /**               
     198                         * Получаем уже имеющийся объект модуля 
     199                         */              
     200                        //if($bInit or $sModuleClass=='ModuleCache'){ 
     201                        if ($bInit) { 
     202                                $this->InitModule($oModule); 
     203                        } 
     204                        $oModule = &$this->aModules[$sModuleClass]; 
     205                }else{ 
     206                        /**               
     207                         * Создаем объект модуля 
     208                         */              
     209                        $oModule=new $sModuleClass($this); 
     210                        //if ($bInit or $sModuleClass=='ModuleCache') { 
     211                        if ($bInit) { 
     212                                $this->InitModule($oModule); 
     213                        }else{ 
     214                                $this->aModules[$sModuleClass] = &$oModule; 
     215                        } 
    166216                } 
    167                 $this->aModules[$sModuleName]=$oModule; 
     217                 
    168218                $tm2=microtime(true); 
    169219                $this->iTimeLoadModule+=$tm2-$tm1; 
    170                 dump("load $sModuleName - \t\t".($tm2-$tm1).""); 
     220                dump("load $sModuleClass - \t\t".($tm2-$tm1).""); 
    171221                return $oModule; 
    172222        } 
    173223         
     
    362412         * @param  string $sName 
    363413         * @return array 
    364414         */ 
    365         public function GetModule($sName) { 
     415        public function GetModule($sName, $bLoad = true) { 
    366416                /** 
    367417                 * Поддержка полного синтаксиса при вызове метода модуля 
    368418                 */ 
     
    386436                /** 
    387437                 * Подхватыем делегат модуля (в случае наличия такового) 
    388438                 */ 
    389                 if(!in_array($sModuleName,array('Plugin','Hook'))) $sModuleClass=$this->Plugin_GetDelegate('module',$sModuleClass); 
     439                if(!in_array($sModuleName,array('Plugin','Hook'))){ 
     440                        $sModuleClass=$this->Plugin_GetDelegate('module',$sModuleClass); 
     441                } 
    390442 
    391443                if (isset($this->aModules[$sModuleClass])) { 
    392                         $oModule=$this->aModules[$sModuleClass]; 
    393                 } else { 
     444                        $oModule=&$this->aModules[$sModuleClass]; 
     445                } elseif($bLoad) { 
    394446                        $oModule=$this->LoadModule($sModuleClass,true); 
     447                } else { 
     448                        return; 
    395449                } 
    396450                 
    397                 return array($oModule,$sModuleName,$sMethod); 
     451                return array(&$oModule,$sModuleName,$sMethod); 
     452        } 
     453         
     454        /** 
     455         * Проверяем, инициализирован ли модуль 
     456         * @param $sModuleName 
     457         * @param $sPlugin 
     458         */ 
     459        public function isInit($sModuleName = null, $sPlugin = null){ 
     460                if(!$sModuleName){ 
     461                        return false; 
     462                } 
     463                if(preg_match('#^(Module|Plugin)#i', $sModuleName)){ 
     464                        $sClassName = $sModuleName; 
     465                }else{ 
     466                        $sClassName = $sPlugin 
     467                                ? 'Plugin'.ucfirst($sPlugin).'_'.ucfirst($sModuleName) 
     468                                : ucfirst($sModuleName) 
     469                        ; 
     470                } 
     471                $aModule = $this->GetModule($sClassName.'_x', false); 
     472                if($aModule){ 
     473                        return (bool) $aModule[0]->isInit(); 
     474                } 
     475                return false; 
    398476        } 
    399477         
    400478        public function getStats() {