Magento 2: Comment définir un modèle personnalisé pour le bloc de base


15

J'essaie de remplacer le register.phtml dans mon module, mais il semble qu'il y ait un problème de configuration qui empêche Magento d'utiliser mon modèle personnalisé pour remplacer celui du module principal. J'ai vérifié le code mais je ne trouve pas le problème. Tout le monde peut aider? Merci d'avance. 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 sous 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"
      ]
    ]
  }
}

Réponses:


18

Il suffit de référencer le bloc nécessaire et de définir le modèle comme attribut du referenceBlocknœud:

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

Syntaxe alternative:

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

Aussi , si vous utilisez Enterprise Edition, assurez - vous de mettre Magento_CustomerCustomAttributesà sequencevotre module.xmlcar il remplace également ce modèle et peut passer outre vos modifications.


1
Merci Alex, mais ça ne marche pas pour moi. Je me demande si j'ai raté certains détails importants, par exemple le fichier de configuration ou la faute de frappe.
Ricky.C

Je viens d'essayer de mettre une telle poignée de mise en page dans le module Captcha (il dépend du module client, il est donc chargé après, comme votre module personnalisé) et cela a fonctionné pour moi. Votre module est-il reconnu par Magento? Et bien sûr, n'oubliez pas de vider le cache avant de rafraîchir la page. Essayez ceci avec Captcha, juste pour comprendre si le problème vient de votre déclaration de module ou de disposition.
Alex Paliarush

@ Ricky.C voir la réponse mise à jour, en particulier en ce qui concerne l'EE.
Alex Paliarush

J'ai essayé la syntaxe alternative, elle fonctionne sur ma dernière Community Magento 2.0. Merci beaucoup.
Ricky.C

1

Utilisez plutôt ce code dans votre fichier de mise en page:

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

Il remplace "layout" par "page" et ajoute la balise body

EDIT: la deuxième alternative consiste à supprimer le bloc d'origine et à en ajouter un nouveau avec le modèle souhaité

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

Merci pour votre réponse, je l'ai essayé mais échoue toujours
Ricky.C

Essayez la 2e solution. Par ailleurs, votre fichier de modèle se trouve-t-il dans Namespace / ModuleName / view / frontend / templates / form / register.phtml?
csmarvz

Cela a toujours échoué pour moi, je pense parce que je travaille avec un modèle adminhtml. J'ai donc essayé une méthode encore plus alternative: copier le modèle dans mon propre module, puis remplacer le bloc pour appeler la setTemplateméthode, qui trouve ensuite le modèle dans le même module. Solution très sale mais la seule chose qui a fonctionné pour moi!
Jacques

0

Vous manquez la balise <body> après la balise <page>, veuillez essayer:

<?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
Merci pour votre réponse, ça ne marche pas non plus pour moi.
Ricky.C

Avez-vous changé la balise <layout> en balise <page>?
Mage Solution

Oui, je viens de copier votre code et de changer le Namespace_ModuleName
Ricky.C

0

Remplacer les méthodes setTemplate fonctionne le mieux pour moi.

/ **
 * Rendu de la colonne du nom des éléments de la commande client
 * /
nom du cours 
étend \ Magento \ Sales \ Block \ Adminhtml \ Items \ Column \ Name
{

    fonction publique setTemplate ($ template) {
        return parent :: setTemplate ('Magento_Sales ::'. $ template);
    }

    / **
     * Ajouter des sauts de ligne et tronquer la valeur
     *
     * @param string $ value
     * @return array
     * /
    fonction publique getFormattedOption ($ value)
    {
        $ reste = '';
        $ value = $ this-> truncateString (
                 str_replace (';', '; 
', $ value), 1024, '', $ restant ); return ['value' => nl2br ($ value), 'reste' => nl2br ($ reste)]; } }

0

Je sais que c'est vieux, mais si ça aide quelqu'un,

ce problème de github magento2 / issues / 3356 indique que la méthode referenceBlock et arguments (mentionnée dans la question) souffre d'un bogue par opposition à la méthode obsolète et de travail:

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

la documentation (Définir un modèle de bloc) ne reflète pas l'état réel des choses.


1
oui, la nouvelle méthode ne fonctionne pas toujours, alors
je
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.