Magento - несколько классов, расширяющих один и тот же базовый класс - PullRequest
20 голосов
/ 21 сентября 2011

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

1 Ответ

32 голосов
/ 21 сентября 2011

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

catalog/rewrite/product_view

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

Вот где файлы в

app/etc/modules/*.xml

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

...