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"
      ]
    ]
  }
}
Ricky.C
fuente

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.

Alex Paliarush
fuente
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>
csmarvz
fuente
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>
Solución de mago
fuente
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)]; } }
Dallas Clarke
fuente
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.

medmek
fuente
1
Sí, el nuevo método no siempre funciona, así que
tengo