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ósitoRespuestas:
Dado que hay discusiones sobre la solución propuesta en la solicitud de extracción ( https://github.com/magento/magento2/pull/1895 ), mientras tanto solo necesita "anclar" la plantilla original cuando cambie el nombre de la clase de bloque original:
fuente
Catalog\Block\Product\View
). Creo que la sugerencia del OP sigue siendo la mejor solución para esa instancia.solo necesita agregar un código en este archivo
con:
y agregue el siguiente código en el nombre del archivo del módulo de anulación:
codigo:
Agregar
Topmenu.php
archivo en archivo:app/code/Company_name/Override/Block/Html/Topmenu.php
puede agregar cualquier función que desee anular.Gracias
fuente