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"
      ]
    ]
  }
}
Ricky.C
источник

Ответы:

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 (он зависит от модуля Customer, поэтому загружается после него, как ваш пользовательский модуль), и это сработало для меня. Ваш модуль вообще распознается Magento? И, конечно же, не забудьте очистить кеш перед обновлением страницы. Попробуйте сделать это с помощью капчи, просто чтобы понять, связана ли проблема с вашим модулем или объявлением макета.
Алекс Палиаруш
@ 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>

Он заменяет «макет» на «страницу» и добавляет тег body

РЕДАКТИРОВАТЬ: 2-й вариант - удалить оригинальный блок и добавить новый с нужным шаблоном.

<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>
csmarvz
источник
Спасибо за ваш ответ, я попробовал его, но все равно не
получилось
Попробуйте второе решение. Кстати, ваш файл шаблона находится в Namespace / ModuleName / view / frontend / templates / form / register.phtml?
csmarvz
Это все еще не удалось для меня, я думаю, потому что я работаю с шаблоном adminhtml. Поэтому я попробовал еще более альтернативный метод: скопировать шаблон в мой собственный модуль, а затем переопределить блок, чтобы вызвать 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 работает лучше всего для меня.

/ **
 * Рендеринг колонки наименований товаров в заказе клиента
 * /
Имя класса 
extends \ Magento \ Sales \ Block \ Adminhtml \ Items \ Column \ Name
{

    публичная функция setTemplate ($ template) {
        return parent :: setTemplate ('Magento_Sales ::'. $ template);
    }

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

Я знаю, что это старо, но если это кому-то поможет,

В этом выпуске github magento2 / Issues / 3356 говорится, что метод referenceBlock и arguments (упомянутый в вопросе) страдает ошибкой, в отличие от устаревшего и рабочего метода:

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

документация (установить шаблон блока) не отражает фактического положения вещей.

medmek
источник
1
да, новый метод не всегда работает, поэтому использовать его не рекомендуется
TheKitMurkit