Cómo anular una plantilla con diseño ALIAS.
Esta respuesta es un posible ejemplo, puede seguir esto para anular la plantilla de ALIAS.
He creado dos módulos de ejemplo, Vendor_Module
tiene un diseño con plantilla de alias, estamos anulando este alias por Vendortwo_Moduletwo
módulo.
Suponga que conoce los pasos para crear el módulo, no estoy publicando la creación completa del módulo.
Módulo 1
\ app \ code \ Vendor \ Module \ etc \ frontend \ routes.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
<router id="standard">
<route id="module" frontName="module">
<module name="Vendor_Module" />
</route>
</router>
</config>
\ app \ code \ Vendor \ Module \ view \ frontend \ layout \ module_test_test.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="2columns-left" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="content">
<block class="Vendor\Module\Block\Test\Test" name="test_test" template="test/test.phtml">
<block class="Vendor\Module\Block\Test\Test" as="testali" template="test/testali.phtml"/>
</block>
</referenceContainer>
</body>
</page>
Módulo 2
\ app \ code \ Vendortwo \ Moduletwo \ etc \ frontend \ routes.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
<router id="standard">
<route id="moduletwo" frontName="moduletwo">
<module name="Vendortwo_Moduletwo" />
</route>
</router>
</config>
\ app \ code \ Vendortwo \ Moduletwo \ view \ frontend \ layout \ default.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<referenceBlock name="test_test">
<block class="Vendortwo\Moduletwo\Block\Two\Two" as="testali" template="two/twoalias.phtml"/>
</referenceBlock>
</page>
Después de eliminar el caché, ejecuto http: // localhost / magento210 / module / test / test
La plantilla de alias es anulada por Vendortwo_Moduletwo
two/twoalias.phtml
Así es como hacerlo correctamente y sin hacks.
No busqué el caso de uso de OP, pero necesitaba poder modificar los renderizadores dentro del carrito. El problema es que, como en el caso de OP, el
Magento_Checkout
módulo no proporciona nombres a los renderizadores, lo que significa que no se puede hacer referencia a ellos y que sus plantillas se cambian utilizando métodos tradicionales o documentados. Sin embargo, después de investigar un poco, descubrí cómo hacerlo utilizando las herramientas que Magento2 nos proporciona directamente en el diseño XML.Tenga en cuenta que hay otros lugares donde funciona este mismo enfoque, como en el
Magento\Sales\Block\Items\AbstractItems
bloque. Los módulosMagento_Checkout
yMagento_Sales
son los dos que más utilizan los renderizadores de elementos, por lo que cubre muchas de las consultas que llevarían a alguien a cambiar la plantilla de un bloque sin un nombre. La razón por la que esto se publicó se debe a la inevitabilidad de que otros busquen cómo modificar las plantillas de renderizador en los módulos de pago o ventas.Primero voy a proporcionar la solución, y luego la explicaré en detalle para cualquiera que quiera saber por qué funciona.
Solución
Agregue lo siguiente al
checkout_cart_index.xml
archivo de diseño:Tenga en cuenta que el nombre y la ruta del módulo deben modificarse para reflejar su base de código.
Explicación
Esto funciona aprovechando los
overridden_templates
datos del bloque, que no está definido por defecto.En
Magento_Checkout
, elcheckout_cart_index.xml
archivo de diseño define el siguiente bloque:Luego define un par de esos renderizadores en el
checkout_cart_item_renderers.xml
archivo de diseño:Desafortunadamente, no pueden ser referenciados por sus alias
default
ysimple
, respectivamente.Sin embargo, al observar el
Magento\Checkout\Block\Cart\Grid
Bloque, que se llamacheckout.cart.form
y es el padre de los renderizadores, se puede observar que hay una llamada algetItemHtml
método en la plantilla asociadacart/form.phtml
. Ese método luego llamagetItemRenderer
. Ambos métodos se definen enGrid
la clase padre deAbstractBlock
. Aquí es dondeoverridden_templates
se usan los datos:Con este conocimiento, llenar el bloque con datos del diseño XML es sencillo utilizando la
arguments
sintaxis de Magento2 .fuente
Mi solución no es universal, es un "truco sucio" pero puede ser útil en ciertos casos. Mi muestra es para el renderizador frontend, no para adminhtml (supongo que debería ser lo mismo).
Configure el punto de interrupción
\Magento\Framework\Data\Structure::getChildId
con la condición " $ parentId == 'checkout.cart.item.renderers' " (este es un nombre para el bloque primario como puede ver en elcheckout_cart_item_renderers.xml
diseño). Todos los bloques secundarios tienen nombres propios (calculados):Use estos nombres en la actualización de diseño de su módulo:
fuente
Vea mi respuesta aquí: https://magento.stackexchange.com/a/239387/14403
Creo que esa es la solución que funcionará mejor para usted. La solución incluye anular cualquier bloque / plantilla que no tenga un nombre solo alias.
fuente