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


Я уверен, что мы все сталкивались с ситуацией, когда у вас есть несколько расширений с блоком или моделью, которые перезаписывают один и тот же основной блок/модель. Проблема, с которой я столкнулся, заключается в следующем: Как вы контролируете порядок, в котором Magento видит эти классы?

Например, предположим, что у нас есть 2 расширения со следующими 2 классами:

Класс А

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 {}

Класс В

<catalog>
    <rewrite>
        <product_view>My_ClassB_Block_Catalog_Product_View</product_view>
    </rewrite>
</catalog>

My/ClassB/Block/Catalog/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/Block/Catalog/Product/View.php

class My_ClassA_Block_Catalog_Product_View extends My_ClassB_Block_Catalog_Product_View {}

My/ClassB/Block/Catalog/Product/View.php

class My_ClassB_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}

--

Проблема, с которой я столкнулся, заключается в том, что Magento не обязательно видит это таким образом. Я не знаю, является ли это алфавитным или несколько случайным, но иногда это работает, а иногда нет. В некоторых случаях Magento отдает приоритет ClassB, и все вызовы createBlock('catalog/product_view') создают экземпляр ClassB, полностью обходя любой код в классе.

Итак, мой вопрос таков: как мне контролировать, какой класс создается createBlock('catalog/product_view'), когда 2 разных расширения переписывают основной класс catalog_product_view?

Author: BrianVPS, 2011-09-21

1 answers

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

catalog/rewrite/product_view

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

Вот где находятся файлы в

app/etc/modules/*.xml

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

 32
Author: Alan Storm, 2015-11-24 22:09:46