Magento – Modul Ausgabe über XML für Website deaktivieren

UnbenanntEs 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!

Published by Covos

Seit 2009 arbeite ich nun intensiv mit Magento. Begonnen habe ich mit der Erstellung und dem Betrieb von B2C-Shops. Ausgeweitet wurde dies durch meine Tätigkeit im Logistik-Sektor. Hieraus entstanden erste spezialisierte B2E-Systeme. Heute arbeite ich tag-täglich mit spannenden B2C-, B2B- und B2E-Projekten und berichte in diesem Blog über Herausforderungen und gebe Insider-Tipps.

Leave a Reply

Your email address will not be published. Required fields are marked *