php – Magento – 多个类扩展相同的核心类

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

例如,假设我们有2个扩展名,其中有以下2个类:

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 {}

推荐的解决方案是更改其中一个,以便扩展另一个并链接在一起(A类扩展B {},B类扩展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中的任何代码。

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

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

catalog/rewrite/product_view

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

那就是文件的位置

app/etc/modules/*.xml

参加进来。这些文件告诉Magento要使用的模块。他们也支持一个< depend>标签。该标签允许您说某些模块取决于另一个模块,这意味着它们的config.xml将在另一个模块的config.xml之后加载。这样,您可以控制模块加载的顺序,从而控制哪个合并的重写节点“胜出”,这反过来又可以让您知道哪个类需要在继承链中成为最终的。

翻译自:https://stackoverflow.com/questions/7501536/magento-multiple-classes-extending-same-core-class

转载注明原文:php – Magento – 多个类扩展相同的核心类