Magento 2: Cómo configurar una plantilla personalizada para el bloque central


15

Estoy tratando de anular el archivo register.phtml en mi módulo, pero parece que hay algún problema de configuración que hace que Magento no pueda usar mi plantilla personalizada para anular la del módulo central. Revisé el código pero no puedo encontrar el problema. Alguien puede ayudar? Gracias por adelantado. module.xml:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Namespace_ModuleName" setup_version="0.0.2">
        <sequence>
            <module name="Magento_Customer"/>
        </sequence>
    </module>
</config>

customer_account_create.xml en Namespace \ ModuleName \ view \ frontend \ layout:

<?xml version="1.0"?>
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
    <referenceBlock name="customer_form_register">
        <arguments>

            <argument name="template" xsi:type="string">Namespace_ModuleName::form/register.phtml</argument>

        </arguments>
    </referenceBlock>
</layout>

composer.json:

{
  "name": "namespace/module-modulename",
  "description": "modulename",
  "type": "magento2-module",
  "version": "0.0.2",
  "license": [
    "OSL-3.0",
    "AFL-3.0"
  ],
  "require": {
    "php": "~5.5.0|~5.6.0",
    "magento/framework": "~0.42",
    "magento/magento-composer-installer": "*",
    "magento/module-customer": "*"
  },
  "extra": {
    "map": [
      [
        "*",
        "Namespace/ModuleName"
      ]
    ]
  }
}

Respuestas:


18

Simplemente haga referencia al bloque necesario y configure la plantilla como atributo del referenceBlocknodo:

<?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">
    <body>
        <referenceBlock name="customer_form_register" template="VendorName_ModuleName::form/register.phtml"/>
    </body>
</page>

Sintaxis alternativa:

<referenceBlock name="customer_form_register">
    <action method="setTemplate">
        <argument name="template" xsi:type="string">VendorName_ModuleName::form/register.phtml</argument>
    </action>
</referenceBlock>

Además, si usted está utilizando Enterprise Edition, asegúrese de poner Magento_CustomerCustomAttributesa sequenceen su module.xmldebido a que también anula esta plantilla y pueden anular los cambios.


1
Gracias Alex, pero no me funciona. Me pregunto si me perdí algunos detalles importantes, por ejemplo, el archivo de configuración o me equivoqué.
Ricky.C

Solo traté de poner ese controlador de diseño en el módulo Captcha (tiene dependencia del módulo Cliente, por lo que se carga después, como su módulo personalizado) y funcionó para mí. ¿Magento reconoce su módulo? Y, por supuesto, recuerde borrar el caché antes de actualizar la página. Pruebe esto con Captcha, solo para entender si el problema está en su módulo o en la declaración de diseño.
Alex Paliarush

@ Ricky.C vea la respuesta actualizada, especialmente con respecto a EE.
Alex Paliarush

He probado la sintaxis alternativa, funciona en mi último Community Magento 2.0. Muchas gracias.
Ricky.C

1

Utilice este código en su archivo de diseño en su lugar:

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="customer_form_register">
            <arguments>
                <argument name="template" xsi:type="string">Namespace_ModuleName::form/register.phtml</argument>
            </arguments>
        </referenceBlock>
    </body>
</page>

Reemplaza "diseño" con "página" y agrega la etiqueta del cuerpo

EDITAR: la segunda alternativa es eliminar el bloque original y agregar uno nuevo con la plantilla deseada

<referenceBlock name="customer_form_register" remove="true"/>
<referenceContainer name="content">
    <block class="Magento\Customer\Block\Form\Register" name="my_customer_form_register" template="Namespace_ModuleName::form/register.phtml">
        <container name="form.additional.info" as="form_additional_info"/>
        <container name="customer.form.register.fields.before" as="form_fields_before" label="Form Fields Before" htmlTag="div" htmlClass="customer-form-before"/>
    </block>
</referenceContainer>

Gracias por su respuesta, lo he intentado pero aún falla
Ricky.C

Prueba con la segunda solución. Por cierto, ¿está su archivo de plantilla en Namespace / ModuleName / view / frontend / templates / form / register.phtml?
csmarvz

Esto todavía falló para mí, creo que porque estoy trabajando con una plantilla adminhtml. Así que probé un método aún más alternativo: copie la plantilla en mi propio módulo y luego anule el Bloque para invocar el setTemplatemétodo, que luego encuentra la plantilla en el mismo módulo. ¡Una solución muy sucia pero lo único que funcionó para mí!
Jacques

0

Falta la etiqueta <body> después de la etiqueta <page>, intente:

<?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">
<body>
    <referenceBlock name="customer_form_register">
        <arguments>

            <argument name="template" xsi:type="string">Namespace_ModuleName::form/register.phtml</argument>

        </arguments>
    </referenceBlock>
</body>
</page>

1
Gracias por su respuesta, tampoco me funciona.
Ricky.C

¿Cambiaste la etiqueta <layout> por la etiqueta <page>?
Solución Mage

Sí, acabo de copiar su código y cambié Namespace_ModuleName
Ricky.C

0

Anular los métodos setTemplate funciona mejor para mí.

/ **
 * Procesador de columna de nombre de artículos de pedido de ventas
 * /
nombre de la clase 
extiende \ Magento \ Sales \ Block \ Adminhtml \ Items \ Column \ Name
{

    función pública setTemplate ($ template) {
        return parent :: setTemplate ('Magento_Sales ::'. $ template);
    }

    / **
     * Agregar saltos de línea y truncar valor
     * *
     * @param string $ value
     * @return array
     * /
    función pública getFormattedOption ($ value)
    {
        $ resto = '';
        $ value = $ this-> truncateString (
                 str_replace (';', '; 
', $ valor), 1024 '', $ resto ); return ['value' => nl2br ($ valor), 'resto' => nl2br ($ resto)]; } }

0

Sé que esto es viejo, pero si ayuda a alguien,

Este problema de github magento2 / issues / 3356 establece que el método de referencia y argumentos (mencionado en la pregunta) sufre un error en lugar del método obsoleto y de trabajo:

<referenceBlock name="customer_form_login">
    <action method="setTemplate">
        <argument name="template" xsi:type="string">
            VendorName_ModuleName::form/login.phtml
        </argument>
    </action>
</referenceBlock>

La documentación (Establecer una plantilla de bloque) no refleja el estado real de las cosas.


1
Sí, el nuevo método no siempre funciona, así que
tengo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.