Как устранить конфликт ThemeOptions_ExtraConfig_Block_Html_Topmenu и Df_Page_Block_Html_Topmenu

[10 ноября 2016 г.]    Российская сборка Magento 2.49.12
Magento 2: модули и услуги
#1 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8885
  • Регистрация: 20.02.2010

02.09.2014 20:38

Описание проблемы:
  • Предупреждение администратору:
    Системный класс «catalog/navigation» типа «block» перекрывают конфликтующие между собой классы:
        ThemeOptions_ExtraConfig_Block_Html_Topmenu[используется]
        Df_Page_Block_Html_Topmenu

  • Источник предупреждения: модуль «Рекомендации администратору»

Описание способа устранения проблемы:
Классы ThemeOptions_ExtraConfig_Block_Html_Topmenu и Df_Page_Block_Html_Topmenu перекрывают один и те же метод _getHtml родительского системного класса Mage_Page_Block_Html_Topmenu.
Обратите внимание, что класс Df_Page_Block_Html_Topmenu в своей реализации вызывает родительский метод (parent::_getHtml()), в то время как класс ThemeOptions_ExtraConfig_Block_Html_Topmenu — не вызывает.
Это значит, что что если сделать родителем класс Df_Page_Block_Html_Topmenu: то класс-сын ThemeOptions_ExtraConfig_Block_Html_Topmenu не вызовет родительскую реализацию метода parent::_getHtml().

Поэтому оба возможных варианта устранения конфликта имеют свои недостатки:
  • если сделать родителем Df_Page_Block_Html_Topmenu — то его реализация метода _getHtml не будет работать
  • если сделать родителем ThemeOptions_ExtraConfig_Block_Html_Topmenu, то придется вносить правки в исходный код Российской сборки.

Я рекомендую в данной конкретной ситуации вариант 1, потому что метод Df_Page_Block_Html_Topmenu::_getHtml() — это всего лишь оптимизация родительского метода Mage_Page_Block_Html_Topmenu::_getHtml(), она позволяет ускорить отображение страницы (формирование товарного меню) по сравнению с Magento Community Edition.
Можно безболезненно отказаться от Df_Page_Block_Html_Topmenu::_getHtml(), и в то же время вариант 1 позволяет обновлять Российскую сборку без правок.

Конкретная инструкция по устранению проблемы:
  • Изменить иерархию наследования:
    • Файл: app/code/local/ThemeOptions/ExtraConfig/Block/Html/Topmenu.php
    • Строка: 34
    • Что найти:
      ThemeOptions_ExtraConfig_Block_Html_Topmenu extends Mage_Core_Block_Template

    • На что заметить:
      ThemeOptions_ExtraConfig_Block_Html_Topmenu extends Df_Catalog_Block_Navigation

  • Теперь после удаления кэша предупреждение должно пропасть.
    Обратите внимание, что в данном случае не требуется удалять директиву rewrite, потому что наши изменения не привели к изменению активного (используемого для перекрытия) класса, это по-прежнему класс ThemeOptions_ExtraConfig_Block_Html_Topmenu.
    В такой ситуации Российская сборка Magento «знает», что конфликтующие классы теперь находятся в родственном отношении родитель-сын, и не считает такую ситуацию конфоликтом, потому что класс-сын (ThemeOptions_ExtraConfig_Block_Html_Topmenu) наследует программную реализацию класса-отца.


Поделиться темой: