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
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
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
00157 $aDeletedExtIds = $this->getDeletedExtensionIds($aDeletedExt);
00158
00159
00160 $this->_removeFromModulesArray( $aDeletedExt );
00161
00162
00163 $this->_removeFromDisabledModulesArray( $aDeletedExtIds );
00164
00165
00166 $this->_removeFromLegacyModulesArray( $aDeletedExtIds );
00167
00168
00169 $this->_removeFromModulesPathsArray( $aDeletedExtIds );
00170
00171
00172 $this->_removeFromModulesFilesArray( $aDeletedExtIds );
00173
00174
00175 $this->_removeFromModulesTemplatesArray( $aDeletedExtIds );
00176
00177
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
00448 if ( in_array( $sModuleDirName, $this->_aSkipFiles ) || (!is_dir( $sModuleDirPath ) && substr($sModuleDirName, -4) != ".php")) {
00449 continue;
00450 }
00451
00452 if ( $this->_isVendorDir( $sModuleDirPath ) ) {
00453
00454 $this->getModulesFromDir( $sModuleDirPath, basename( $sModuleDirPath ) );
00455 } else {
00456
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
00467 $this->_saveModulePath( $sModuleId, $sModuleDirName );
00468
00469
00470 if ( !$this->_extendsClasses( $sModuleDirName ) ) {
00471
00472 $oModule->deactivate();
00473 }
00474 }
00475 }
00476 }
00477
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 }