如何正确禁用(模型)重写


10

有一个第三方扩展可以重写特定的Magento核心类。它是块,助手还是模型都没有关系,但在这种情况下,它是模型。现在我遇到这种重写是不好的,我想禁用它而不更改第三方扩展名。因此,我编写了一个依赖于第三方扩展的自定义扩展。禁用第三方重写的最佳方法是什么?我能想到的一个安全的方法是定义一个自定义重写,该自定义重写用于代替第三方重写:

<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,该类直接从Mage类扩展而来,因此禁用了第三方重写:

class Custom_Extension_Model_Sth extends Mage_Core_Model_Sth
{

}

这可行,但感觉不太好。考虑到观察者,可以通过将它们设置为来仅通过config.xml禁用它们disabled。通过重写是否可能发生这种情况?我尝试使用以下内容,并且可以正常工作:

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

但是这样做安全吗?它适用于所有版本吗?我从来没有在野外看到过,这就是为什么我要问。

Answers:


1

只要该节点确实为空,magento就会认为没有重写,并且“使用类前缀来形成类名称”就好像该节点永远不会存在。在中Mage_Core_Model_Config::getGroupedClassName

但是我确实认为您应该使用<sth/>而不是<sth></sth>停止格式化以将标签更改为不为空(在magento眼中为'\ n'),这将导致类未找到错误。

我不相信帮手,方块或模型有一个“禁用”选项。您还可以使用观察者(将配置重新带回原来的样子),但是我看到的问题是,您然后在模块之后使用任何观察者来强迫任何想要添加重写的模块使用观察者allso或知道通过XML禁用观察者。

就像是:

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

因此对我来说XML方式胜出。


3

我要说的是,如果您要创建一个自定义模块来抵消它,请确保它对被覆盖的模块具有依赖性。

为了防止意外行为,我可能会以“适当”的方式重新定义重写

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

最近遇到了一个问题,即Magento未检测到其他标签中的1个空标签,null而是返回了引发警告的对象。不是致命的,但是在开发人员模式下并且对于日志记录来说很烦人。

但是这里没有确凿的证据来证明您的方式会导致错误:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.