วิธีการแทนที่คลาส Virtual Type ใน Magento 2


14

วิธีการแทนที่ VirtualType block ใน Magento 2 ฉันต้องการแทนที่การบล็อกเสมือนจริงด้วยบล็อกของฉันเอง

<virtualType name="Magento\CatalogSearch\Block\SearchResult\ListProduct" type="Magento\Catalog\Block\Product\ListProduct">
   <arguments>
       <argument name="catalogLayer" xsi:type="object">Magento\Catalog\Model\Layer\Search</argument>
   </arguments>
</virtualType>

ดังนั้นฉันจึงพยายามแทนที่มันจากโมดูลที่กำหนดเองของฉันdi.xmlเช่นนี้

<preference for="Magento\Catalog\Block\Product\ListProduct" type="My\Vendor\Block\Product\ListProductSearch" />

แต่มันไม่ทำงาน

ดังนั้นวิธีที่เหมาะสมในการเอาชนะคลาสชนิดเสมือนใน Magento 2 คืออะไร

คำตอบ:


14

คุณต้องใช้:

<preference for="Magento\CatalogSearch\Block\SearchResult\ListProduct" type="Vendor\Module\Block\Product\ListProductSearch" />

ดังที่ราฟาเอลพูดถึง

เพื่อให้บล็อกเอกพจน์ทำงานได้อย่างถูกต้องคุณต้องเพิ่มview/frontend/layout/catalogsearch_result_index.xmlไฟล์ที่มีเนื้อหาดังต่อไปนี้:

<?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="search_result_list">
        <action method="setTemplate">
            <argument name="template" xsi:type="string">Magento_Catalog::product/list.phtml</argument>
        </action>
    </referenceBlock>
</body>


1
ทำงานเหมือนจับใจ!
Volvox

ทำไมคุณถึงบอกว่าคุณต้องการการsetTemplateกระทำ? ฉันไม่เชื่อว่าเป็นเรื่องจริง การตั้งค่ากำหนดสำหรับประเภทเสมือนไม่ควรส่งผลต่อการตั้งค่าเทมเพลตที่กำหนดไว้แล้วใน XML เลย์เอาต์หลัก
Scott Buchanan

1
@Scottgonanan เท่าที่เทมเพลตที่ระบุมีโมดูล เมื่อตอบคำถามนี้บล็อกนี้มีเทมเพลตproduct/list.phtmlโดยใช้การเปลี่ยนค่าของเทมเพลตเป็นVendor_Module::product/list.phtml
Bartłomiej Szubert

อ่าเหมาะสมแล้ว
Scott Buchanan

8

หากคุณต้องการแทนที่ประเภทเสมือนในตัวอย่างของคุณคุณต้องใช้:

<preference for="Magento\CatalogSearch\Block\SearchResult\ListProduct" type="My\Vendor\Block\Product\ListProductSearch" />

แทน:

<preference for="Magento\Catalog\Block\Product\ListProduct" type="My\Vendor\Block\Product\ListProductSearch" />

ในตัวอย่างของคุณคุณแทนที่ชนิดดั้งเดิมไม่ใช่ชนิดเสมือนนั่นคือเหตุผลที่ทำไมมันไม่ทำงาน


ขอบคุณสำหรับคำตอบของคุณตอนนี้ฉันได้ลองวิธีที่คุณพูดถึง แต่ก็ยังใช้งานไม่ได้
nuwaus

@nuwaus น่าสนใจคุณdi.xmlอยู่ที่ไหน
Raphael ที่ Digital Pianism

my-plugin-dir / etc / di.xml
nuwaus

@nuwaus เกิดอะไรขึ้นถ้าคุณย้ายมันไปetc/frontend/di.xml?
Raphael ที่ Digital Pianism

มันยังไม่ทำงาน :(
nuwaus

4

ฉันไม่แน่ใจว่าการรวมและการจัดเรียงของ xml นั้นถูกต้องอย่างไร แต่ปัญหาประเภทนี้มักเกิดขึ้นตามลำดับของโมดูลที่กำลังโหลด

ฉันจะลองเพิ่มลำดับของคุณmodule.xml:

<sequence>
        <module name="Magento_CatalogSearch"/>
</sequence>

การตั้งค่าที่อธิบายโดย Raphael ด้านบนนั้นใช้งานได้ดีสำหรับฉัน

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