Magento 2: Thay đổi mẫu của Block


52

Trong Magento 1, với tư cách là nhà phát triển mô-đun, có thể thay đổi mẫu của khối bằng cách sử dụng mã XML bố cục giống như thế này

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

và sau đó thêm mẫu của bạn vào chủ đề cơ bản.

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

Là một nhà phát triển mô-đun, có thể làm điều gì đó tương tự trong Magento 2 không? Hoặc tôi sẽ cần sử dụng mã XML hoặc PHP bố cục để loại bỏ khối mà tôi quan tâm và chèn một khối mới bằng một mẫu khác (có lớp mở rộng lớp khối ban đầu)

Tôi biết tôi có thể tạo một chủ đề tùy chỉnh thay thế một mẫu, nhưng tôi quan tâm đến việc tạo một mô-đun thay đổi mẫu mặc định, nhưng vẫn cho phép một chủ đề tùy chỉnh thay thế mẫu đó.

Câu trả lời:


60

Tất nhiên, có thể:

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

Bạn có thể giải thích các bước làm thế nào tôi có thể thay đổi bố cục không, thực ra tôi muốn cập nhật tệp add thành addtocart.phtml theo cấu hình hệ thống và cũng muốn cập nhật điều này bằng mô-đun tùy chỉnh
Deepak Mankotia

5
Giải pháp KAndy không hiệu quả với tôi nhưng giải pháp này có
csmarvz

Tôi đã thay đổi mẫu của tên khối "customer_account_dashboard_top" <body> <ReferenceBlock name = "customer_account_dashboard_top"> <action method = "setTemplate"> <argument name = "template" xsi: type = "string"> Namespace_Mod /recentorder.phtml </ argument> </ action> </ ReferenceBlock> </ body> "nhưng nó không hoạt động, vui lòng kiểm tra và cho tôi biết ý kiến ​​của bạn
senthil

43

Nút hành động không được dùng nữa, nhưng bạn có thể sử dụng đối số khối

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

Bạn có thể giải thích các bước làm thế nào tôi có thể thay đổi bố cục không, thực ra tôi muốn cập nhật phần bổ sung addtocart.phtmltheo cấu hình hệ thống và cũng muốn cập nhật phần này bằng mô-đun tùy chỉnh
Deepak Mankotia


4
Cảm ơn - Tôi sẽ chỉ để lại một tài liệu tham khảo cho một báo cáo lỗi ở đây github.com/magento/magento2/issues/3356 - phương pháp được đăng trong câu trả lời này, trong khi có thể là cách làm trong tương lai, vẫn chưa hoạt động như quảng cáo
Kristof tại Fooman

2
@KAndy Ví dụ mã của bạn có đúng 100% không? Tôi đã thử điều đó và tôi không thể làm cho nó hoạt động theo bất kỳ cách nào. Câu trả lời khác từ @ Mage2.PRO (sử dụng <action method='setTemplate'>) hoạt động mà không gặp vấn đề gì.
maginfortis

1
Điều này không hoạt động. Mặc dù câu trả lời được chấp nhận.
Milan Simek

29

Để hiểu sự khác biệt giữa <arguments><action>bạn phải hiểu cách các hàm tạo của các đối tượng Magento 2 hoạt động. Nếu bạn ghi đè một hàm tạo trong Magento, bạn sẽ luôn nhận được $data-parameterđó là một mảng. Đây là dữ liệu như được cung cấp trong các tệp XML và được dịch sang nội bộ $_data-arraycủa \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;
}

Tuy nhiên, trong trường hợp mẫu, nếu setTemplate()được sử dụng trong hàm tạo giả ( _construct(), dấu gạch dưới đơn), điều này có nghĩa là phần tử $databị ghi đè, bất kể nó được đặt trong XML.

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

Trong kịch bản đó, <action>được ưu tiên hơn, vì điều này được thực thi sau hàm tạo & hàm giả.

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

10

Sau đây làm việc cho tôi trong 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>

Lưu ý: nếu bạn đang sử dụng một mô-đun tùy chỉnh để thay đổi mẫu của lõi và bạn sẽ phát điên vì mã bị cắt trước đó không hoạt động, hãy đảm bảo mô-đun của bạn được tải sau mô-đun lõi mà bạn đang cố gắng thay đổi (module.xml) và bạn thực hiện bin/magento setup:upgrade:)


Đây là cách sạch nhất theo ý kiến ​​của tôi.
Ben Crook

2

Tôi không biết tại sao, nhưng tôi thấy cách này là tốt nhất:

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

Điều này sẽ chỉ hoạt động nếu khối của bạn không bị ghi đè trước khi sử dụng setTemplatephương thức. Magento 2.2.x trở lên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.