Мы вынуждены переписывать шаблон в 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: Неверный файл шаблона: '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 для файла шаблона. Но это выглядит как хак для меня.

Итак, мой вопрос: что такое рекомендация в таких ситуациях? Должны ли мы всегда копировать соответствующий шаблон при переписывании класса блока, или обходной путь подойдет? Есть ли лучший подход для этого?

mstojanov
источник
У меня нет времени, чтобы ответить прямо сейчас, но я предлагаю вам взглянуть на этот вопрос и ответы на него, которые могут помочь вам понять концепцию: magento.stackexchange.com/q/112749/2380
Рафаэль в Digital Pianism
1
интересно. Шаблон все еще может быть загружен из исходного модуля, если бы он не был префиксом Magento_Theme::, но они не github.com/magento/magento2/blob/develop/app/code/Magento/Theme/… Мне действительно интересно, если это было специально
Дэвид Верхолен
@RaphaelatDigitalPianism Спасибо. Тема, которую вы связали, о плагинах. Мой сценарий другой.
mstojanov
Да, это то, что я обнаружил, когда понял, в чем твоя проблема. Определенно не правильно звучит как ошибка для меня
Рафаэль в Digital Pianism
Я создал проблему на GitHub, решающую эту проблему: github.com/magento/magento2/issues/4564, ожидая ответа от команды разработчиков, и создаст пиар, если он окажется ошибкой.
Рафаэль на цифровом пианизме

Ответы:

4

Поскольку в предложении pull есть обсуждение предложенного решения ( https://github.com/magento/magento2/pull/1895 ), тем временем вам просто нужно «закрепить» исходный шаблон, когда вы изменяете исходное имя класса блока:

<referenceBlock name="catalog.topnav" class="***" template="Magento_Theme::html/topmenu.phtml"/>
Виталий К
источник
Это хорошее предложение, хотя для определенных блоков это было бы непрактично в лучшем случае, так как оно используется во многих макетах ( Catalog\Block\Product\View). Я думаю, что предложение ОП все еще является лучшим решением для этого случая.
Эрфан
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файл в файл: app/code/Company_name/Override/Block/Html/Topmenu.php вы можете добавить любую функцию, которую хотите переопределить.

Спасибо

анант праджапати
источник