Esta pergunta é sobre seguir as melhores práticas do Magento2.
Eu tive que reescrever o método \ Magento \ Theme \ Block \ Html \ Topmenu :: _ addSubMenu () para adicionar alguns wrappers ao redor dos elementos. Agora, por ser um método protegido, meu entendimento é que eu tenho que usar o recurso de preferência:
<preference for="Magento\Theme\Block\Html\Topmenu" type="MyCompany\Theme\Block\Html\Topmenu" />
e adicione uma classe com minhas reescritas:
<?php
namespace MyCompany\Theme\Block\Html;
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
{
// my stuff
}
}
Embora a classe padrão tenha sido reescrita, na próxima página recarreguei o seguinte erro:
main.CRITICAL: arquivo de modelo inválido: 'html / topmenu.phtml' no módulo: 'MyCompany_Theme' nome do bloco: 'catalog.topnav' [] []
O Magento está tentando encontrar html / topmenu.phtml na minha extensão e não no Magento_Theme. Entendo que esse é um comportamento correto, mas estava pensando em aspectos práticos disso. Isso significa que sempre que reescrevemos um bloco, precisamos reescrever seu modelo também, mesmo que não precisemos necessariamente tocar em algo relacionado a HTML?
Uma maneira de contornar isso seria reescrever o método _toHtml () também, assim:
protected function _toHtml()
{
$this->setModuleName($this->extractModuleName('Magento\Theme\Block\Html\Topmenu'));
return parent::_toHtml();
}
Agora, o Magento está procurando no módulo Magento_Theme o arquivo de modelo novamente. Mas, isso parece um hack para mim.
Então, minha pergunta é: o que é uma recomendação nessas situações? Devemos sempre copiar o modelo relevante ao reescrever a classe de bloco ou a solução alternativa está correta? Existe uma abordagem melhor para isso?
Magento_Theme::
, mas eles não github.com/magento/magento2/blob/develop/app/code/Magento/Theme/… Gostaria realmente de saber agora se isso foi de propósito