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ósitoRespostas:
Como existem discussões em torno da solução proposta na solicitação pull ( https://github.com/magento/magento2/pull/1895 ), enquanto isso, você só precisa "fixar" o modelo original ao alterar o nome da classe de bloco original:
fonte
Catalog\Block\Product\View
). Acho que a sugestão do OP ainda é a melhor solução para esse exemplo.você só precisa adicionar um código nesse arquivo
com:
e adicione o código abaixo no nome do arquivo do módulo de substituição:
código:
Adicionar
Topmenu.php
arquivo no arquivo:app/code/Company_name/Override/Block/Html/Topmenu.php
você pode adicionar qualquer função que queira substituir.obrigado
fonte