Come disabilitare correttamente una riscrittura (modello)


10

Esiste un'estensione di terze parti che riscrive una specifica classe principale di Magento. Non dovrebbe importare se si tratta di un blocco, un aiuto o un modello, ma in questo caso è un modello. Ora ho riscontrato che questa riscrittura è errata e vorrei disabilitarla senza modificare l'estensione di terze parti. Quindi, scrivo un'estensione personalizzata che dipende dall'estensione di terze parti. Qual è il modo migliore per disabilitare la riscrittura di terze parti? Quello che mi viene in mente è di definire una riscrittura personalizzata, che viene utilizzata al posto della riscrittura di terze parti:

<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, la classe si estende direttamente dalla classe Mage e pertanto disabilita la riscrittura di terze parti:

class Custom_Extension_Model_Sth extends Mage_Core_Model_Sth
{

}

Funziona, ma non è troppo bello. Pensando agli osservatori, è possibile disabilitarli solo tramite config.xml impostandoli su disabled. È possibile qualcosa di simile con le riscritture? Ho provato a usare quanto segue e funziona:

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

Ma è sicuro farlo? Funziona in tutte le versioni? Non l'ho mai visto allo stato brado, ecco perché lo sto chiedendo.

Risposte:


1

Finché il nodo è veramente vuoto, Magento penserà che non ci sia stata riscrittura e 'usa il prefisso della classe per formare il nome della classe' se il nodo non è mai stato loro. In Mage_Core_Model_Config::getGroupedClassName.

Penso comunque che dovresti usare <sth/>piuttosto che <sth></sth>fermare la formattazione cambiando il tag in non vuoto ('\ n' agli occhi di Magento) che genererà un errore di classe non trovato.

Non credo che esista un'opzione di "disabilitazione" per helper, blocchi o modelli. Potresti anche usare un Observer (che riporterà la configurazione come dovrebbe essere esattamente) ma il problema che vedo è che devi quindi forzare qualsiasi modulo che vuole aggiungere quella riscrittura dopo il tuo modulo per usare un osservatore allso o sapere per disabilitare il tuo osservatore tramite XML.

Qualcosa di simile a:

    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);
        }
    }

Quindi per me vince il modo XML.


3

Direi che se crei un modulo personalizzato per contrastare questo assicurati che abbia una dipendenza dal modulo che sta sovrascrivendo.

Per evitare comportamenti imprevisti, probabilmente avrei ridefinito la riscrittura in modo "corretto"

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

Di recente si è verificato un problema in cui 1 tag vuoto all'interno di un altro tag non è stato rilevato da Magento, restituito al nullposto di un oggetto che ha lanciato un avviso. Non fatale ma in modalità sviluppatore e per il log abbastanza fastidioso.

Ma nessuna prova concreta qui per dimostrare che la tua strada provocherebbe errori :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.