Questa domanda riguarda le migliori pratiche di Magento2.
Ho dovuto riscrivere il metodo \ Magento \ Theme \ Block \ Html \ Topmenu :: _ addSubMenu () per aggiungere alcuni wrapper attorno agli elementi. Ora, poiché è un metodo protetto, la mia comprensione è che devo usare la funzione di preferenza:
<preference for="Magento\Theme\Block\Html\Topmenu" type="MyCompany\Theme\Block\Html\Topmenu" />
e aggiungo un corso con le mie riscritture:
<?php
namespace MyCompany\Theme\Block\Html;
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
{
// my stuff
}
}
Sebbene la classe predefinita sia stata riscritta, nella pagina successiva ricaricata ho ricevuto il seguente errore:
main.CRITICAL: file modello non valido: 'html / topmenu.phtml' nel modulo: nome del blocco 'MyCompany_Theme': 'catalog.topnav' [] []
Magento sta cercando di trovare html / topmenu.phtml nella mia estensione e non in Magento_Theme. Capisco che si tratta di un comportamento corretto, ma stavo pensando ad aspetti pratici di questo. Questo significa che ogni volta che riscriviamo un blocco, dobbiamo riscrivere anche il suo modello, anche se non abbiamo necessariamente bisogno di toccare qualcosa correlato all'HTML?
Un modo per aggirare questo sarebbe riscrivere anche il metodo _toHtml (), in questo modo:
protected function _toHtml()
{
$this->setModuleName($this->extractModuleName('Magento\Theme\Block\Html\Topmenu'));
return parent::_toHtml();
}
Ora Magento sta esaminando nuovamente il modulo Magento_Theme per il file modello. Ma a me sembra un trucco.
Quindi, la mia domanda è: qual è una raccomandazione in queste situazioni? Dovremmo sempre copiare il modello pertinente quando riscriviamo la classe di blocco, o la soluzione alternativa va bene? Esiste un approccio migliore per questo?
Magento_Theme::
, ma non hanno github.com/magento/magento2/blob/develop/app/code/Magento/Theme/… Adesso mi chiedo davvero se questo fosse apposta