我知道我可以在我的模块的config.xml中使用以下语法覆盖/重写模块中的模型类。:
<config>
<global>
<models>
<moduletooverride>
<rewrite>
<modeltooverride>Mycompany_Mymodule_Model_Myfolder_Myclass</customer>
</rewrite>
</moduletooverride>
</models>
</global>
</config>
但是如果我希望这是有条件的(例如基于我的模块adminhtml配置部分中的一些设置?)
这有什么语法吗?
或者有一种方法可以让我重写的课程在重写之前进入课程吗? (允许它称其为“前任”。
答案 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)它似乎正在工作。