【问题标题】:Magento -> Rerewrite modelMagento -> 重写模型
【发布时间】:2012-12-22 09:52:56
【问题描述】:

我要重写模型:

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>

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

【问题讨论】:

    标签: magento rewrite


    【解决方案1】:

    除非我忘记了我的记忆,否则您会希望使您的模块“依赖”于他们的模块,以便您的重写最后并生效。为此,您可以将以下内容添加到节点内的 app/etc/modules/My_Module.xml 文件中:

    <depends>
         <Their_Module />
    </depends>
    

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

    class My_Module_Model_Quote_Address extends Payone_Core_Model_Sales_Quote_Address
    

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

    【讨论】:

    • 虽然这确实很好,但我并不完全满足于这个解决方案,因为它使禁用模块变得更加困难。不过目前它可能仍然是最简单的选择。
    • +1,因为它是最好的解决方案...这是一个 PHP 问题(缺乏多重继承)而不是 Magento 问题 - 尽管它确实受到了影响。
    • @Lucasmus 我同意,由于您提到的原因,这不一定是处理此类问题的最佳方法,观察者/挂钩/多重继承会更好。正如 Daniel 所说,这是 PHP 成为单继承语言的结果。 PHP 5.4 将增加对traits 的支持,但我怀疑 Magento 会很快重新设计以使用它们(并强制使用 PHP 5.4)。所以现在我们被困在使用构建模块的语言和平台的能力上。 :)
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      ...不懂的问题...

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • AITOC 模块的重写系统是一块垃圾,我不会用十英尺长的杆子碰它。它带来的麻烦多于其价值。
        猜你喜欢
        • 2016-02-28
        • 2015-12-08
        • 1970-01-01
        • 2011-10-18
        • 2014-03-13
        • 2016-01-09
        • 2015-05-14
        • 1970-01-01
        相关资源
        最近更新 更多