Es kann immer mal wieder vorkommen, dass es Probleme mit Extensions gibt, die z.B. nur für eine Domain lizensiert sind. Über das Backend ist die Extension dann zwar nur für diese eine Website / den einen Shop mit der Domain aktiviert und für alle anderen deaktiviert aber dennoch wirkt sich die Extension auf die anderen Shops aus und behindert oder verhindert die Anzeige im Frontend.
Anders auch Extensions die von Haus aus de-/aktiviert sind und es keine Konfigurationsmöglichkeit gibt, um zu definieren in welchem Shop bzw. auf welcher Website die Extension aktiviert sein soll und wo nicht.
Ich dachte mir, dass es doch eine Möglichkeit geben muss direkt in der Modul XML im Ordner etc/modules in der jeweiligen extension.xml etwas einzubauen, dass es heißt “wenn Website X, dann aktiv; wenn Website Y dann inaktiv”.
Nach etwas Recherche und Überlegung fand ich die Lösung:
1. Wird die Config.php aus dem Ordner app/code/core/Mage/Core/Model in den Ordner app/code/local/Mage/Core/Model kopiert und dort dann ca. ab Zeile 850 nach
$modules = $this->getNode('modules')->children(); foreach ($modules as $modName=>$module) { if ($module->is('active')) {
gesucht.
Dort wird dann
// Website Restriktion Start if((bool)$module->restricted) { $restricted = explode(',', (string)$module->restricted); $runCode = (isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : 'default'); if(in_array($runCode, $restricted)) { continue; } } // Website Restriktion Ende
eingefügt, so dass der gesamte Code dann so aussieht:
public function loadModulesConfiguration($fileName, $mergeToObject = null, $mergeModel=null) { $disableLocalModules = !$this->_canUseLocalModules(); if ($mergeToObject === null) { $mergeToObject = clone $this->_prototype; $mergeToObject->loadString('<config/>'); } if ($mergeModel === null) { $mergeModel = clone $this->_prototype; } $modules = $this->getNode('modules')->children(); foreach ($modules as $modName=>$module) { if ($module->is('active')) { // Website Restriktion Start if((bool)$module->restricted) { $restricted = explode(',', (string)$module->restricted); $runCode = (isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : 'default'); if(in_array($runCode, $restricted)) { continue; } } // Website Restriktion Ende if ($disableLocalModules && ('local' === (string)$module->codePool)) { continue; } $configFile = $this->getModuleDir('etc', $modName).DS.$fileName; if ($mergeModel->loadFile($configFile)) { $mergeToObject->extend($mergeModel, true); } } } return $mergeToObject; }
Mit diesen Zeilen wird Magento angewiesen darauf zu achten, ob in der Modul XML eine Restriktion definiert wird oder nicht.
Um nun eine solche zu setzen, öffnet man die entsprechende [Modul].xml und fügt vor den <codePool> die Zeile
<restricted>[der code des auszuschließenden Shops, kann mit Komma getrennt werden wenn mehrere Shops]</restricted>
Da man bei der gesamten Problematik davon ausgehen kann, dass es sich um einen Multistore handelt, also mehrere Websites aus einem Magento Backend ist es noch wichtig, dass die Aufteilung der Shops durch die $_SERVER Variable “MAGE_RUN_CODE” definiert wird. Dies findet man z.B. in der index.php im Rootverzeichnis.
switch($_SERVER['HTTP_HOST']) { // Shop 1 case 'shop1.de'; case 'www.shop1.de'; $_SERVER["MAGE_RUN_CODE"] = "shop1"; $_SERVER["MAGE_RUN_TYPE"] = "website"; break; // Shop2 (default store) default: $_SERVER["MAGE_RUN_CODE"] = "shop2"; $_SERVER["MAGE_RUN_TYPE"] = "website"; break;
Man würde also hier z.B. “shop1” als restricted einsetzen, wenn hier das Modul nicht aktiv sein soll.
Wichtig: Cache löschen. Am besten die sichere Methode und den Ordner cache im Verzeichnis var umbenennen und/oder löschen. Magento legt automatisch einen neuen an.
Genutzt in Magento Version 1.4.1.1 Kommentare? Ergänzungen? Hinweise? Gerne!