Magento 2에서 가상 유형 클래스를 대체하는 방법


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에서 가상 유형 클래스를 재정의하는 올바른 방법은 무엇입니까?

답변:


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
제공된 템플릿이 모듈을 포함하는 한 @ScottBuchanan. 이 질문에 대답 할 때,이 블록으로 템플릿을 포함 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입니까?
Digital Pianism의 Raphael

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

@nuwaus 당신이 그것을 옮기면 etc/frontend/di.xml어떨까요?
Digital Pianism의 Raphael

여전히 작동하지 않습니다 :(
nuwaus

4

XML 구성이 정확히 어떻게 병합되고 정렬되는지 확실하지 않지만 이러한 유형의 문제는 일반적으로로드되는 모듈 순서에 따라 발생합니다.

나는 당신의 시퀀스를 추가하려고합니다 module.xml:

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

위의 Raphael이 설명한 선호도가 저에게 잘 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.