oxmodulelist.php

Go to the documentation of this file.
00001 <?php
00002 
00007 class oxModuleList extends oxSuperCfg
00008 {
00014     protected $_aModule = array();
00015 
00021     protected $_aSkipFiles = array( "functions.php", "vendormetadata.php" );
00022 
00023 
00029     public function getAllModules()
00030     {
00031         return $this->getConfig()->getAllModules();
00032     }
00033 
00039     public function getActiveModuleInfo()
00040     {
00041         $aModules       = $this->getAllModules();
00042         $aModulePaths   = $this->getModulePaths();
00043         if ( !is_array($aModulePaths) || count($aModulePaths) < 1 ) {
00044            // $aModulePaths = array();
00045             if ( is_array($aModules) && count($aModules) > 0 ) {
00046                 foreach ($aModules as $aModuleClasses) {
00047                     foreach ($aModuleClasses as $sModule) {
00048                         $sModuleId = substr( $sModule, 0, strpos( $sModule, "/" ) );
00049                         $aModulePaths[$sModuleId] = $sModuleId;
00050                     }
00051                 }
00052             }
00053         }
00054 
00055         $aDisabledModules = $this->getDisabledModules();
00056         if ( is_array($aDisabledModules) && count($aDisabledModules) > 0  && count($aModulePaths) > 0 ) {
00057             $aModulePaths = array_diff_key($aModulePaths, array_flip($aDisabledModules));
00058         }
00059         return $aModulePaths;
00060     }
00061 
00067     public function getLegacyModules()
00068     {
00069         return $this->getConfig()->getConfigParam('aLegacyModules');
00070     }
00071 
00077     public function getDisabledModules()
00078     {
00079         return $this->getConfig()->getConfigParam('aDisabledModules');
00080     }
00081 
00087     public function getModulePaths()
00088     {
00089         return $this->getConfig()->getConfigParam('aModulePaths');
00090     }
00091 
00097     public function getModuleFiles()
00098     {
00099         return $this->getConfig()->getConfigParam('aModuleFiles');
00100     }
00101 
00107     public function getModuleTemplates()
00108     {
00109         return $this->getConfig()->getConfigParam('aModuleTemplates');
00110     }
00111 
00120     public function getDisabledModuleClasses()
00121     {
00122         $aDisabledModules = $this->getDisabledModules();
00123         $aModules         = $this->getAllModules();
00124         $aModulePaths     = $this->getModulePaths();
00125 
00126         $aDisabledModuleClasses = array();
00127         if (isset($aDisabledModules) && is_array($aDisabledModules)) {
00128             //get all disabled module paths
00129             foreach ($aDisabledModules as $sId) {
00130                 $sPath = $aModulePaths[$sId];
00131                 if (!isset($sPath)) {
00132                     $sPath = $sId;
00133                 }
00134                 foreach ( $aModules as $sClass => $aModuleClasses ) {
00135                     foreach ( $aModuleClasses as $sModuleClass ) {
00136                         if (strpos($sModuleClass, $sPath."/") === 0 ) {
00137                             $aDisabledModuleClasses[] = $sModuleClass;
00138                         }
00139                     }
00140                 }
00141             }
00142         }
00143 
00144         return $aDisabledModuleClasses;
00145     }
00146 
00152     public function cleanup()
00153     {
00154         $aDeletedExt = $this->getDeletedExtensions();
00155 
00156         //collecting deleted extension IDs
00157         $aDeletedExtIds = $this->getDeletedExtensionIds($aDeletedExt);
00158 
00159         // removing from aModules config varviable
00160         $this->_removeFromModulesArray( $aDeletedExt );
00161 
00162         // removing from aDisabledModules config varviable
00163         $this->_removeFromDisabledModulesArray( $aDeletedExtIds );
00164 
00165         // removing from aLegacyModules array
00166         $this->_removeFromLegacyModulesArray( $aDeletedExtIds );
00167 
00168         // removing from aModulePaths array
00169         $this->_removeFromModulesPathsArray( $aDeletedExtIds );
00170 
00171         // removing from aModuleFiles array
00172         $this->_removeFromModulesFilesArray( $aDeletedExtIds );
00173 
00174         // removing from aModuleTemplates array
00175         $this->_removeFromModulesTemplatesArray( $aDeletedExtIds );
00176 
00177         //removing from config tables and templates blocks table
00178         $this->_removeFromDatabase( $aDeletedExtIds );
00179     }
00180 
00188     public function getDeletedExtensionIds($aDeletedExt)
00189     {
00190         $aDeletedExtIds = array();
00191         if ( !empty($aDeletedExt) ) {
00192             $oModule = oxNew("oxModule");
00193             foreach ( $aDeletedExt as $sOxClass => $aDeletedModules ) {
00194                 foreach ( $aDeletedModules as $sModulePath ) {
00195                     $aDeletedExtIds[] = $oModule->getIdByPath($sModulePath);
00196                 }
00197             }
00198         }
00199 
00200         if ( !empty( $aDeletedExtIds ) ) {
00201             $aDeletedExtIds = array_unique( $aDeletedExtIds );
00202         }
00203 
00204         return $aDeletedExtIds;
00205     }
00206 
00213     public function getDeletedExtensions()
00214     {
00215         $aModules = $this->getAllModules();
00216 
00217         foreach ( $aModules as $sOxClass => $aModulesList ) {
00218             foreach ( $aModulesList as $sModulePath ) {
00219                 $sExtPath = $this->getConfig()->getModulesDir() . $sModulePath.".php";
00220                 if ( !file_exists( $sExtPath ) ) {
00221                     $aDeletedExt[$sOxClass][] = $sModulePath;
00222                 }
00223             }
00224         }
00225 
00226         return $aDeletedExt;
00227     }
00228 
00238     public function diffModuleArrays($aAllModuleArray, $aRemModuleArray)
00239     {
00240        if (is_array($aAllModuleArray) && is_array($aRemModuleArray)) {
00241             foreach ($aAllModuleArray as $sClass => $aModuleChain) {
00242                 if (!is_array($aModuleChain)) {
00243                     $aModuleChain = array($aModuleChain);
00244                 }
00245                 if (isset($aRemModuleArray[$sClass])) {
00246                     if (!is_array($aRemModuleArray[$sClass])) {
00247                         $aRemModuleArray[$sClass] = array($aRemModuleArray[$sClass]);
00248                     }
00249                     $aAllModuleArray[$sClass] = array();
00250                     foreach ($aModuleChain as $sModule) {
00251                         if (!in_array($sModule, $aRemModuleArray[$sClass])) {
00252                             $aAllModuleArray[$sClass][] = $sModule;
00253                         }
00254                     }
00255                     if (!count($aAllModuleArray[$sClass])) {
00256                         unset ($aAllModuleArray[$sClass]);
00257                     }
00258                 } else {
00259                     $aAllModuleArray[$sClass] = $aModuleChain;
00260                 }
00261             }
00262 
00263        }
00264 
00265         return $aAllModuleArray;
00266     }
00267 
00275     public function buildModuleChains($aModuleArray)
00276     {
00277         $aModules = array();
00278         if (is_array($aModuleArray)) {
00279             foreach ($aModuleArray as $sClass => $aModuleChain) {
00280                 $aModules[$sClass] = implode('&', $aModuleChain);
00281             }
00282         }
00283         return $aModules;
00284     }
00285 
00293     protected function _removeFromModulesArray( $aDeletedExt )
00294     {
00295         $aExt = $this->getAllModules();
00296         $aUpdatedExt = $this->diffModuleArrays( $aExt, $aDeletedExt );
00297         $aUpdatedExt = $this->buildModuleChains( $aUpdatedExt );
00298 
00299         $this->getConfig()->saveShopConfVar( 'aarr', 'aModules', $aUpdatedExt );
00300     }
00301 
00309     protected function _removeFromDisabledModulesArray( $aDeletedExtIds )
00310     {
00311         $oConfig = $this->getConfig();
00312         $aDisabledExtensionIds = $this->getDisabledModules();
00313         $aDisabledExtensionIds = array_diff($aDisabledExtensionIds, $aDeletedExtIds);
00314         $oConfig->saveShopConfVar( 'arr', 'aDisabledModules', $aDisabledExtensionIds );
00315     }
00316 
00324     protected function _removeFromLegacyModulesArray( $aDeletedExtIds )
00325     {
00326         $aLegacyExt = $this->getLegacyModules();
00327 
00328         foreach ( $aDeletedExtIds as $sDeletedExtId ) {
00329             if ( isset($aLegacyExt[$sDeletedExtId]) ) {
00330                 unset( $aLegacyExt[$sDeletedExtId] );
00331             }
00332         }
00333 
00334         $this->getConfig()->saveShopConfVar( 'aarr', 'aLegacyModules', $aLegacyExt );
00335     }
00336 
00344     protected function _removeFromModulesPathsArray( $aDeletedModule )
00345     {
00346         $aModulePaths = $this->getModulePaths();
00347 
00348         foreach ( $aDeletedModule as $sDeletedModuleId ) {
00349             if ( isset($aModulePaths[$sDeletedModuleId]) ) {
00350                 unset( $aModulePaths[$sDeletedModuleId] );
00351             }
00352         }
00353 
00354         $this->getConfig()->saveShopConfVar( 'aarr', 'aModulePaths', $aModulePaths );
00355     }
00356 
00364     protected function _removeFromModulesFilesArray( $aDeletedModule )
00365     {
00366         $aModuleFiles = $this->getModuleFiles();
00367 
00368         foreach ( $aDeletedModule as $sDeletedModuleId ) {
00369             if ( isset($aModuleFiles[$sDeletedModuleId]) ) {
00370                 unset( $aModuleFiles[$sDeletedModuleId] );
00371             }
00372         }
00373 
00374         $this->getConfig()->saveShopConfVar( 'aarr', 'aModuleFiles', $aModuleFiles );
00375     }
00376 
00384     protected function _removeFromModulesTemplatesArray( $aDeletedModule )
00385     {
00386         $aModuleTemplates = $this->getModuleTemplates();
00387 
00388         foreach ( $aDeletedModule as $sDeletedModuleId ) {
00389             if ( isset($aModuleTemplates[$sDeletedModuleId]) ) {
00390                 unset( $aModuleTemplates[$sDeletedModuleId] );
00391             }
00392         }
00393 
00394         $this->getConfig()->saveShopConfVar( 'aarr', 'aModuleTemplates', $aModuleTemplates );
00395     }
00396 
00404     protected function _removeFromDatabase( $aDeletedExtIds )
00405     {
00406         if ( !is_array($aDeletedExtIds) || !count($aDeletedExtIds) ) {
00407             return;
00408         }
00409         $sDelExtIds = array();
00410 
00411         foreach ( $aDeletedExtIds as $sDeletedExtId ) {
00412             $aConfigIds[] = "'module:" . $sDeletedExtId . "'";
00413             $sDelExtIds[] = "'" . $sDeletedExtId . "'";
00414         }
00415 
00416         $sConfigIds = implode( ", ", $aConfigIds );
00417         $sDelExtIds = implode( ", ", $sDelExtIds );
00418 
00419         $aSql[] = "DELETE FROM oxconfig where oxmodule IN ($sConfigIds)";
00420         $aSql[] = "DELETE FROM oxconfigdisplay where oxcfgmodule IN ($sConfigIds)";
00421         $aSql[] = "DELETE FROM oxtplblocks where oxmodule IN ($sDelExtIds)";
00422 
00423         $oDb = oxDb::getDb();
00424         foreach ( $aSql as $sQuery ) {
00425             $oDb->execute( $sQuery );
00426         }
00427     }
00428 
00438     public function getModulesFromDir( $sModulesDir, $sVendorDir = null )
00439     {
00440         $sModulesDir  = oxUtilsFile::getInstance()->normalizeDir( $sModulesDir );
00441 
00442         foreach ( glob( $sModulesDir."*" ) as $sModuleDirPath ) {
00443 
00444             $sModuleDirPath .= ( is_dir( $sModuleDirPath ) ) ? "/" : "";
00445             $sModuleDirName  = basename( $sModuleDirPath );
00446 
00447             // skipping some file
00448             if ( in_array( $sModuleDirName, $this->_aSkipFiles ) || (!is_dir( $sModuleDirPath ) && substr($sModuleDirName, -4) != ".php")) {
00449                 continue;
00450             }
00451 
00452             if ( $this->_isVendorDir( $sModuleDirPath ) ) {
00453                 // scaning modules vendor directory
00454                 $this->getModulesFromDir( $sModuleDirPath, basename( $sModuleDirPath ) );
00455             } else {
00456                 // loading module info
00457                 $oModule = oxNew( "oxModule" );
00458                 $sModuleDirName = ( !empty($sVendorDir) ) ? $sVendorDir."/".$sModuleDirName : $sModuleDirName;
00459                 $oModule->loadByDir( $sModuleDirName );
00460                 $sModuleId = $oModule->getId();
00461                 $this->_aModules[$sModuleId] = $oModule;
00462 
00463                 $aModulePaths = $this->getModulePaths();
00464 
00465                 if ( !is_array($aModulePaths) || !array_key_exists( $sModuleId, $aModulePaths ) ) {
00466                     // saving module path info
00467                     $this->_saveModulePath( $sModuleId, $sModuleDirName );
00468 
00469                     //checking if this is new module and if it extends any eshop class
00470                     if ( !$this->_extendsClasses( $sModuleDirName ) ) {
00471                         // if not - marking it as disabled by default
00472                         $oModule->deactivate();
00473                     }
00474                 }
00475             }
00476         }
00477         // sorting by name
00478         if ( $this->_aModules !== null ) {
00479             uasort($this->_aModules, array($this, '_sortModules'));
00480         }
00481 
00482         return $this->_aModules;
00483     }
00484 
00493     protected function _sortModules( $oModule1, $oModule2 )
00494     {
00495         return strcasecmp($oModule1->getTitle(), $oModule2->getTitle());
00496     }
00497 
00505     protected function _isVendorDir( $sModuleDir )
00506     {
00507         if ( is_dir( $sModuleDir ) && file_exists( $sModuleDir . "vendormetadata.php" ) ) {
00508             return true;
00509         }
00510 
00511         return false;
00512     }
00513 
00521     protected function _extendsClasses ( $sModuleDir )
00522     {
00523         $aModules = $this->getConfig()->getConfigParam( "aModules" );
00524         if (is_array($aModules)) {
00525             $sModules = implode( "&", $aModules );
00526 
00527             if ( preg_match("@(^|&+)".$sModuleDir."\b@", $sModules ) ) {
00528                 return true;
00529             }
00530         }
00531 
00532         return false;
00533     }
00534 
00543     protected function _saveModulePath( $sModuleId, $sModulePath )
00544     {
00545         $aModulePaths = $this->getModulePaths();
00546 
00547         $aModulePaths[$sModuleId] = $sModulePath;
00548         $this->getConfig()->saveShopConfVar( 'aarr', 'aModulePaths', $aModulePaths );
00549     }
00550 
00551 }