Magento 2: Cara mengatur template khusus untuk blok inti


15

Saya mencoba untuk menimpa register.phtml di modul saya, tetapi tampaknya ada beberapa masalah konfigurasi yang membuat Magento tidak dapat menggunakan templat khusus saya untuk mengganti yang ada di modul inti. Saya telah memeriksa kode tetapi tidak dapat menemukan masalah. Adakah yang bisa membantu? Terima kasih sebelumnya. 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 di bawah 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"
      ]
    ]
  }
}

Jawaban:


18

Cukup referensi blok yang diperlukan dan set templat sebagai atribut referenceBlocksimpul:

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

Sintaks alternatif:

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

Juga jika Anda menggunakan Edisi Perusahaan, pastikan untuk memasukkannya Magento_CustomerCustomAttributeske sequenceAnda module.xmlkarena itu juga menimpa template ini dan dapat menimpa perubahan Anda.


1
Terima kasih Alex, tetapi itu tidak berhasil untuk saya. Saya bertanya-tanya apakah saya melewatkan beberapa detail penting misalnya file konfigurasi atau salah ketik.
Ricky.C

Baru saja mencoba meletakkan pegangan tata letak seperti itu ke modul Captcha (ia memiliki ketergantungan pada modul Pelanggan sehingga dimuat setelahnya, seperti modul khusus Anda) dan itu berhasil untuk saya. Apakah modul Anda dikenali oleh Magento? Dan tentu saja ingatlah untuk menghapus cache sebelum menyegarkan halaman. Coba ini dengan Captcha, hanya untuk memahami jika masalahnya ada pada modul atau deklarasi tata letak Anda.
Alex Paliarush

@ Ricky.C lihat jawaban yang diperbarui, terutama mengenai EE.
Alex Paliarush

Saya sudah mencoba sintaks alternatif, ini berfungsi pada Community Magento 2.0 terbaru saya. Terima kasih banyak.
Ricky.C

1

Gunakan kode ini di file tata letak Anda sebagai gantinya:

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

Ini menggantikan "tata letak" dengan "halaman" dan menambahkan tag tubuh

Sunting: Alternatif kedua adalah menghapus blok asli dan menambahkan yang baru dengan templat yang diinginkan

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

Terima kasih atas jawaban Anda, saya sudah mencobanya tetapi masih gagal
Ricky.C

Selamat mencoba dengan solusi ke-2. Omong-omong, apakah file template Anda di Namespace / ModuleName / view / frontend / templates / form / register.phtml?
csmarvz

Ini masih gagal untuk saya, saya pikir karena saya sedang bekerja dengan template adminhtml. Jadi saya mencoba metode yang lebih alternatif: Salin templat ke modul saya sendiri dan kemudian timpa Blok untuk memanggil setTemplatemetode, yang kemudian menemukan templat di modul yang sama. Solusi yang sangat kotor tetapi satu-satunya hal yang berhasil untuk saya!
Jacques

0

Anda kehilangan tag <body> setelah tag <page>, coba:

<?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
Terima kasih atas jawaban Anda, itu juga tidak berhasil untuk saya.
Ricky.C

Apakah Anda mengubah tag <layout> ke tag <page>?
Solusi Mage

Ya, saya baru saja menyalin kode Anda dan mengubah Namespace_ModuleName
Ricky.C

0

Mengganti metode setTemplate bekerja paling baik untuk saya.

/ **
 * Renderer kolom nama Item Pesanan Penjualan
 * /
nama kelas 
meluas \ Magento \ Penjualan \ Blok \ Adminhtml \ Item \ Kolom \ Nama
{

    setTemplate fungsi publik ($ template) {
        return parent :: setTemplate ('Magento_Sales ::'. $ template);
    }

    / **
     * Tambahkan jeda baris dan memotong nilai
     *
     * @param string $ value
     * @ mengembalikan array
     * /
    fungsi publik getFormattedOption ($ value)
    {
        $ sisa = '';
        $ value = $ this-> truncateString (
                 str_replace (';', '; 
', $ value), 1024, '', sisa $ ); return ['value' => nl2br ($ value), 'sisa' => nl2br ($ sisa)]; } }

0

Saya tahu ini sudah tua, tetapi jika itu membantu seseorang,

masalah github ini magento2 / issues / 3356 menyatakan bahwa referenceBlock dan metode argumen (disebutkan dalam pertanyaan) menderita bug yang bertentangan dengan metode yang usang dan bekerja:

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

dokumentasi (Tetapkan template blok) tidak mencerminkan keadaan sebenarnya.


1
ya, metode baru tidak selalu bekerja, jadi harus menggunakan yang sudah usang
TheKitMurkit
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.