有条件地覆盖/重写magento中的类

时间:2011-01-18 10:07:05

标签: php xml magento magento-1.4

我知道我可以在我的模块的config.xml中使用以下语法覆盖/重写模块中的模型类。:

<config>
    <global>
        <models>
            <moduletooverride>
                <rewrite>
                    <modeltooverride>Mycompany_Mymodule_Model_Myfolder_Myclass</customer>
                </rewrite>
            </moduletooverride>
         </models>
     </global>
</config>

但是如果我希望这是有条件的(例如基于我的模块adminhtml配置部分中的一些设置?)

这有什么语法吗?

或者有一种方法可以让我重写的课程在重写之前进入课程吗? (允许它称其为“前任”。

3 个答案:

答案 0 :(得分:5)

没有内置的配置选项可以让你有条件地重写这样的类。

但是,重写的类只是一个扩展类,因此所有标准OOP规则都适用,包括使用parent::所以类似

class My_Rewritten_Class extends Class_I_Rewrote
{

    public function theMethodIRewrote($param, $options)
    {
        $original_results = parent::theMethodIRewrote($param, $options);
        if(!Mage::getStoreConfigFlag('path/to_my/on_or_off_flag'))
        {
            return $original_results
        }

        //continue with the rewrite
    }
}

最后,虽然我从来没有尝试过,但您应该可以使用

获得对已解析配置选项的引用
$config->Mage::getConfig();

然后使用其setOptions方法手动设置或取消设置重写选项。

答案 1 :(得分:2)

在这次讨论中有一些很好的建议:What is the best way to limit a modules functionality by store or website

特别是,this answer有一种简短而又甜蜜的技巧,不仅可以用于存储条件。

答案 2 :(得分:1)

像这样的方法  parent::theMethodIRewrote($param, $options) 并不总是可用,所以尝试以下非常简单的解决方案:

if (!Mage::helper('mymodule')->isEnabled()){

    class My_Rewritten_Class extends Class_I_Rewrote{} //empty body - nothing rewritten

}else{

    class My_Rewritten_Class extends Class_I_Rewrote{

        public function theMethodIRewrote($param, $options){
              /* method body ... */
        }

        /* other methods ... */

    }

}

在我的情况下(magento 1.6.0.0,php 5.3)它似乎正在工作。