Comment désactiver correctement une (modèle) réécriture

10

Il existe une extension tierce qui réécrit une classe principale Magento spécifique. Peu importe qu'il s'agisse d'un bloc, d'une aide ou d'un modèle, mais dans ce cas, c'est un modèle. Maintenant, je constate que cette réécriture est mauvaise et je voudrais la désactiver sans changer l'extension tierce. Par conséquent, j'écris une extension personnalisée qui dépend de l'extension tierce. Quelle est la meilleure façon de désactiver la réécriture tierce? Le plus sûr auquel je peux penser est de définir une réécriture personnalisée, qui est utilisée à la place de la réécriture tierce:

<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 s'étend directement de la classe Mage et désactive donc la réécriture tierce:

class Custom_Extension_Model_Sth extends Mage_Core_Model_Sth
{

}

Cela fonctionne, mais ne se sent pas trop bien. En pensant aux observateurs, il est possible de les désactiver uniquement via config.xml en les définissant sur disabled. Est-ce que quelque chose comme ça est possible avec des réécritures? J'ai essayé d'utiliser les éléments suivants et cela fonctionne:

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

Mais est-ce sûr de le faire? Cela fonctionne-t-il dans toutes les versions? Je n'ai jamais vu ça à l'état sauvage, c'est pourquoi je demande.

Simon
la source

Réponses:

1

Tant que le nœud est vraiment vide, magento pensera qu'il n'y a pas eu de réécriture et «utilise le préfixe de classe pour former le nom de la classe» car le nœud n'a jamais été le leur. Dans Mage_Core_Model_Config::getGroupedClassName.

Je pense cependant que vous devriez utiliser <sth/>plutôt que <sth></sth>d'arrêter le formatage en changeant la balise pour qu'elle ne soit pas vide ('\ n' aux yeux de magento), ce qui entraînera une erreur de classe non trouvée.

Je ne crois pas qu'il existe une option de «désactivation» pour les assistants, les blocs ou les modèles. Vous pouvez également utiliser un observateur (ce qui ramènera la configuration comme elle devrait être exactement), mais le problème que je vois avec cela est que vous forcez ensuite tout module qui veut ajouter cette réécriture après votre module à utiliser un observateur allso ou savoir désactiver votre observateur via XML.

Quelque chose comme:

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

Donc pour moi, la voie XML l'emporte.

James Anelay - TheExtensionLab
la source
3

Je dirais que si vous créez un module personnalisé pour contrer cela, assurez-vous qu'il a une dépendance sur le module qu'il écrase.

Pour éviter un comportement inattendu, je redéfinirais probablement la réécriture de manière «correcte»

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

Récemment, un problème est survenu: 1 balise vide à l'intérieur d'une autre balise n'a pas été détectée par Magento, renvoyée nullau lieu d'un objet qui a lancé un avertissement. Pas fatal mais en mode développeur et pour une journalisation assez ennuyeuse.

Mais aucune preuve tangible ici pour prouver votre chemin ne provoquerait des erreurs :)

Sander Mangel
la source