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