Magento 2: come impostare un modello personalizzato per il core block


15

Sto cercando di sovrascrivere register.phtml nel mio modulo, ma sembra che ci siano alcuni problemi di configurazione che rendono Magento incapace di usare il mio modello personalizzato per sovrascrivere quello nel modulo principale. Ho controllato il codice ma non riesco a trovare il problema. Chiunque può aiutare? Grazie in anticipo. 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 in 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"
      ]
    ]
  }
}

Risposte:


18

Basta fare riferimento al blocco necessario e impostare il modello come attributo 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>

Sintassi alternativa:

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

Anche se si utilizza Enterprise Edition, assicuratevi di mettere Magento_CustomerCustomAttributesa sequencenella vostra module.xml, perché ignora anche questo modello e potrebbe ignorare le modifiche.


1
Grazie Alex, ma non funziona per me. Mi chiedo se ho perso alcuni dettagli importanti, ad es. File di configurazione o errori di battitura.
Ricky.C,

Ho appena provato a mettere tale handle di layout nel modulo Captcha (ha una dipendenza dal modulo Customer, quindi viene caricato dopo di esso, come il tuo modulo personalizzato) e ha funzionato per me. Il tuo modulo è stato riconosciuto da Magento? E ovviamente ricordati di cancellare la cache prima di aggiornare la pagina. Prova questo con Captcha, solo per capire se il problema riguarda il modulo o la dichiarazione di layout.
Alex Paliarush,

@ Ricky.C vedi la risposta aggiornata, in particolare per quanto riguarda EE.
Alex Paliarush,

Ho provato la sintassi alternativa, funziona sulla mia ultima Community Magento 2.0. Molte grazie.
Ricky.C,

1

Utilizzare invece questo codice nel file di 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>

Sostituisce "layout" con "pagina" e aggiunge il tag body

MODIFICA: la seconda alternativa è rimuovere il blocco originale e aggiungerne uno nuovo con il modello desiderato

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

Grazie per la risposta, l'ho provato ma non ci
riesco

Prova con la seconda soluzione. A proposito, il tuo file modello è in Namespace / ModuleName / view / frontend / templates / form / register.phtml?
csmarvz,

Questo non è ancora riuscito per me, penso perché sto lavorando con un modello adminhtml. Quindi ho provato un metodo ancora più alternativo: copia il modello nel mio modulo e quindi ignora il blocco per invocare il setTemplatemetodo, che trova quindi il modello nello stesso modulo. Soluzione molto sporca ma l'unica cosa che ha funzionato per me!
Jacques,

0

Manca il tag <body> dopo il tag <page>, prova:

<?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
Grazie per la tua risposta, non funziona anche per me.
Ricky.C,

Hai modificato il tag <layout> in <tag>?
Soluzione dei maghi il

Sì, ho appena copiato il codice e modificato Namespace_ModuleName
Ricky.C il

0

Sostituire i metodi setTemplate funziona meglio per me.

/ **
 * Rendering colonna nome articoli ordine cliente
 * /
nome della classe 
estende \ Magento \ Sales \ Block \ Adminhtml \ Items \ Column \ Name
{

    public function setTemplate ($ template) {
        return parent :: setTemplate ('Magento_Sales ::'. $ template);
    }

    / **
     * Aggiungi interruzioni di riga e tronca il valore
     *
     * @param string $ value
     * @return array
     * /
    funzione pubblica getFormattedOption ($ value)
    {
        $ remainder = '';
        $ value = $ this-> truncateString (
                 str_replace (';', '; 
', $ value), 1024, '', $ resto ); return ['value' => nl2br ($ value), 'remainder' => nl2br ($ remainder)]; } }

0

So che è vecchio, ma se aiuta qualcuno,

questo problema github magento2 / issues / 3356 afferma che il metodo referenceBlock e argomenti (menzionato nella domanda) soffre di un bug rispetto al metodo deprecato e funzionante:

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

la documentazione (Imposta un modello di blocco) non riflette lo stato reale delle cose.


1
sì, il nuovo metodo non funziona sempre, quindi devo usare uno obsoleto
TheKitMurkit
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.