我确信我们都遇到了这样一种情况:你有一个块或模型的多个扩展,它们重写了相同的核心块/模型。我遇到的问题是:你如何控制Magento看到这些类的顺序?
例如,假设我们有2个扩展,包含以下2个类:
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 {}
<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
所以我的问题是:当两个不同的扩展都重写核心catalog_product_view类时,如何控制createBlock('catalog/product_view')
实例化哪个类?
答案 0 :(得分:32)
当Magento获取要用于特定块的类时,它会在合并的config.xml
树内查找单个节点
catalog/rewrite/product_view
多次重写的问题是,由于Magento加载模块的XML,将其与配置树合并,然后加载另一个,只有一个节点可以存在>模特。这意味着您只能将一个别名别名解析为一个类名。
这就是
中的文件app/etc/modules/*.xml
发挥作用。这些文件告诉Magento使用哪些模块。他们还支持<depends>
标记。此标记允许您在另一个模块上说某些模块依赖,这意味着他们的config.xml
将在另一个模块config.xml
之后加载。通过这种方式,您可以控制加载模块的顺序,从而控制哪个合并的重写节点“获胜”,从而可以让您知道哪个类需要成为继承链中的最终类。