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

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.

Alex Paliarush
fonte
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>
csmarvz
fonte
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>
Solução Mage
fonte
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)]; } }
Dallas Clarke
fonte
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.

medmek
fonte
11
sim, o novo método nem sempre funciona, então tem que usar obsoleto um
TheKitMurkit