我相信我们都遇到过这样的情况,即您有多个扩展程序具有重写相同核心块/模型的块或模型。 我遇到的问题是: 如何控制Magento看到这些类的顺序?
例如,假设我们有两个扩展程序,其中包含以下两个类:
类A
config.xml
<catalog>
<rewrite>
<product_view>My_ClassA_Block_Catalog_Product_View</product_view>
</rewrite>
</catalog>
My/ClassA/Block/Catalog/Product/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>
我的/类B/块/目录/产品/视图.php
class My_ClassB_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}
--
推荐的解决方案是更改它们中的一个,使其继承另一个并将它们链接在一起(class A extends B {}
,class B extends C {}
等):
我的/类A/块/目录/产品/视图.php
class My_ClassA_Block_Catalog_Product_View extends My_ClassB_Block_Catalog_Product_View {}
我的/ClassB/Block/Catalog/Product/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')
实例化?
config.xml
中会有一些像<depends>ClassB</depends>
的东西,对吗?如果是这样,如果 ClassB 不存在怎么办?ClassA 是否仍然会被加载?如果不会的话,是否有任何通用的方法来解决这种情况? - Mageician