Magento 2: Як встановити спеціальний шаблон для основного блоку


15

Я намагаюся замінити register.phtml у своєму модулі, але, здається, є певна проблема конфігурації, яка робить Magento не в змозі використовувати мій власний шаблон, щоб замінити той, що знаходиться в основному модулі. Я перевірив код, але не можу знайти проблему. Хто-небудь може допомогти? Заздалегідь спасибі. 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 у просторі імен \ 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"
      ]
    ]
  }
}

Відповіді:


18

Просто посилайтеся на необхідний блок і встановіть шаблон як атрибут referenceBlockвузла:

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

Альтернативний синтаксис:

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

Крім того, якщо ви використовуєте Enterprise Edition, переконайтеся в тому , Magento_CustomerCustomAttributesщоб sequenceв вашому module.xmlбо він також перекриває цей шаблон і може скасувати зміни.


1
Дякую Алекс, але це не працює для мене. Мені цікаво, чи я пропустив деякі важливі деталі, наприклад, конфігураційний файл або отримав помилку.
— Ricky.C

Щойно спробував поставити таку ручку макета до модуля Captcha (він залежить від модуля Клієнта, тому він завантажується після нього, як і ваш спеціальний модуль), і він працював на мене. Чи визнаний ваш модуль Magento взагалі? І звичайно пам'ятайте, щоб очистити кеш, перш ніж оновити сторінку. Спробуйте це з Captcha, просто щоб зрозуміти, чи проблема полягає в оголошенні модуля чи макета.
— Олексій Паліяруш

@ Ricky.C див. Оновлену відповідь, особливо стосовно EE.
— Олексій Паляруш

Я спробував альтернативний синтаксис, він працює на моєму останньому спільноті Magento 2.0. Дуже дякую.
— Ricky.C

1

Використовуйте цей код у файлі макета замість цього:

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

Він замінює "макет" на "сторінку" і додає тег тіла

EDIT: Друга альтернатива - видалити початковий блок та додати новий із потрібним шаблоном

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

Дякую за вашу відповідь, я спробував це, але все-таки провалився
— Ricky.C

Спробуйте з 2-м рішенням. До речі, чи є ваш файл шаблону в просторі імен / ModuleName / view / frontend / templates / form / register.phtml?
— csmarvz

Це все ще не вдалося для мене, я думаю, тому що я працюю з шаблоном адміністратора. Тому я спробував ще більш альтернативний метод: скопіюйте шаблон у свій власний модуль, а потім замініть Блок, щоб викликати setTemplateметод, який потім знаходить шаблон у тому ж модулі. Дуже брудне рішення, але єдине, що працювало для мене!
— Жак

0

Ви пропустите тег <body> після <page>, будь ласка, спробуйте:

<?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
Дякую за вашу відповідь, для мене це теж не працює.
— Ricky.C

Ви змінили <layout> тег на <page> тег?
— Маг Рішення

Так, я просто скопіював ваш код і змінив Namespace_ModuleName
— Ricky.C

0

Перевизначення методів setTemplate для мене працює найкраще.

/ **
 * Відображення стовпців назви елементів замовлення на продаж
 * /
назва класу 
розширює \ Magento \ Продажі \ Блок \ Adminhtml \ Предмети \ Стовпець \ Ім'я
{

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

    / **
     * Додайте розриви рядків і скорочуйте значення
     *
     * @param string $ value
     * @return масив
     * /
    публічна функція getFormattedOption (значення $)
    {
        $ залишок = '';
        $ value = $ this-> truncateString (
                 str_replace (';', '; 
', $ value), 1024, '', решта $ ); return ['value' => nl2br ($ значення), 'залишок' => nl2br ($ залишок)]; } }

0

Я знаю, що це старе, але якщо це комусь допомагає,

у цьому випуску github magento2 / issues / 3356 зазначено, що метод referenceBlock та аргументів (згаданий у питанні) страждає від помилки на відміну від застарілого та робочого методу:

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

документація (Встановити шаблон блоку) не відображає фактичний стан речей.


1
так, новий метод не завжди працює, тому треба використовувати застарілий
— TheKitMurkit
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.