Я уверен, что мы все столкнулись с ситуацией, когда у вас есть несколько расширений с блоком или моделью, которая перезаписывает один и тот же основной блок/модель. Проблема, с которой я столкнулся, заключается в следующем: как вы контролируете порядок, в котором Magento видит эти классы?
Например, предположим, что у нас есть 2 расширения со следующими двумя классами:
Класс A
config.xml
<catalog>
<rewrite>
<product_view>My_ClassA_Block_Catalog_Product_View</product_view>
</rewrite>
</catalog>
Мой/ClassA/Block/Каталог/продукта/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/Block/Каталог/продукта/view.php
class My_ClassB_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}
-
Рекомендуемое решение состоит в том, чтобы изменить один из них, чтобы они расширяли друг друга и соединяли их вместе (class A extends B {}
, class B extends C {}
и т.д.):
Мой/ClassA/Block/Каталог/продукта/view.php
class My_ClassA_Block_Catalog_Product_View extends My_ClassB_Block_Catalog_Product_View {}
Мой/ClassB/Block/Каталог/продукта/view.php
class My_ClassB_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}
-
Проблема, с которой я столкнулся, заключается в том, что Magento не всегда видит это. Я не знаю, является ли это алфавитным или несколько случайным, но иногда это работает, а иногда и нет. В некоторых случаях Magento уделяет приоритетное внимание ClassB, и все вызовы createBlock('catalog/product_view')
создают экземпляр ClassB, полностью обходя любой код в ClassA.
Итак, мой вопрос заключается в следующем: как я могу управлять тем, какой класс получает экземпляр createBlock('catalog/product_view')
, когда 2 разных расширения переписывают класс core_product_view?