Intereting Posts
Laravel 4 – Конструктор родительских конструкторов дочерних конструкторов с инъекцией зависимости mod_rewrite php mysql Перенаправить из корневого каталога сервера в корневой каталог apache move_uploaded_file () с работой Zend doens't Сообщение jquery ajax на странице, отличной от ssl, а текущая страница – ssl ZendFramework – Как создать optgroup и там вариант с помощью помощников вида? Как перенести файл в php Laravel 5? Html File Save – Как преодолеть ограничение 2K для GET. (Примечание: POST не работает) Убедитесь, что массив пуст PHP & mySQL: Год 2038 Ошибка: что это такое? Как его решить? CakePHP – тайм-аут сеанса Как правильно настроить пакет symfony2 swiftmailer для работы с SMTP-сервером с помощью NTLM AUTH? Как зарегистрировать путь в автозагрузке с помощью одного экземпляра. нет рабочего отключения текстового поля, когда записи больше одного Создать новый красноречивый экземпляр с отношениями

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

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

Класс 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 разных расширения переписывают класс class_product_view?

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

 catalog/rewrite/product_view 

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

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

 app/etc/modules/*.xml 

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