我想重写模型:
Mage_Sales_Model_Quote_Address
但我使用已经覆盖它的附加组件“Payone”:
<sales>
<rewrite>
<quote_address>Payone_Core_Model_Sales_Quote_Address</quote_address>
</rewrite>
</sales>
我试过了:
<core>
<rewrite>
<sales_quote_address>Mycomp_Mymod_Model_Quote_Address</sales_quote_address>
</rewrite>
</core>
但这不起作用。任何提示?
答案 0 :(得分:5)
除非我的记忆逃脱了我,否则你会希望让你的模块“依赖”他们的模块,这样你的重写就会持久并生效。您可以通过将以下内容添加到节点中的app/etc/modules/My_Module.xml
文件来执行此操作:
<depends>
<Their_Module />
</depends>
一旦你这样做,让你的课程扩展他们的课程:
class My_Module_Model_Quote_Address extends Payone_Core_Model_Sales_Quote_Address
如果您可以使用事件观察者执行所需操作,那么请执行此操作。但是如果你需要重写,上面的内容将帮助你达到目标。
答案 1 :(得分:3)
最好的方法是使用观察者进行重写(相信我,你可以做很多修改而不重写。<model>_load_after
,<model>_save_before
,<model>_save_after
,{{1}是非常强大的。)
但是如果您仍然需要进行重写,可以将<model>_load_after
节点添加到您的模块中(以确保它将在Payone之后加载)并重写Payone_Core_Model_Sales_Quote_Address而不是Mage_Sales_Model_Quote_Address
还有一种方法可以解决此问题:合并类中的所有更改并删除以前的重写。但这种方式会给整个系统带来麻烦,并影响模块化的完整性。
答案 2 :(得分:1)
嗯......大卫阿尔杰的回答中缺少的......上面的答案,是一种更健全的架构方法,如果你可以避免扩展,可以在事件观察者中使用对象组合来处理对象。
让我解释为什么它不适合你:
从所有模块加载系统配置时,将按照.xml文件的使用顺序加载它。发出重写时,Magento配置会创建与config xml层次结构相同的记录,该层次结构将引用该类<class>
Mage_Sales_Model_Quote_Addess </class>
每当Magento加载一个类时,它会检查@该层次结构级别为<rewrite>
Payone_Sales_Model_Quote_Address </rewrite>
节点,如果存在则加载它,或者如果它不存在则加载类节点。
通过放置<depends><Thier_Module></depends>
节点,您的重写在配置加载时最后加载,并在此节点级别替换它们的重写。
......不理解的问题......
...导致您出现问题的基本功能是未来的模块介绍可能会重写您的模块而您将再次陷入困境......如果您引入另一个重写相同类的模块会发生什么?
答案 3 :(得分:0)
您必须以某种方式将这些文件合并到一个文件中并使用该文件,因为默认情况下Magento不支持同一文件的多次覆盖。
Magento扩展开发人员Aitoc提供了一个自定义重写扩展,其模块似乎可以解决这个问题,如果检测到这一点,会自动将多个覆盖移动到一个。我还没有测试过,但也许它可以帮助你。