Этот вопрос касается следования лучшим практикам Magento2.
Мне пришлось переписать метод \ Magento \ Theme \ Block \ Html \ Topmenu :: _ addSubMenu (), чтобы добавить обертки вокруг элементов. Теперь, поскольку это защищенный метод, я понимаю, что мне нужно использовать функцию предпочтения:
<preference for="Magento\Theme\Block\Html\Topmenu" type="MyCompany\Theme\Block\Html\Topmenu" />
и добавить класс с моей переписывает:
<?php
namespace MyCompany\Theme\Block\Html;
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
{
// my stuff
}
}
Хотя класс по умолчанию был переписан, на следующей странице перезагрузки я получил следующую ошибку:
main.CRITICAL: Неверный файл шаблона: 'html / topmenu.phtml' в модуле: имя блока 'MyCompany_Theme': 'catalog.topnav' [] []
Magento пытается найти html / topmenu.phtml под моим расширением, а не под Magento_Theme. Я понимаю, что это правильное поведение, но я думал о практических аспектах этого. Означает ли это, что всякий раз, когда мы переписываем блок, нам также нужно переписывать его шаблон, даже если нам не обязательно касаться чего-либо, связанного с HTML?
Одним из способов решения этой проблемы было бы также переписать метод _toHtml (), например так:
protected function _toHtml()
{
$this->setModuleName($this->extractModuleName('Magento\Theme\Block\Html\Topmenu'));
return parent::_toHtml();
}
Теперь Magento снова ищет модуль Magento_Theme для файла шаблона. Но это выглядит как хак для меня.
Итак, мой вопрос: что такое рекомендация в таких ситуациях? Должны ли мы всегда копировать соответствующий шаблон при переписывании класса блока, или обходной путь подойдет? Есть ли лучший подход для этого?
Magento_Theme::
, но они не github.com/magento/magento2/blob/develop/app/code/Magento/Theme/… Мне действительно интересно, если это было специально