I'm sure we've all run into a situation where you have multiple extensions with a block or model that rewrites the same core block/model. The problem I've run into is this: How do you control the order in which Magento sees these classes?
For example, let's say we have 2 extensions with the following 2 classes:
Class 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 {}
Class B
<catalog>
<rewrite>
<product_view>My_ClassB_Block_Catalog_Product_View</product_view>
</rewrite>
</catalog>
My/ClassB/Block/Catalog/Product/View.php
class My_ClassB_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}
--
The recommended solution is to change one of them so they extend the other and chain them together (class A extends B {}
, class B extends C {}
, etc):
My/ClassA/Block/Catalog/Product/View.php
class My_ClassA_Block_Catalog_Product_View extends My_ClassB_Block_Catalog_Product_View {}
My/ClassB/Block/Catalog/Product/View.php
class My_ClassB_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}
--
The problem I've run into is that Magento doesn't necessarily see it that way. I don't know if it's alphabetical or somewhat random, but sometimes this works and sometimes it doesn't. In some cases, Magento gives priority to ClassB and all calls to createBlock('catalog/product_view')
create an instance of ClassB, completely bypassing any code in ClassA.
So my question is this: How do I control which class gets instantiated by createBlock('catalog/product_view')
when 2 different extensions both rewrite the core catalog_product_view class?
config.xml
something like<depends>ClassB</depends>
, correct? If that's the case, what if ClassB doesn't exist? Does ClassA still get loaded? If not, then is there any way to make it generic enough to work in that case? – Cohesion