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.