00001 <?php
00002
00007 class oxModule extends oxSuperCfg
00008 {
00014 protected $_aModule = array();
00015
00021 protected $_blMetadata = false;
00022
00028 protected $_blRegistered = false;
00029
00035 protected $_blFile = false;
00036
00042 protected $_blLegacy = false;
00043
00051 public function setModuleData( $aModule )
00052 {
00053 $this->_aModule = $aModule;
00054 }
00055
00063 public function load( $sModuleId )
00064 {
00065 if ( $this->loadModule($sModuleId) ) return true;
00066
00067 if ( $this->loadLegacyModule($sModuleId) ) return true;
00068
00069 if ( $this->loadUnregisteredModule($sModuleId) ) return true;
00070
00071 return false;
00072 }
00073
00081 public function loadByDir( $sModuleDir )
00082 {
00083 $sModuleId = null;
00084 $aModulePaths = $this->getModulePaths();
00085
00086 if ( is_array($aModulePaths) ) {
00087 $sModuleId = array_search( $sModuleDir, $aModulePaths);
00088 }
00089
00090
00091 if ( !$sModuleId ) {
00092 $sModuleId = $sModuleDir;
00093 }
00094
00095 return $this->load( $sModuleId );
00096 }
00097
00105 public function loadModule( $sModuleId )
00106 {
00107 $sModulePath = $this->getModuleFullPath( $sModuleId );
00108 $sMetadataPath = $sModulePath . "/metadata.php";
00109
00110 if ( $sModulePath && file_exists( $sMetadataPath ) && is_readable( $sMetadataPath ) ) {
00111 $aModule = array();
00112 include $sMetadataPath;
00113 $this->_aModule = $aModule;
00114 $this->_blLegacy = false;
00115 $this->_blRegistered = true;
00116 $this->_blMetadata = true;
00117 $this->_blFile = false;
00118 $this->_aModule['active'] = $this->isActive();
00119 return true;
00120 }
00121 return false;
00122 }
00123
00131 public function loadLegacyModule( $sModuleId )
00132 {
00133 $aLegacyModules = $this->getLegacyModules();
00134 $sModuleDir = $this->getModulePath( $sModuleId );
00135
00136
00137 if ( isset( $aLegacyModules[$sModuleId] ) ) {
00138 $this->_aModule = $aLegacyModules[$sModuleId];
00139 $this->_blLegacy = true;
00140 $this->_blRegistered = true;
00141 $this->_blMetadata = false;
00142 $this->_blFile = empty( $sModuleDir );
00143 $this->_aModule['active'] = $this->isActive();
00144 return true;
00145 }
00146 return false;
00147 }
00148
00156 public function loadUnregisteredModule( $sModuleId )
00157 {
00158 $sModulePath = $this->getModuleFullPath( $sModuleId );
00159
00160 if ( !$sModulePath ) {
00161 $sModulePath = $this->getConfig()->getModulesDir() . $sModuleId;
00162 }
00163
00164 if ( file_exists( $sModulePath ) && is_readable( $sModulePath ) ) {
00165 $aModules = $this->getAllModules();
00166
00167 $this->_aModule = array();
00168 $this->_aModule['id'] = $sModuleId;
00169 $this->_aModule['title'] = $sModuleId;
00170 $this->_aModule['extend'] = $this->buildModuleChains( $this->filterModuleArray( $aModules, $sModuleId ) );
00171 $this->_blLegacy = true;
00172 $this->_blRegistered = false;
00173 $this->_blMetadata = false;
00174 $this->_blFile = !is_dir($this->getConfig()->getModulesDir() . $sModuleId );
00175 $this->_aModule['active'] = $this->isActive();
00176 return true;
00177 }
00178 return false;
00179 }
00180
00186 public function getDescription()
00187 {
00188 $iLang = oxRegistry::getLang()->getTplLanguage();
00189
00190 return $this->getInfo( "description", $iLang );
00191 }
00192
00198 public function getTitle()
00199 {
00200 $iLang = oxRegistry::getLang()->getTplLanguage();
00201
00202 return $this->getInfo( "title", $iLang );
00203 }
00204
00210 public function getId()
00211 {
00212 return $this->_aModule['id'];
00213 }
00214
00220 public function getExtensions()
00221 {
00222 return isset( $this->_aModule['extend'] ) ? $this->_aModule['extend'] : array();
00223 }
00224
00232 public function getIdByPath( $sModule )
00233 {
00234 $myConfig = $this->getConfig();
00235 $aModulePaths = $myConfig->getConfigParam( 'aModulePaths' );
00236 $sModuleId = null;
00237 if (is_array( $aModulePaths )) {
00238 foreach ($aModulePaths as $sId => $sPath) {
00239 if (strpos($sModule, $sPath."/") === 0 ) {
00240 $sModuleId = $sId;
00241 }
00242 }
00243 }
00244 if (!$sModuleId) {
00245 $sModuleId = substr( $sModule, 0, strpos( $sModule, "/" ) );
00246 }
00247 if (!$sModuleId) {
00248 $sModuleId = $sModule;
00249 }
00250 return $sModuleId;
00251 }
00252
00262 public function getInfo( $sName, $iLang = null )
00263 {
00264 if (isset($this->_aModule[$sName])) {
00265
00266 if ( $iLang !== null && is_array($this->_aModule[$sName]) ) {
00267 $sValue = null;
00268
00269 $sLang = oxRegistry::getLang()->getLanguageAbbr( $iLang );
00270
00271 if ( !empty($this->_aModule[$sName]) ) {
00272 if ( !empty( $this->_aModule[$sName][$sLang] ) ) {
00273 $sValue = $this->_aModule[$sName][$sLang];
00274 } elseif ( !empty( $this->_aModule['lang'] ) ) {
00275
00276 $sValue = $this->_aModule[$sName][$this->_aModule['lang']];
00277 } else {
00278
00279 $sValue = reset( $this->_aModule[$sName] );
00280 }
00281
00282 return $sValue;
00283 }
00284 } else {
00285 return $this->_aModule[$sName];
00286 }
00287 }
00288 }
00289
00295 public function isActive()
00296 {
00297 $blActive = false;
00298 $sId = $this->getId();
00299 if ( !is_null( $sId ) ) {
00300 if ( $this->hasExtendClass() ) {
00301 $blActive = $this->_isExtensionsActive();
00302 if ( $blActive && $this->_isInDisabledList( $sId ) ) {
00303 $blActive = false;
00304 }
00305 } else {
00306 $aDisabledModules = $this->getDisabledModules();
00307 if ( is_array( $aDisabledModules ) && !in_array( $sId, $aDisabledModules ) ) {
00308 $blActive = true;
00309 }
00310 }
00311 }
00312
00313 return $blActive;
00314 }
00315
00316
00325 public function isExtended()
00326 {
00327 if ( $this->hasMetadata() && $this->hasExtendClass() ) {
00328 return true;
00329 }
00330
00331 return false;
00332 }
00333
00337 public function hasExtendClass()
00338 {
00339 $aExtensions = $this->getExtensions();
00340 return isset( $aExtensions )
00341 && is_array( $aExtensions )
00342 && !empty( $aExtensions );
00343 }
00344
00350 public function isLegacy()
00351 {
00352 return $this->_blLegacy;
00353 }
00354
00360 public function isRegistered()
00361 {
00362 return $this->_blRegistered;
00363 }
00364
00370 public function hasMetadata()
00371 {
00372 return $this->_blMetadata;
00373 }
00374
00380 public function isFile()
00381 {
00382 return $this->_blFile;
00383 }
00384
00390 public function activate()
00391 {
00392 $blResult = false;
00393
00394 if ( $this->hasMetadata() || $this->hasExtendClass() ) {
00395
00396 $this->_addExtensions();
00397
00398 $this->_removeFromDisabledList();
00399
00400 $this->_addTemplateBlocks( $this->getInfo("blocks") );
00401
00402
00403 $this->_addModuleFiles($this->getInfo("files") );
00404
00405
00406 $this->_addTemplateFiles( $this->getInfo("templates") );
00407
00408
00409 $this->_addModuleSettings($this->getInfo("settings"));
00410
00411
00412 $this->_addModuleVersion($this->getInfo("version"));
00413
00414
00415 $this->_addModuleEvents($this->getInfo("events"));
00416
00417
00418 $this->_resetCache();
00419
00420
00421 $this->_callEvent('onActivate', $this->getId() );
00422
00423 $blResult = true;
00424 }
00425 return $blResult;
00426 }
00427
00435 public function deactivate( $sModuleId = null )
00436 {
00437 $blResult = false;
00438 if ( is_null( $sModuleId ) ) {
00439 $sModuleId = $this->getId();
00440 }
00441 if ( isset( $sModuleId ) ) {
00442
00443 $this->_callEvent( 'onDeactivate', $sModuleId );
00444
00445 $this->_addToDisabledList( $sModuleId );
00446
00447
00448 $this->_resetCache();
00449
00450 $this->_deleteBlock( $sModuleId );
00451
00452
00453 $blResult = true;
00454 }
00455 return $blResult;
00456 }
00457
00466 protected function _callEvent( $sEvent, $sModuleId )
00467 {
00468 $aModuleEvents = $this->getModuleEvents();
00469
00470 if ( isset( $aModuleEvents[$sModuleId], $aModuleEvents[$sModuleId][$sEvent] ) ) {
00471 $mEvent = $aModuleEvents[$sModuleId][$sEvent];
00472
00473 if ( is_callable( $mEvent ) ) {
00474 call_user_func($mEvent);
00475 }
00476 }
00477 }
00478
00487 protected function _changeBlockStatus( $sModule, $iStatus = 0 )
00488 {
00489 $oDb = oxDb::getDb();
00490 $sShopId = $this->getConfig()->getShopId();
00491 $oDb->execute( "UPDATE oxtplblocks SET oxactive = '".(int) $iStatus."' WHERE oxmodule =". $oDb->quote( $sModule )."AND oxshopid = '$sShopId'" );
00492 }
00493
00501 protected function _deleteBlock( $sModule )
00502 {
00503 $oDb = oxDb::getDb();
00504 $sShopId = $this->getConfig()->getShopId();
00505 $oDb->execute( "DELETE FROM `oxtplblocks` WHERE `oxmodule` =" . $oDb->quote( $sModule ) . " AND `oxshopid` = " . $oDb->quote( $sShopId ) );
00506 }
00507
00508
00514 protected function _resetCache()
00515 {
00516 $aTemplates = $this->getTemplates();
00517 $oUtils = oxRegistry::getUtils();
00518 $oUtils->resetTemplateCache($aTemplates);
00519 $oUtils->resetLanguageCache();
00520 $oUtils->resetMenuCache();
00521
00522 $oUtilsObject = oxUtilsObject::getInstance();
00523 $oUtilsObject->resetModuleVars();
00524
00525 $this->_clearApcCache();
00526 }
00527
00528
00536 public function buildModuleChains($aModuleArray)
00537 {
00538 $aModules = array();
00539 if (is_array($aModuleArray)) {
00540 foreach ($aModuleArray as $sClass => $aModuleChain) {
00541 $aModules[$sClass] = implode('&', $aModuleChain);
00542 }
00543 }
00544 return $aModules;
00545 }
00546
00556 public function mergeModuleArrays($aAllModuleArray, $aAddModuleArray)
00557 {
00558 if ( is_array( $aAllModuleArray ) && is_array( $aAddModuleArray ) ) {
00559 foreach ( $aAddModuleArray as $sClass => $aModuleChain ) {
00560 if ( !is_array( $aModuleChain ) ) {
00561 $aModuleChain = array( $aModuleChain );
00562 }
00563 if ( isset( $aAllModuleArray[$sClass] ) ) {
00564 foreach ( $aModuleChain as $sModule ) {
00565 if ( !in_array( $sModule, $aAllModuleArray[$sClass] ) ) {
00566 $aAllModuleArray[$sClass][] = $sModule;
00567 }
00568 }
00569 } else {
00570 $aAllModuleArray[$sClass] = $aModuleChain;
00571 }
00572 }
00573 }
00574
00575 return $aAllModuleArray;
00576 }
00577
00586 public function filterModuleArray( $aModules, $sModuleId )
00587 {
00588 $aFilteredModules = array();
00589 foreach ($aModules as $sClass => $aExtend) {
00590 foreach ($aExtend as $sExtendPath) {
00591 if (strstr($sExtendPath, $sModuleId.'/')) {
00592 $aFilteredModules[$sClass][] = $sExtendPath;
00593 }
00594 }
00595 }
00596 return $aFilteredModules;
00597 }
00598
00606 public function getModulePath( $sModuleId = null )
00607 {
00608 if ( !$sModuleId ) {
00609 $sModuleId = $this->getId();
00610 }
00611
00612 $aModulePaths = $this->getModulePaths();
00613 $sModulePath = $aModulePaths[$sModuleId];
00614
00615
00616 if ( !$sModulePath && is_dir($this->getConfig()->getModulesDir().$sModuleId) ) {
00617 $sModulePath = $sModuleId;
00618 }
00619
00620 return $sModulePath;
00621 }
00622
00630 public function getModuleFullPath( $sModuleId )
00631 {
00632 if ( $sModuleDir = $this->getModulePath( $sModuleId ) ) {
00633 return $this->getConfig()->getModulesDir() . $sModuleDir;
00634 }
00635 return false;
00636 }
00637
00643 public function getAllModules()
00644 {
00645 return $this->getConfig()->getAllModules();
00646 }
00647
00653 public function getLegacyModules()
00654 {
00655 return $this->getConfig()->getConfigParam('aLegacyModules');
00656 }
00657
00663 public function getDisabledModules()
00664 {
00665 return $this->getConfig()->getConfigParam('aDisabledModules');
00666 }
00667
00673 public function getModulePaths()
00674 {
00675 return $this->getConfig()->getConfigParam('aModulePaths');
00676 }
00677
00683 public function getModuleTemplates()
00684 {
00685 return (array) $this->getConfig()->getConfigParam('aModuleTemplates');
00686 }
00687
00693 public function getModuleFiles()
00694 {
00695 return (array) $this->getConfig()->getConfigParam('aModuleFiles');
00696 }
00697
00703 public function getModuleVersions()
00704 {
00705 return (array) $this->getConfig()->getConfigParam('aModuleVersions');
00706 }
00707
00713 public function getModuleEvents()
00714 {
00715 return (array) $this->getConfig()->getConfigParam('aModuleEvents');
00716 }
00717
00725 protected function _hasInstalledTemplateBlocks( $sModuleId )
00726 {
00727 $sShopId = $this->getConfig()->getShopId();
00728 $oDb = oxDb::getDb();
00729 $blRes = $oDb->getOne( "SELECT 1 FROM oxtplblocks WHERE oxmodule = ".$oDb->quote($sModuleId)." AND oxshopid = '$sShopId' LIMIT 1" );
00730 return (bool) $blRes;
00731 }
00732
00741 protected function _addTemplateBlocks( $aModuleBlocks, $sModuleId = null )
00742 {
00743 if (is_null($sModuleId)) {
00744 $sModuleId = $this->getId();
00745 }
00746
00747 $sShopId = $this->getConfig()->getShopId();
00748 $oDb = oxDb::getDb();
00749
00750 if ( is_array($aModuleBlocks) ) {
00751
00752 foreach ( $aModuleBlocks as $aValue ) {
00753 $sOxId = oxUtilsObject::getInstance()->generateUId();
00754
00755 $sTemplate = $aValue["template"];
00756 $iPosition = $aValue["position"]?$aValue["position"]:1;
00757 $sBlock = $aValue["block"];
00758 $sFile = $aValue["file"];
00759
00760 $sSql = "INSERT INTO `oxtplblocks` (`OXID`, `OXACTIVE`, `OXSHOPID`, `OXTEMPLATE`, `OXBLOCKNAME`, `OXPOS`, `OXFILE`, `OXMODULE`)
00761 VALUES ('{$sOxId}', 1, '{$sShopId}', ".$oDb->quote($sTemplate).", ".$oDb->quote($sBlock).", ".$oDb->quote($iPosition).", ".$oDb->quote($sFile).", '{$sModuleId}')";
00762
00763 $oDb->execute( $sSql );
00764 }
00765 }
00766 }
00767
00776 protected function _addTemplateFiles( $aModuleTemplates , $sModuleId = null)
00777 {
00778 if (is_null($sModuleId)) {
00779 $sModuleId = $this->getId();
00780 }
00781
00782 $oConfig = $this->getConfig();
00783 $aTemplates = $this->getModuleTemplates();
00784 if ( is_array($aModuleTemplates) ) {
00785 $aTemplates[$sModuleId] = $aModuleTemplates;
00786 }
00787
00788 $oConfig->setConfigParam('aModuleTemplates', $aTemplates);
00789 $oConfig->saveShopConfVar('aarr', 'aModuleTemplates', $aTemplates);
00790 }
00791
00800 protected function _addModuleVersion( $sModuleVersion, $sModuleId = null)
00801 {
00802 if (is_null($sModuleId)) {
00803 $sModuleId = $this->getId();
00804 }
00805
00806 $oConfig = $this->getConfig();
00807 $aVersions = $this->getModuleVersions();
00808 if ( is_array($aVersions) ) {
00809 $aVersions[$sModuleId] = $sModuleVersion;
00810 }
00811
00812 $oConfig->setConfigParam('aModuleVersions', $aVersions);
00813 $oConfig->saveShopConfVar('aarr', 'aModuleVersions', $aVersions);
00814 }
00815
00824 protected function _addModuleEvents( $aModuleEvents, $sModuleId = null)
00825 {
00826 if (is_null($sModuleId)) {
00827 $sModuleId = $this->getId();
00828 }
00829
00830 $oConfig = $this->getConfig();
00831 $aEvents = $this->getModuleEvents();
00832 if ( is_array($aEvents) ) {
00833 $aEvents[$sModuleId] = $aModuleEvents;
00834 }
00835
00836 $oConfig->setConfigParam('aModuleEvents', $aEvents);
00837 $oConfig->saveShopConfVar('aarr', 'aModuleEvents', $aEvents);
00838 }
00839
00848 protected function _addModuleFiles( $aModuleFiles, $sModuleId = null)
00849 {
00850 if (is_null($sModuleId)) {
00851 $sModuleId = $this->getId();
00852 }
00853
00854 $oConfig = $this->getConfig();
00855 $aFiles = $this->getModuleFiles();
00856 if ( is_array($aModuleFiles) ) {
00857 $aFiles[$sModuleId] = array_change_key_case($aModuleFiles, CASE_LOWER);
00858 }
00859
00860 $oConfig->setConfigParam('aModuleFiles', $aFiles);
00861 $oConfig->saveShopConfVar('aarr', 'aModuleFiles', $aFiles);
00862 }
00863
00872 protected function _addModuleSettings( $aModuleSettings, $sModuleId = null )
00873 {
00874 if (is_null($sModuleId)) {
00875 $sModuleId = $this->getId();
00876 }
00877 $oConfig = $this->getConfig();
00878 $sShopId = $oConfig->getShopId();
00879 $oDb = oxDb::getDb();
00880
00881 if ( is_array($aModuleSettings) ) {
00882
00883 foreach ( $aModuleSettings as $aValue ) {
00884 $sOxId = oxUtilsObject::getInstance()->generateUId();
00885
00886 $sModule = 'module:'.$sModuleId;
00887 $sName = $aValue["name"];
00888 $sType = $aValue["type"];
00889 $sValue = is_null($oConfig->getConfigParam($sName))?$aValue["value"]:$oConfig->getConfigParam($sName);
00890 $sGroup = $aValue["group"];
00891
00892 $sConstraints = "";
00893 if ( $aValue["constraints"] ) {
00894 $sConstraints = $aValue["constraints"];
00895 } elseif ( $aValue["constrains"] ) {
00896 $sConstraints = $aValue["constrains"];
00897 }
00898
00899 $iPosition = $aValue["position"]?$aValue["position"]:1;
00900
00901 $oConfig->setConfigParam($sName, $sValue);
00902 $oConfig->saveShopConfVar($sType, $sName, $sValue, $sShopId, $sModule);
00903
00904 $sDeleteSql = "DELETE FROM `oxconfigdisplay` WHERE OXCFGMODULE=".$oDb->quote($sModule)." AND OXCFGVARNAME=".$oDb->quote($sName);
00905 $sInsertSql = "INSERT INTO `oxconfigdisplay` (`OXID`, `OXCFGMODULE`, `OXCFGVARNAME`, `OXGROUPING`, `OXVARCONSTRAINT`, `OXPOS`) ".
00906 "VALUES ('{$sOxId}', ".$oDb->quote($sModule).", ".$oDb->quote($sName).", ".$oDb->quote($sGroup).", ".$oDb->quote($sConstraints).", ".$oDb->quote($iPosition).")";
00907
00908 $oDb->execute( $sDeleteSql );
00909 $oDb->execute( $sInsertSql );
00910 }
00911 }
00912 }
00913
00921 public function getTemplates( $sModuleId = null )
00922 {
00923 if (is_null($sModuleId)) {
00924 $sModuleId = $this->getId();
00925 }
00926
00927 if (!$sModuleId) {
00928 return array();
00929 }
00930
00931 $sShopId = $this->getConfig()->getShopId();
00932
00933 $aTemplates = oxDb::getDb()->getCol("SELECT oxtemplate FROM oxtplblocks WHERE oxmodule = '$sModuleId' AND oxshopid = '$sShopId'" );
00934
00935 return $aTemplates;
00936 }
00937
00949 public function saveLegacyModule($sModuleId, $sModuleName, $aModuleInfo = null)
00950 {
00951 $aLegacyModules = $this->getLegacyModules();
00952
00953 if ( !empty( $aModuleInfo ) && is_array($aModuleInfo)) {
00954 $aLegacyModules[$sModuleId]["id"] = $sModuleId;
00955 $aLegacyModules[$sModuleId]["title"] = ( $sModuleName ) ? $sModuleName : $sModuleId;
00956 $aLegacyModules[$sModuleId]['extend'] = array();
00957
00958 foreach ( $aModuleInfo as $sKey => $sValue ) {
00959 if ( strpos( $sValue, "=>" ) > 1 ) {
00960 $aClassInfo = explode( "=>", $sValue );
00961 $sClassName = trim( $aClassInfo[0] );
00962 $sExtendString = trim( $aClassInfo[1] );
00963 $aLegacyModules[$sModuleId]['extend'][$sClassName] = $sExtendString;
00964 }
00965 }
00966 }
00967
00968 if ( !empty( $aLegacyModules[$sModuleId]['extend'] ) ) {
00969 $this->getConfig()->saveShopConfVar( "aarr", "aLegacyModules", $aLegacyModules );
00970 }
00971 return $sModuleId;
00972 }
00973
00982 public function updateModuleIds( $sModuleLegacyId, $sModuleId )
00983 {
00984 $oConfig = $this->getConfig();
00985
00986
00987 $aModulePaths = $oConfig->getConfigParam( 'aModulePaths' );
00988 $aModulePaths[$sModuleId] = $aModulePaths[$sModuleLegacyId];
00989 unset( $aModulePaths[$sModuleLegacyId] );
00990
00991 $oConfig->saveShopConfVar( 'aarr', 'aModulePaths', $aModulePaths );
00992
00993 if ( isset($aModulePaths[$sModuleLegacyId]) ) {
00994 $aModulePaths[$sModuleId] = $aModulePaths[$sModuleLegacyId];
00995 unset( $aModulePaths[$sModuleLegacyId] );
00996 $oConfig->saveShopConfVar( 'aarr', 'aModulePaths', $aModulePaths );
00997 }
00998
00999
01000 $aDisabledModules = $oConfig->getConfigParam( 'aDisabledModules' );
01001
01002 if ( is_array($aDisabledModules) ) {
01003 $iOldKey = array_search( $sModuleLegacyId, $aDisabledModules );
01004 if ( $iOldKey !== false ) {
01005 unset( $aDisabledModules[$iOldKey] );
01006 $aDisabledModules[$iOldKey] = $sModuleId;
01007 $oConfig->saveShopConfVar( 'arr', 'aDisabledModules', $aDisabledModules );
01008 }
01009 }
01010 }
01011
01015 protected function _clearApcCache()
01016 {
01017 if ( extension_loaded( 'apc' ) && ini_get( 'apc.enabled' ) ) {
01018 apc_clear_cache();
01019 }
01020 }
01021
01025 protected function _removeFromDisabledList()
01026 {
01027 $oConfig = $this->getConfig();
01028 $aDisabledModules = $this->getDisabledModules();
01029 $sModuleId = $this->getId();
01030
01031 if ( isset( $aDisabledModules ) && is_array( $aDisabledModules ) ) {
01032 $aDisabledModules = array_diff( $aDisabledModules, array($sModuleId) );
01033 $oConfig->setConfigParam( 'aDisabledModules', $aDisabledModules );
01034 $oConfig->saveShopConfVar( 'arr', 'aDisabledModules', $aDisabledModules );
01035 }
01036 }
01037
01041 protected function _addExtensions()
01042 {
01043 $oConfig = $this->getConfig();
01044 $aModules = $this->_removeNotUsedExtensions( $this->getAllModules() );
01045
01046 if ( $this->hasExtendClass() ) {
01047 $aAddModules = $this->getExtensions();
01048 $aModules = $this->mergeModuleArrays( $aModules, $aAddModules );
01049 }
01050
01051 $aModules = $this->buildModuleChains( $aModules );
01052 $oConfig->setConfigParam( 'aModules', $aModules );
01053 $oConfig->saveShopConfVar( 'aarr', 'aModules', $aModules );
01054 }
01055
01059 protected function _addToDisabledList( $sModuleId )
01060 {
01061 $oConfig = $this->getConfig();
01062 $aDisabledModules = $this->getDisabledModules();
01063
01064 if ( !is_array( $aDisabledModules ) ) {
01065 $aDisabledModules = array();
01066 }
01067 $aModules = array_merge( $aDisabledModules, array( $sModuleId ) );
01068 $aModules = array_unique( $aModules );
01069
01070 $oConfig->saveShopConfVar( 'arr', 'aDisabledModules', $aModules );
01071 $oConfig->setConfigParam( 'aDisabledModules', $aModules );
01072 }
01073
01081 protected function _removeNotUsedExtensions( $aInstalledExtensions )
01082 {
01083 $aModuleExtensions = $this->getExtensions();
01084
01085 $aInstalledModuleExtensions = $this->filterModuleArray( $aInstalledExtensions, $this->getId() );
01086
01087 if ( count( $aInstalledModuleExtensions ) ) {
01088 $aGarbage = $this->_getModuleExtensionsGarbage( $aModuleExtensions, $aInstalledModuleExtensions );
01089
01090 if ( count( $aGarbage ) ) {
01091 $aInstalledExtensions = $this->_removeGarbage( $aInstalledExtensions, $aGarbage );
01092 }
01093 }
01094
01095 return $aInstalledExtensions;
01096 }
01097
01106 protected function _getModuleExtensionsGarbage( $aModuleMetaDataExtensions, $aModuleInstalledExtensions )
01107 {
01108 $aGarbage = $aModuleInstalledExtensions;
01109
01110 foreach ( $aModuleMetaDataExtensions as $sClassName => $sClassPath ) {
01111 if ( isset( $aGarbage[$sClassName] ) ) {
01112 unset( $aGarbage[$sClassName][ array_search( $sClassPath, $aGarbage[$sClassName] )] );
01113 if ( count( $aGarbage[$sClassName] ) == 0 ) {
01114 unset( $aGarbage[$sClassName] );
01115 }
01116 }
01117 }
01118
01119 return $aGarbage;
01120 }
01121
01130 protected function _removeGarbage( $aInstalledExtensions, $aGarbage )
01131 {
01132 foreach ( $aGarbage as $sClassName => $aClassPaths ) {
01133 foreach ( $aClassPaths as $sClassPath ) {
01134 if ( isset( $aInstalledExtensions[$sClassName] ) ) {
01135 unset( $aInstalledExtensions[$sClassName][ array_search( $sClassPath, $aInstalledExtensions[$sClassName] )] );
01136 if ( count( $aInstalledExtensions[$sClassName] ) == 0 ) {
01137 unset( $aInstalledExtensions[$sClassName] );
01138 }
01139 }
01140 }
01141 }
01142
01143 return $aInstalledExtensions;
01144 }
01145
01153 protected function _countActivatedExtensions( $aModuleExtensions, $aInstalledExtensions )
01154 {
01155 $iActive = 0;
01156 foreach ( $aModuleExtensions as $sClass => $mExtension ) {
01157 if ( is_array( $mExtension ) ) {
01158 foreach ( $mExtension as $sExtension ) {
01159 if ( ( isset( $aInstalledExtensions[$sClass] ) && in_array( $sExtension, $aInstalledExtensions[$sClass] ) ) ) {
01160 $iActive++;
01161 }
01162 }
01163 } elseif ( ( isset( $aInstalledExtensions[$sClass] ) && in_array( $mExtension, $aInstalledExtensions[$sClass] ) ) ) {
01164 $iActive++;
01165 }
01166 }
01167
01168 return $iActive;
01169 }
01170
01177 protected function _countExtensions( $aModuleExtensions )
01178 {
01179 $iCount = 0;
01180 foreach ( $aModuleExtensions as $mExtensions ) {
01181 if ( is_array( $mExtensions ) ) {
01182 $iCount += count( $mExtensions );
01183 } else {
01184 $iCount++;
01185 }
01186 }
01187
01188 return $iCount;
01189 }
01190
01196 protected function _isExtensionsActive()
01197 {
01198 $aModuleExtensions = $this->getExtensions();
01199 $aInstalledExtensions = $this->getAllModules();
01200 $iModuleExtensionsCount = $this->_countExtensions( $aModuleExtensions );
01201 $iActivatedModuleExtensionsCount = $this->_countActivatedExtensions( $aModuleExtensions, $aInstalledExtensions );
01202 $blActive = $iModuleExtensionsCount > 0 && $iActivatedModuleExtensionsCount == $iModuleExtensionsCount;
01203
01204 return $blActive;
01205 }
01206
01213 protected function _isInDisabledList( $sId )
01214 {
01215 $blInDisabledList = false;
01216
01217 $aDisabledModules = $this->getDisabledModules();
01218 if ( is_array( $aDisabledModules ) && in_array( $sId, $aDisabledModules ) ) {
01219 $blInDisabledList = true;
01220 }
01221
01222 return $blInDisabledList;
01223 }
01224 }