Я уверен, что мы все столкнулись с ситуацией, когда у вас есть несколько расширений с блоком или моделью, которая переписывает один и тот же основной блок / модель. Проблема, с которой я столкнулся, заключается в следующем: как вы контролируете порядок, в котором Magento видит эти классы?
Например, допустим, у нас есть 2 расширения со следующими двумя классами:
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 {}
<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 разных расширения переписывают класс class_product_view?
Когда Magento извлекает класс для использования для определенного блока, он просматривает объединенное дерево config.xml
для одного узла в
catalog/rewrite/product_view
Проблема с несколькими переписываниями состоит в том, что только один узел может быть там из-за того, как Magento загружает XML-модуль модуля, объединяет его с деревом конфигурации и затем загружает другую модель. Это означает, что у вас может быть только одно решение псевдонима класса для одного имени класса.
Вот где файлы в
app/etc/modules/*.xml
вступают в игру. Эти файлы сообщают Magento, какие модули использовать. Они также поддерживают <depends>
. Этот тег позволяет вам сказать, что определенные модули зависят от другого модуля, а это значит, что их config.xml
будет загружен после другого config.xml
модуля. Таким образом, вы можете контролировать, в каком порядке загружены модули, и, следовательно, управлять объединенным переписывающим узлом «выигрывает», что, в свою очередь, позволит вам узнать, какой класс должен быть последним в вашей цепочке наследования.