20

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

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

A级

配置文件

<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 优先考虑ClassBcreateBlock('catalog/product_view')和创建ClassB实例的所有调用,完全绕过ClassA中的任何代码。

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

4

1 回答 1

33

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

catalog/rewrite/product_view

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

那是文件所在的位置

app/etc/modules/*.xml

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

于 2011-09-21T16:01:24.467 回答