Cómo deshabilitar correctamente una reescritura (modelo)

10

Hay una extensión de terceros que reescribe una clase principal específica de Magento. No debería importar si es un bloque, auxiliar o modelo, pero en este caso es un modelo. Ahora encuentro que esta reescritura es mala y me gustaría deshabilitarla sin cambiar la extensión de terceros. Por lo tanto, escribo una extensión personalizada que depende de la extensión de terceros. ¿Cuál es la mejor manera de deshabilitar la reescritura de terceros? Lo más seguro que se me ocurre es definir una reescritura personalizada, que se utiliza en lugar de la reescritura de terceros:

<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 clase se extiende directamente desde la clase Mage y, por lo tanto, deshabilita la reescritura de terceros:

class Custom_Extension_Model_Sth extends Mage_Core_Model_Sth
{

}

Esto funciona, pero no se siente muy bien. Pensando en los observadores, es posible deshabilitarlos solo a través de config.xml configurándolos en disabled. ¿Es posible algo así con reescrituras? Traté de usar lo siguiente y funciona:

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

¿Pero es seguro hacer eso? ¿Funciona en todas las versiones? Nunca vi eso en la naturaleza, es por eso que pregunto.

Simón
fuente

Respuestas:

1

Mientras el nodo esté verdaderamente vacío, magento pensará que no hubo reescritura y 'usará el prefijo de clase para formar el nombre de la clase' si el nodo nunca fue su. En Mage_Core_Model_Config::getGroupedClassName.

Sin embargo, creo que debería usar en <sth/>lugar de <sth></sth>dejar de formatear el cambio de la etiqueta para que no esté vacía ('\ n' en los ojos de magento) que arrojará un error de clase no encontrada.

No creo que haya una opción de 'deshabilitar' para ayudantes, bloques o modelos. También podría usar un Observador (que devolverá la configuración a la forma en que debería ser exactamente), pero el problema que veo con eso es que luego obliga a cualquier módulo que quiera agregar esa reescritura nuevamente después de su módulo para usar un observador también o saber desactivar su observador a través de 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);
        }
    }

Entonces, para mí, la forma XML gana.

James Anelay - TheExtensionLab
fuente
3

Diría que si crea un módulo personalizado para contrarrestar esto, asegúrese de que depende del módulo que está sobrescribiendo.

Para evitar un comportamiento inesperado, probablemente redefiniría la reescritura de una manera 'adecuada'

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

Recientemente encontré un problema en el que 1 etiqueta vacía dentro de otra etiqueta no fue detectada por Magento, devuelta en nulllugar de un objeto que arrojó una advertencia. No es fatal, pero en modo desarrollador y por iniciar sesión bastante molesto.

Pero aquí no hay pruebas contundentes que demuestren que tu camino causaría errores :)

Sander Mangel
fuente