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

Bri*_*VPS 20 php magento magento-1.5

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

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

A级

config.xml中

<catalog>
    <rewrite>
        <product_view>My_ClassA_Block_Catalog_Product_View</product_view>
    </rewrite>
</catalog>
Run Code Online (Sandbox Code Playgroud)

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

class My_ClassA_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}
Run Code Online (Sandbox Code Playgroud)

B级

<catalog>
    <rewrite>
        <product_view>My_ClassB_Block_Catalog_Product_View</product_view>
    </rewrite>
</catalog>
Run Code Online (Sandbox Code Playgroud)

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

class My_ClassB_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}
Run Code Online (Sandbox Code Playgroud)

-

推荐的解决方案是改变它们中的一个,以便它们延伸的其他和它们连起来(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 {}
Run Code Online (Sandbox Code Playgroud)

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

class My_ClassB_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}
Run Code Online (Sandbox Code Playgroud)

-

我遇到的问题是Magento不一定会这样看.我不知道它是按字母顺序排列还是有点随机,但有时这种方法有效,有时则不然.在某些情况下,Magento优先使用ClassB和所有调用来createBlock('catalog/product_view')创建ClassB实例,完全绕过ClassA中的任何代码.

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

Ala*_*orm 32

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

catalog/rewrite/product_view
Run Code Online (Sandbox Code Playgroud)

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

这就是文件的位置

app/etc/modules/*.xml
Run Code Online (Sandbox Code Playgroud)

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