Magento - несколько классов, расширяющих один и тот же основной класс

Я уверен, что мы все столкнулись с ситуацией, когда у вас есть несколько расширений с блоком или моделью, которая перезаписывает один и тот же основной блок/модель. Проблема, с которой я столкнулся, заключается в следующем: как вы контролируете порядок, в котором 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?

Ответ 1

Когда Magento извлекает класс для использования для определенного блока, он просматривает объединенное дерево config.xml для одиночного node в

catalog/rewrite/product_view

Проблема с несколькими перезаписями заключается в том, что может существовать только один node из-за того, как Magento загружает модуль XML, объединяет его с деревом конфигурации и затем загружает другой. Это означает, что у вас может быть только одно решение псевдонима класса для одного имени класса.

Что, если файлы в

app/etc/modules/*.xml

вступают в игру. Эти файлы сообщают Magento, какие модули использовать. Они также поддерживают тег <depends>. Этот тег позволяет вам сказать некоторые модули depend на другом модуле, что означает, что их config.xml будет загружен после другого модуля config.xml. Таким образом, вы можете контролировать, в каком порядке загружены модули, и, следовательно, управлять объединенным переписыванием node "выигрывает", что, в свою очередь, позволит вам узнать, какой класс должен быть последним в вашей цепочке наследования.