Cách ghi đè lớp Loại ảo trong Magento 2


13

Cách ghi đè khối VirtualType trong Magento 2, tôi muốn ghi đè khối sau loại ảo bằng khối riêng của mình,

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

Vì vậy, tôi đã cố gắng ghi đè nó từ mô-đun tùy chỉnh của mình di.xmlnhư thế này,

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

Nhưng nó không hoạt động.

Vậy, cách thức thích hợp để ghi đè một lớp loại ảo trong Magento 2 là gì?

Câu trả lời:


13

Bạn phải sử dụng:

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

như Raphael đã đề cập.

Để làm cho khối số ít này hoạt động chính xác, bạn cũng cần thêm view/frontend/layout/catalogsearch_result_index.xmltệp có nội dung sau:

<?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
Hoạt động như một lá bùa!
Volvox

Tại sao bạn nói bạn cần setTemplatehành động? Tôi không tin đó là sự thật. Đặt tùy chọn cho loại ảo không nên ảnh hưởng đến cài đặt mẫu đã được xác định trong XML bố cục lõi.
Scott Hội trưởng

1
@ScottAWanan cho đến khi mẫu được cung cấp có chứa mô-đun. Khi trả lời câu hỏi này, khối này chứa mẫu vì product/list.phtmlvậy sử dụng mẫu đã thay đổi tùy chọn thànhVendor_Module::product/list.phtml
Bartłomiej Szubert

Ah, có ý nghĩa
Scott Hội trưởng

7

Nếu bạn muốn ghi đè loại ảo trong ví dụ của mình, bạn cần sử dụng:

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

Thay vì:

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

Trong ví dụ của bạn, bạn ghi đè loại ban đầu chứ không phải loại ảo, đó là lý do tại sao nó không hoạt động.


Cảm ơn câu trả lời của bạn, Bây giờ tôi đã thử cách bạn đề cập, nhưng nó vẫn không hoạt động.
nuwaus

@nuwaus thú vị, bạn đang di.xmlở đâu?
Raphael tại Digital Pianism

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

@nuwaus nếu bạn chuyển nó sang etc/frontend/di.xml?
Raphael tại Nghệ thuật piano kỹ thuật số

Nó vẫn không hoạt động :(
nuwaus

4

Tôi không chắc chắn chính xác các cấu hình xml được hợp nhất và sắp xếp như thế nào, nhưng loại vấn đề này thường đi xuống theo chuỗi các mô-đun được tải.

Tôi sẽ thử thêm chuỗi vào module.xml:

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

Sở thích được mô tả bởi Raphael ở trên đang hoạt động tốt đối với tôi.

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.