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.