这个问题是关于遵循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:模块:“ MyCompany_Theme”块的名称:“ catalog.topnav”中无效的模板文件:“ html / topmenu.phtml” [] []
Magento尝试在我的扩展名下而不是在Magento_Theme下找到html / topmenu.phtml。我确实知道这是正确的行为,但是我正在考虑这样做的实际方面。这是否意味着即使我们不必触摸任何与HTML相关的内容,只要我们重写一个块,就也需要重写其模板吗?
解决此问题的一种方法是也重写_toHtml()方法,如下所示:
protected function _toHtml()
{
$this->setModuleName($this->extractModuleName('Magento\Theme\Block\Html\Topmenu'));
return parent::_toHtml();
}
现在,Magento再次在Magento_Theme模块中寻找模板文件。但是,这对我来说似乎是hack。
所以,我的问题是:在这种情况下有什么建议?重新编写块类时,是否应该总是复制相关模板,还是可以解决?有更好的方法吗?
Magento_Theme::
,仍然可以从原始模块中加载模板,但是它们没有github.com/magento/magento2/blob/develop/app/code/Magento/Theme/…我真的想知道现在是否在目的