So deaktivieren Sie ein (Modell-) Rewrite ordnungsgemäß

10

Es gibt eine Drittanbieter-Erweiterung, die eine bestimmte Magento-Kernklasse neu schreibt. Es sollte keine Rolle spielen, ob es sich um einen Block, einen Helfer oder ein Modell handelt, aber in diesem Fall handelt es sich um ein Modell. Jetzt stelle ich fest, dass dieses Umschreiben schlecht ist und ich es deaktivieren möchte, ohne die Erweiterung eines Drittanbieters zu ändern. Daher schreibe ich eine benutzerdefinierte Erweiterung, die von der Erweiterung eines Drittanbieters abhängt. Was ist der beste Weg, um das Umschreiben durch Dritte zu deaktivieren? Das Sicherste, an das ich denken kann, ist das Definieren eines benutzerdefinierten Umschreibens, das anstelle des Umschreibens von Drittanbietern verwendet wird:

<global>
    <models>
        <custom_extension>
            <class>Custom_Extension_Model</class>
        </custom_extension>
        <mage_core>
            <rewrite>
                <sth>Custom_Extension_Model_Sth</sth>
            </rewrite>
        </mage_core>
    </models>
</global>

Sth.php, class erstreckt sich direkt von der Mage-Klasse und deaktiviert daher das Umschreiben durch Dritte:

class Custom_Extension_Model_Sth extends Mage_Core_Model_Sth
{

}

Das funktioniert, fühlt sich aber nicht gut an. Wenn Sie an Beobachter denken, können Sie diese nur über config.xml deaktivieren, indem Sie sie auf setzen disabled. Ist so etwas mit Umschreibungen möglich? Ich habe versucht, Folgendes zu verwenden, und es funktioniert:

<global>
    <models>
        <mage_core>
            <rewrite>
                <sth></sth>
            </rewrite>
        </mage_core>
    </models>
</global>

Aber ist das sicher? Funktioniert es in allen Versionen? Ich habe das in freier Wildbahn nie gesehen, deshalb frage ich.

Simon
quelle

Antworten:

1

Solange der Knoten wirklich leer ist, wird Magento denken, dass es kein Umschreiben gab, und 'Klassenpräfix verwenden, um Klassennamen zu bilden', wenn der Knoten nie ihr war. In Mage_Core_Model_Config::getGroupedClassName.

Ich denke jedoch, dass Sie verwenden sollten, <sth/>anstatt <sth></sth>die Formatierung zu beenden , indem Sie das Tag so ändern , dass es nicht leer ist ('\ n' in Magentos Augen), was zu einem Fehler führt, bei dem die Klasse nicht gefunden wurde.

Ich glaube nicht, dass es eine Deaktivierungsoption für Helfer, Blöcke oder Modelle gibt. Sie können auch einen Observer verwenden (der die Konfiguration wieder so bringt, wie sie genau sein sollte), aber das Problem, das ich dabei sehe, ist, dass Sie jedes Modul, das dieses Umschreiben nach Ihrem Modul hinzufügen möchte, zwingen, entweder einen Observer oder auch einen Observer zu verwenden zu wissen, um Ihren Beobachter über XML zu deaktivieren.

Etwas wie:

    public function controllerActionPredispatch(Varien_Event_Observer $event)
    {
        $helper = Mage::helper('webtise_foundationalerts');
        if (! $helper->isAdmin()) {
            $node = Mage::getConfig()->getNode('global/models/core/rewrite');
unset($node->sth);
        }
    }

Für mich gewinnt also der XML-Weg.

James Anelay - TheExtensionLab
quelle
3

Ich würde sagen, wenn Sie ein benutzerdefiniertes Modul erstellen, um dem entgegenzuwirken, stellen Sie sicher, dass es von dem Modul abhängt, das überschrieben wird.

Um unerwartetes Verhalten zu verhindern, würde ich das Umschreiben wahrscheinlich auf "richtige" Weise neu definieren

<global>
    <models>
        <mage_core>
            <rewrite>
                <sth>Mage_Core_Model_Sth</sth>
            </rewrite>
        </mage_core>
    </models>
</global>

Kürzlich ist ein Problem aufgetreten, bei dem 1 leeres Tag in einem anderen Tag von Magento nicht erkannt wurde und nullanstelle eines Objekts zurückgegeben wurde, das eine Warnung ausgegeben hat. Nicht tödlich, aber im Entwicklermodus und für die Protokollierung ziemlich nervig.

Aber keine harten Beweise hier, um Ihren Weg zu beweisen, würden Fehler verursachen :)

Sander Mangel
quelle