Como desativar corretamente uma reescrita (modelo)

10

Há uma extensão de terceiros que reescreve uma classe principal específica do Magento. Não importa se é um bloco, auxiliar ou modelo, mas, neste caso, é um modelo. Agora, acho que essa reescrita está incorreta e gostaria de desativá-la sem alterar a extensão de terceiros. Por isso, escrevo uma extensão personalizada que depende da extensão de terceiros. Qual é a melhor maneira de desativar a reescrita de terceiros? O mais seguro em que posso pensar é definir uma reescrita personalizada, usada em vez da reescrita de terceiros:

<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, a classe se estende diretamente da classe Mage e, portanto, desabilita a reescrita de terceiros:

class Custom_Extension_Model_Sth extends Mage_Core_Model_Sth
{

}

Isso funciona, mas não parece muito bom. Pensando nos observadores, é possível desativá-los apenas via config.xml configurando-os para disabled. É possível algo assim com reescritas? Eu tentei usar o seguinte e funciona:

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

Mas é seguro fazer isso? Funciona em todas as versões? Eu nunca vi isso na natureza, é por isso que estou perguntando.

Simon
fonte

Respostas:

1

Enquanto o nó estiver verdadeiramente vazio, o magento pensará que não houve reescrita e 'usará o prefixo da classe para formar o nome da classe', se o nó nunca tiver sido o deles. In Mage_Core_Model_Config::getGroupedClassName.

No entanto, acho que você deve usar, em <sth/>vez de <sth></sth>parar de formatar, alterar a tag para não ficar vazia ('\ n' aos olhos do magento), o que resultará em um erro de classe não encontrado.

Não acredito que haja uma opção 'desativar' para ajudantes, blocos ou modelos. Você também pode usar um Observer (que trará a configuração de volta exatamente como deveria ser), mas o problema que vejo é que você força qualquer módulo que deseje adicionar essa reescrita após o módulo a usar um observador allso ou saber desativar seu observador via XML.

Algo como:

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

Então, para mim, o caminho XML vence.

James Anelay - TheExtensionLab
fonte
3

Eu diria que se você criar um módulo personalizado para neutralizar isso, verifique se ele depende do módulo que está sobrescrevendo.

Para evitar um comportamento inesperado, eu provavelmente redefiniria a reescrita de uma maneira 'adequada'

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

Recentemente, deparei-me com um problema em que uma tag vazia dentro de outra tag não foi detectada pelo Magento, retornada em nullvez de um objeto que emitia um aviso. Não é fatal, mas no modo de desenvolvedor e por registrar bastante irritante.

Mas nenhuma evidência concreta aqui para provar seu caminho causaria erros :)

Sander Mangel
fonte