重新编写块时是否需要在Magento2中重写模板?


8

这个问题是关于遵循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.stackexchange.com/q/112749/2380
拉斐尔在Digital Pianism上2016年

1
有趣。如果模板没有前缀Magento_Theme::,仍然可以从原始模块中加载模板,但是它们没有github.com/magento/magento2/blob/develop/app/code/Magento/Theme/…我真的想知道现在是否在目的
大卫Verholen

@RaphaelatDigitalPianism谢谢。您链接的线程与插件有关。我的情况是不同的。
mstojanov

是的,当我了解您的问题所在后,我最终找到了这个问题。绝对不对我听起来像个小虫
拉斐尔(Raphael)在

我在GitHub上创建了一个解决此问题的问题:github.com/magento/magento2/issues/4564等待开发团队的回答,如果最终成为错误,将进行PR。
拉斐尔(Raphael)在

Answers:


4

由于在pull request(https://github.com/magento/magento2/pull/1895)中围绕提议的解决方案进行了讨论,因此,在更改原始块类名称时,您只需要“固定”原始模板:

<referenceBlock name="catalog.topnav" class="***" template="Magento_Theme::html/topmenu.phtml"/>

这是一个很好的建议,尽管对于某些块而言,由于使用了许多布局(Catalog\Block\Product\View),因此充其量是不切实际的。我认为OP的建议仍然是该实例的最佳解决方案。
Erfan's

3

您只需要在此文件中添加一个代码

app/design/frontend/chop/misty/Magento_Theme/layout/default.xml

与:

<referenceBlock name="catalog.topnav" class="Company_name\Override\Block\Html\Topmenu" template="Magento_Theme::html/topmenu.phtml"/>

并在您的替代模块文件名中添加以下代码:

app/code/Aims/Override/etc/di.xml

代码:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
    <preference for="Magento\Theme\Block\Html\Topmenu" type="Company_name\Override\Block\Html\Topmenu" />
    <preference for="Magento\Paypal\Model\Config" type="Company_name\Override\Model\Paypal\Config" />
</config>

Topmenu.php在File中添加文件:app/code/Company_name/Override/Block/Html/Topmenu.php 您可以添加任何要覆盖的功能。

谢谢

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.