Magento 2: Зміна шаблону блоку


52

У Magento 1, як розробник модуля, можна змінити шаблон блоку, використовуючи XML-код макета приблизно так

<reference name="block_to_change">
    <action method="setTemplate">
        <param>/path/to/template.phtml</param>
    </action>
</reference>

а потім додайте ваш шаблон до базової теми.

app/design/frontend/base/default/template/path/to/template.phtml

Чи можливо, як розробник модулів, зробити щось подібне в Magento 2? Або мені потрібно використовувати макет XML або PHP-код, щоб видалити цікавий мені блок, і вставити новий блок з іншим шаблоном (клас якого поширює вихідний блок-клас)

Я знаю, що можу створити власну тему, яка замінює шаблон, але мені цікаво створити модуль, який змінює шаблон за замовчуванням, але все ж дозволяє користувацькій темі замінити цей шаблон.

Відповіді:


59

Звичайно, можна:

<referenceBlock name="copyright">
    <action method="setTemplate">
        <argument name="template" xsi:type="string">Dfr_Backend::page/copyright.phtml</argument>
    </action>
</referenceBlock>

Чи можете ви пояснити кроки, як я можу змінити макет? Насправді я хочу оновити файл add tocart.phtml відповідно до конфігурації системи, а також хочу оновити це за допомогою спеціального модуля
Deepak Mankotia

5
Рішення KAndy не працювало для мене, але це так
csmarvz

Я змінив шаблон імені блоку "customer_account_dashboard_top" <body> <referenceBlock name = "customer_account_dashboard_top"> <метод дії = "setTemplate"> <аргумент = = шаблон "xsi: type =" string "> Іменна область_Modulename :: замовлення /recentorder.phtml </argument> </action> </referenceBlock> </body> ", але це не працює, будь ласка, перевірте і повідомте мені ваші коментарі
вересень

43

Вузол дії застарілий, але ви можете використовувати аргументи блоків

<referenceBlock name="block_to_change">
    <arguments>
        <argument name="template" xsi:type="string">[Vendor]_[Module]::/path/to/template.phtml</argument>
    </arguments>
</referenceBlock>

Чи можете ви пояснити кроки, як я можу змінити макет? Насправді я хочу оновити додавання до addtocart.phtmlфайлу відповідно до конфігурації системи, а також хочу оновити це за допомогою спеціального модуля
Deepak Mankotia


4
Дякую - я просто залишу тут посилання на звіт про помилку github.com/magento/magento2/isissue/3356 - метод, розміщений у цій відповіді, хоча, можливо, майбутній спосіб робити все ще не працює як рекламується
Kristof у Фомані

2
@KAndy Чи є ваш приклад коду 100% правильним? Я спробував це, і я не можу змусити його працювати. Інша відповідь від @ Mage2.PRO (яка використовує <action method='setTemplate'>) працює без проблем.
maginfortis

1
Це не працює. Прийнята відповідь все ж робить.
Мілан Симек

29

Щоб зрозуміти різницю між <arguments>і <action>ви повинні зрозуміти , як конструктори Magento 2 об'єктів працюють. Якщо ви заміните конструктор в Magento, ви завжди отримаєте, $data-parameterщо є масивом. Це дані , як це передбачено в файлах XML і переведених на внутрішній $_data-arrayз \Magento\Framework\DataObject:

<referenceBlock name="catalog.topnav">
    <arguments>
        <argument name="template" xsi:type="string">Foo_Bar::buzz.phtml</argument>
    </arguments>
</referenceBlock>    

...

public function __construct(array $data = [])
{
    // $_data is populated with the arguments from XML:
    // so $_data['template'] is now 'Foo_Bar::buzz.phtml'
    $this->_data = $data;
}

Однак у випадку шаблону, якщо setTemplate()він використовується в псевдоконструкторі ( _construct(), єдине підкреслення), це означає, що $dataперекриття, незалежно від того, чи він встановлений у XML.

public function _construct()
{
    $this->setTemplate('foo/bar.phtml');
}

У цьому сценарії <action>є кращим, оскільки це виконується після конструктора & псевдо конструктора.

<referenceBlock name="catalog.topnav">
    <action method="setTemplate">
        <argument name="template" xsi:type="string">Foo_Bar::buzz.phtml</argument>
    </action>
</referenceBlock> 

10

Наступне працювало для мене в Magento EE 2.2.3

<?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="core.module.block.name" template="[Vendor]_[Module]::path/to/your/template.phtml" />
    </body>
</page>

Примітка: якщо ви використовуєте спеціальний модуль для зміни шаблону ядра, і ви збуваєте з розуму, оскільки попередній фрагмент коду не працює, переконайтеся, що ваш модуль завантажений після основного модуля, який ви намагаєтесь змінити (module.xml), і ви виконано bin/magento setup:upgrade:)


Це найчистіший спосіб на мою думку.
Бен Крук

2

Я не знаю чому, але я вважаю цей спосіб найкращим:

<referenceBlock name="sales.order.items.renderers.default" template="Foo_Bar::sales/order/items/renderer/default.phtml"/>

1
<referenceBlock name="sales.order.items.renderers.default" template="Foo_Bar::sales/order/items/renderer/default.phtml"/>

Це буде працювати лише в тому випадку, якщо ваш блок не був перезаписаний перед використанням setTemplateметоду. Magento 2.2.x і вище.

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