Magento 2: Como definir um modelo personalizado para o bloco principal


15

Estou tentando substituir o register.phtml no meu módulo, mas parece que há algum problema de configuração que torna o Magento incapaz de usar meu modelo personalizado para substituir o do módulo principal. Verifiquei o código, mas não consigo encontrar o problema. Alguém pode ajudar? Desde já, obrigado. 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 em 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>

compositer.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"
      ]
    ]
  }
}

Respostas:


18

Basta referenciar o bloco necessário e definir o modelo como atributo do referenceBlocknó:

<?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>

Sintaxe alternativa:

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

Além disso, se você estiver usando o Enterprise Edition, certifique-se de colocar Magento_CustomerCustomAttributesa sequencesua module.xmlporque ele também substitui este modelo e podem substituir as alterações.


11
Obrigado Alex, mas não funciona para mim. Gostaria de saber se eu perdi alguns detalhes importantes, por exemplo, arquivo de configuração ou erro de digitação.
— Ricky.C

Apenas tentei colocar esse identificador de layout no módulo Captcha (ele depende do módulo Customer, por isso é carregado depois dele, como o seu módulo personalizado) e funcionou para mim. Seu módulo é reconhecido pelo Magento? E, claro, lembre-se de limpar o cache antes de atualizar a página. Tente isso com o Captcha, apenas para entender se o problema está com sua declaração de módulo ou layout.
— Alex Paliarush

@ Ricky.C veja a resposta atualizada, especialmente em relação a EE.
— Alex Paliarush

Eu tentei a sintaxe alternativa, ela funciona no meu Community Magento 2.0 mais recente. Muito obrigado.
— perfil completo de Ricky

1

Use este código no seu arquivo de layout:

<?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>

Ele substitui "layout" por "página" e adiciona a tag body

EDIT: segunda alternativa é remover o bloco original e adicionar um novo com o modelo desejado

<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>

Obrigado pela sua resposta, eu tentei, mas ainda não conseguem
— Ricky.C

Experimente a 2ª solução. A propósito, seu arquivo de modelo está em Namespace / ModuleName / view / frontend / templates / form / register.phtml?
— Csmarvz

Isso ainda falhou para mim, acho que porque estou trabalhando com um modelo adminhtml. Então, tentei um método ainda mais alternativo: copie o modelo para o meu próprio módulo e substitua o bloco para invocar o setTemplatemétodo, que encontra o modelo no mesmo módulo. Solução muito suja, mas a única coisa que funcionou para mim!
— Jacques

0

Faltou a tag <body> após a tag <page>, tente:

<?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>

11
Obrigado pela sua resposta, também não funciona para mim.
— Ricky.C

Você alterou a tag <layout> para <page>?
— Mage Solution

Sim, apenas copiei seu código e alterei o Namespace_ModuleName
— Ricky.C

0

Substituir os métodos setTemplate funciona melhor para mim.

/ **
 * Representante da coluna do nome dos itens do Pedido de Vendas
 * /
nome da classe 
estende \ Magento \ Sales \ Block \ Adminhtml \ Items \ Column \ Name
{

    função pública setTemplate ($ template) {
        retornar parent :: setTemplate ('Magento_Sales ::'. $ template);
    }

    / **
     * Adicione quebras de linha e trunque valor
     *
     * @param string $ value
     * @return array
     * /
    função pública getFormattedOption ($ value)
    {
        $ restante = = '';
        $ value = $ this-> truncateString (
                 str_replace (';', '; 
', $ valor), 1024 '', $ restante ); return ['value' => nl2br ($ value), 'restante' => nl2br ($ restante)]; } }

0

Eu sei que isso é antigo, mas se ajudar alguém,

este problema do github magento2 / issues / 3356 afirma que o método referenceBlock e argumentos (mencionado na pergunta) sofre de um bug em oposição ao método obsoleto e de trabalho:

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

a documentação (Definir um modelo de bloco) não reflete o estado real das coisas.


11
sim, o novo método nem sempre funciona, então tem que usar obsoleto um
— TheKitMurkit
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.