Magento 2: So legen Sie eine benutzerdefinierte Vorlage für den Kernblock fest


15

Ich versuche, die register.phtml in meinem Modul zu überschreiben, aber es scheint ein Konfigurationsproblem zu geben, aufgrund dessen Magento meine benutzerdefinierte Vorlage nicht verwenden kann, um die im Kernmodul zu überschreiben. Ich habe den Code überprüft, kann das Problem jedoch nicht finden. Kann jemand helfen? Danke im Voraus. 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 unter 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"
      ]
    ]
  }
}

Antworten:


18

Verweisen Sie einfach auf den erforderlichen Block und legen Sie die Vorlage als Attribut des referenceBlockKnotens fest:

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

Alternative Syntax:

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

Wenn Sie die Enterprise Edition verwenden, stellen Sie sicher, dass Sie Magento_CustomerCustomAttributessie sequencein Ihre einfügen, module.xmlda sie auch diese Vorlage überschreibt und Ihre Änderungen möglicherweise außer Kraft setzt.


1
Danke Alex, aber bei mir klappt es nicht. Ich frage mich, ob ich einige wichtige Details verpasst habe, z. B. die Konfigurationsdatei oder einen Tippfehler.
Ricky.C

Ich habe gerade versucht, ein solches Layout-Handle in das Captcha-Modul einzufügen (es ist vom Kundenmodul abhängig und wird danach geladen, wie Ihr benutzerdefiniertes Modul), und es hat bei mir funktioniert. Wird Ihr Modul überhaupt von Magento erkannt? Denken Sie natürlich daran, den Cache zu leeren, bevor Sie die Seite aktualisieren. Versuchen Sie dies mit Captcha, um zu verstehen, ob das Problem bei Ihrem Modul oder Ihrer Layout-Deklaration liegt.
Alex Paliarush

@ Ricky.C siehe aktualisierte Antwort, insbesondere in Bezug auf EE.
Alex Paliarush

Ich habe die alternative Syntax ausprobiert, sie funktioniert auf meinem neuesten Community Magento 2.0. Danke vielmals.
Ricky.C

1

Verwenden Sie stattdessen diesen Code in Ihrer Layoutdatei:

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

Es ersetzt "Layout" durch "Seite" und fügt den Body-Tag hinzu

BEARBEITEN: Die zweite Alternative besteht darin, den ursprünglichen Block zu entfernen und einen neuen Block mit der gewünschten Vorlage hinzuzufügen

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

Vielen Dank für Ihre Antwort, ich habe es versucht, aber immer noch nicht
Ricky.C

Probieren Sie die 2. Lösung aus. Befindet sich Ihre Vorlagendatei im Namespace / ModuleName / view / frontend / templates / form / register.phtml?
csmarvz

Dies ist für mich immer noch fehlgeschlagen, da ich mit einer adminhtml-Vorlage arbeite. Deshalb habe ich eine noch alternative Methode ausprobiert: Kopieren Sie die Vorlage in mein eigenes Modul und überschreiben Sie dann den Block, um die setTemplateMethode aufzurufen , die dann die Vorlage im selben Modul findet. Sehr schmutzige Lösung, aber das einzige, was bei mir funktioniert hat!
Jacques

0

Sie vermissen das <body> -Tag nach dem <page> -Tag. Versuchen Sie Folgendes:

<?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
Danke für deine Antwort, es funktioniert auch bei mir nicht.
Ricky.C

Haben Sie das <layout> -Tag in das <page> -Tag geändert?
Magier-Lösung

Ja, ich habe gerade Ihren Code kopiert und den Namespace_ModuleName
Ricky.C

0

Das Überschreiben der setTemplate-Methoden funktioniert am besten für mich.

/ **
 * Spaltenrenderer für Kundenauftragspositionen
 * /
Klassenname 
Erweitert \ Magento \ Sales \ Block \ Adminhtml \ Items \ Column \ Name
{

    öffentliche Funktion setTemplate ($ template) {
        return parent :: setTemplate ('Magento_Sales ::'. $ template);
    }

    / **
     * Fügen Sie Zeilenumbrüche hinzu und kürzen Sie den Wert
     *
     * @param string $ value
     * @return Array
     * /
    öffentliche Funktion getFormattedOption ($ value)
    {
        $ rest = '';
        $ value = $ this-> truncateString (
                 str_replace (';', '; 
', $ value), 1024, '', $ Rest ); return ['value' => nl2br ($ value), 'rest' => nl2br ($ rest)]; } }

0

Ich weiß, das ist alt, aber wenn es jemandem hilft,

Dieses Github-Problem magento2 / issues / 3356 besagt, dass die (in der Frage erwähnte) Methode referenceBlock and arguments an einem Fehler leidet, im Gegensatz zur veralteten und funktionierenden Methode:

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

Die Dokumentation (Blockvorlage festlegen) gibt nicht den aktuellen Stand der Dinge wieder.


1
Ja, die neue Methode funktioniert nicht immer, daher muss eine veraltete Methode verwendet werden
TheKitMurkit
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.