¿Nos vemos obligados a reescribir una plantilla en Magento2 cuando reescribimos un bloque?

8

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?

mstojanov
fuente
No tengo tiempo para responder ahora, pero le sugiero que eche un vistazo a esta pregunta y las respuestas que podría ayudarlo a comprender el concepto: magento.stackexchange.com/q/112749/2380
Raphael en Digital Pianism
1
interesante. La plantilla aún podría cargarse desde el módulo original si no hubiera sido prefijada Magento_Theme::, pero no github.com/magento/magento2/blob/develop/app/code/Magento/Theme/… Realmente me pregunto ahora si esto fue a propósito
David Verholen
@RaphaelatDigitalPianism Gracias. El hilo que vinculó es sobre complementos. Mi escenario es diferente.
mstojanov
Sí, eso es lo que terminé encontrando una vez que entendí cuál era tu problema. Definitivamente no está bien, me parece un error
Raphael en Digital Pianism
He creado un problema en GitHub que aborda este problema: github.com/magento/magento2/issues/4564 esperando una respuesta del equipo de desarrollo y hará un RP si termina siendo un error.
Raphael en Digital Pianism

Respuestas:

4

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:

<referenceBlock name="catalog.topnav" class="***" template="Magento_Theme::html/topmenu.phtml"/>
Vitalii K
fuente
Esta es una buena sugerencia, aunque para ciertos bloques no sería práctico en el mejor de los casos, ya que se usa en muchos diseños ( Catalog\Block\Product\View). Creo que la sugerencia del OP sigue siendo la mejor solución para esa instancia.
Erfan
3

solo necesita agregar un código en este archivo

app/design/frontend/chop/misty/Magento_Theme/layout/default.xml

con:

<referenceBlock name="catalog.topnav" class="Company_name\Override\Block\Html\Topmenu" template="Magento_Theme::html/topmenu.phtml"/>

y agregue el siguiente código en el nombre del archivo del módulo de anulación:

app/code/Aims/Override/etc/di.xml

codigo:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
    <preference for="Magento\Theme\Block\Html\Topmenu" type="Company_name\Override\Block\Html\Topmenu" />
    <preference for="Magento\Paypal\Model\Config" type="Company_name\Override\Model\Paypal\Config" />
</config>

Agregar Topmenu.phparchivo en archivo: app/code/Company_name/Override/Block/Html/Topmenu.php puede agregar cualquier función que desee anular.

Gracias

anant prajapati
fuente