Esta pregunta se trata de seguir las mejores prácticas de Magento2.
Tuve que reescribir el método \ Magento \ Theme \ Block \ Html \ Topmenu :: _ addSubMenu () para agregar algunos contenedores alrededor de los elementos. Ahora, debido a que es un método protegido, entiendo que tengo que usar la función de preferencia:
<preference for="Magento\Theme\Block\Html\Topmenu" type="MyCompany\Theme\Block\Html\Topmenu" />
y agregue una clase con mis reescrituras:
<?php
namespace MyCompany\Theme\Block\Html;
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
{
// my stuff
}
}
Aunque la clase predeterminada se reescribió, en la siguiente página de recarga recibí el siguiente error:
main.CRITICAL: Archivo de plantilla no válido: 'html / topmenu.phtml' en el módulo: 'MyCompany_Theme' nombre del bloque: 'catalog.topnav' [] []
Magento está tratando de encontrar html / topmenu.phtml en mi extensión y no en Magento_Theme. Entiendo que este es un comportamiento correcto, pero estaba pensando en aspectos prácticos de esto. ¿Significa esto que cada vez que reescribimos un bloque, necesitamos reescribir su plantilla también, incluso si no necesariamente necesitamos tocar algo relacionado con HTML?
Una forma de evitar esto sería reescribir el método _toHtml () también, así:
protected function _toHtml()
{
$this->setModuleName($this->extractModuleName('Magento\Theme\Block\Html\Topmenu'));
return parent::_toHtml();
}
Ahora, Magento está buscando en el módulo Magento_Theme el archivo de plantilla nuevamente. Pero, esto me parece un truco.
Entonces, mi pregunta es: ¿qué es una recomendación en estas situaciones? ¿Deberíamos siempre copiar la plantilla relevante al reescribir la clase de bloque, o la solución está bien? ¿Hay un mejor enfoque para esto?
Magento_Theme::
, pero no github.com/magento/magento2/blob/develop/app/code/Magento/Theme/… Realmente me pregunto ahora si esto fue a propósito