如何在Magento 2中覆盖Virtual Type类


14

如何在Magento 2中覆盖VirtualType块,我想用自己的块覆盖以下虚拟类型块,

<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中重写虚拟类型类的正确方法是什么?

Answers:


14

您必须使用:

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

正如拉斐尔(Raphael)所述。

为了使此单个块正常工作,还需要添加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
就提供的模板而言,@ScottBuchanan包含模块。在回答这个问题,这个块包含模板,product/list.phtml因此使用偏好改变模板Vendor_Module::product/list.phtml
巴特洛梅耶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)在

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

@nuwaus如果将其移到该etc/frontend/di.xml怎么办?
拉斐尔(Raphael)在Digital Pianism上,2013年

它仍然不起作用:(
nuwaus

4

我不确定xml配置如何准确地合并和排序,但是这种类型的问题通常归结为正在加载的模块的顺序。

我会尝试将序列添加到您的module.xml

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

上面Raphael描述的偏好对我来说很好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.