Magento -多个类扩展相同的核心类


Magento - multiple classes extending same core class

我相信我们都遇到过这样的情况:您有多个块或模型的扩展,重写了相同的核心块/模型。我遇到的问题是:如何控制Magento看到这些类的顺序?

例如,假设我们有两个扩展,包含以下两个类:

A

config . xml

<catalog>
    <rewrite>
        <product_view>My_ClassA_Block_Catalog_Product_View</product_view>
    </rewrite>
</catalog>

我的/ClassA/块/目录/产品/View.php

class My_ClassA_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}

B类

<catalog>
    <rewrite>
        <product_view>My_ClassB_Block_Catalog_Product_View</product_view>
    </rewrite>
</catalog>

我的/ClassB/块/目录/产品/View.php

class My_ClassB_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}

,

建议的解决方案是改变其中一个,使它们扩展另一个并将它们链接在一起(class A extends B {}, class B extends C {}等):

我的/ClassA/块/目录/产品/View.php

class My_ClassA_Block_Catalog_Product_View extends My_ClassB_Block_Catalog_Product_View {}

我的/ClassB/块/目录/产品/View.php

class My_ClassB_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}

,

我遇到的问题是Magento不一定这么看。我不知道它是按字母顺序排列的还是随机的,但有时它起作用,有时不起作用。在某些情况下,Magento优先考虑ClassB,并且所有对createBlock('catalog/product_view')的调用都会创建一个ClassB的实例,完全绕过ClassA中的任何代码。

所以我的问题是:当2个不同的扩展都重写核心catalog_product_view类时,我如何控制哪个类由createBlock('catalog/product_view')实例化?

当Magento获取要用于特定块的类时,它在合并的config.xml树中查找单个节点

catalog/rewrite/product_view
多次重写的问题是,由于Magento加载模块的XML,将其与配置树合并,然后加载另一个模型的方式,只有一个节点可以在那里。这意味着您只能将一个类别名解析为一个类名。

就是

里面的文件
app/etc/modules/*.xml

开始发挥作用。这些文件告诉Magento要使用哪些模块。它们还支持<depends>标签。这个标签允许您说某些模块依赖于另一个模块,这意味着它们的config.xml将在另一个模块的config.xml之后加载。通过这种方式,您可以控制模块加载的顺序,从而控制哪个合并的重写节点"胜出",这反过来将允许您知道哪个类需要成为继承链中的最后一个。