2

我想重写模型:

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>

但这不起作用。有什么提示吗?

4

4 回答 4

5

除非我忘记了我的记忆,否则你会想让你的模块“依赖”他们的模块,以便你的重写最后并生效。您可以通过将以下内容添加到app/etc/modules/My_Module.xml节点内的文件中来执行此操作:

<depends>
     <Their_Module />
</depends>

一旦你这样做了,让你的班级扩展他们的:

class My_Module_Model_Quote_Address extends Payone_Core_Model_Sales_Quote_Address

如果您可以使用事件观察器做您需要的事情,那么请改为这样做。但是,如果您需要重写,上述内容将使您到达您需要的地方。

于 2013-01-08T14:44:47.640 回答
3

最好的方法是在你的重写中使用观察者(相信我,你可以在不重写的情况下进行很多修改。、、、、非常强大<model>_load_after)。<model>_save_before<model>_save_after<model>_load_after

但是如果您仍然需要进行重写,您可以将depends节点添加到您的模块(以确保它将在 Payone 之后加载)并重写 Payone_Core_Model_Sales_Quote_Address 而不是 Mage_Sales_Model_Quote_Address

还有另一种方法可以解决这个问题:合并类中的所有更改并删除以前的重写。但是这种方式给整个系统增加了混乱,影响了模块化的完整性。

于 2013-01-08T14:42:46.160 回答
1

好吧......大卫阿尔杰的回答中缺少它......上面的答案是一种更合理的架构方法,如果可以避免扩展,请在事件观察器中使用对象组合来处理对象。

让我解释一下为什么它不适合你:

当从所有模块加载系统配置时,它会以 .xml 文件被使用的任何顺序加载。发出重写时,Magento 配置会在与配置 xml 层次结构相同的级别创建记录,该层次结构将引用该类<class>Mage_Sales_Model_Quote_Addess</class>

每当 Magento 加载一个类时,它会检查该层次结构级别的<rewrite>Payone_Sales_Model_Quote_Address</rewrite>节点,如果存在则加载该节点,如果不存在则加载该类节点。

通过放置<depends><Thier_Module></depends>节点,您的重写将在配置加载时最后加载,并在此节点级别替换它们的重写。

...不理解的问题...

...导致您的问题的基本功能是未来的模块引入可能会重写您的模块,您将再次摸不着头脑...如果您引入另一个重写同一类的模块会发生什么?

于 2013-12-24T22:55:52.453 回答
0

您必须以某种方式将这些文件合并到一个文件中并使用该文件,因为默认情况下 Magento 不支持对同一文件进行多次覆盖。

Magento 扩展开发人员 Aitoc 提供了一个自定义重写扩展,其模块似乎可以处理这个问题,如果检测到这个,它会自动将多个覆盖移动到一个中。我还没有测试它,但也许它可以帮助你。

于 2013-01-08T14:32:08.883 回答