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>

คุณช่วยอธิบายขั้นตอนที่ฉันจะเปลี่ยนเลย์เอาต์ได้จริง ๆ แล้วฉันต้องการอัปเดตไฟล์เพิ่มไปยัง addtocart.phtml ตามการกำหนดค่าระบบและยังต้องการอัปเดตนี้โดยใช้โมดูลที่กำหนดเอง
Deepak Mankotia

5
วิธีการแก้ปัญหาของ KAndy ใช้งานไม่ได้สำหรับฉัน แต่อันนี้ใช่
csmarvz

ฉันเปลี่ยนแม่แบบของชื่อบล็อก "customer_account_dashboard_top" <body> <referenceBlock name = "customer_account_dashboard_top"> <action method = "setTemplate"> <อาร์กิวเมนต์ชื่อ = "แม่แบบ" xsi: type = "string"> Namespace_Modenen :: คำสั่ง /recentorder.phtml </argument> </action> </referenceBlock> </body> "แต่มันไม่ทำงานโปรดตรวจสอบและแจ้งให้เราทราบความคิดเห็นของคุณ
senthil

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/issues/3356 - วิธีการโพสต์ในคำตอบนี้ในขณะที่อาจเป็นวิธีในอนาคตของการทำสิ่งต่าง ๆ ยังไม่ทำงานตามที่โฆษณา
Kristof ที่ Fooman

2
@KAndy เป็นตัวอย่างรหัสของคุณถูกต้อง 100%? ฉันลองแล้วไม่สามารถทำงานได้ แต่อย่างใด คำตอบอื่น ๆ จาก @ Mage2.PRO (ซึ่งใช้<action method='setTemplate'>) ทำงานได้โดยไม่มีปัญหา
maginfortis

1
มันใช้งานไม่ได้ แม้ว่าคำตอบที่ยอมรับจะทำได้
Milan Simek

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>

หมายเหตุ:ถ้าคุณกำลังใช้โมดูลที่กำหนดเองเพื่อเปลี่ยนแม่แบบของคอร์และคุณกำลังจะโมโหเพราะโค้ดก่อนหน้านี้ที่ snipped ไม่ทำงานตรวจสอบให้แน่ใจว่าโมดูลของคุณถูกโหลดหลังจากโมดูลหลักที่คุณกำลังพยายามเปลี่ยน (module.xml) และคุณ ดำเนินการbin/magento setup:upgrade:)


นี่เป็นวิธีที่สะอาดที่สุดในความคิดของฉัน
Ben Crook

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 และสูงกว่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.