마 젠토 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
캔디 솔루션은 나를 그러나 이것은 예 작동하지 않았다
csmarvz

블록 이름 "customer_account_dashboard_top"<body> <referenceBlock name = "customer_account_dashboard_top"> <action method = "setTemplate"> <argument name = "template"xsi : type = "string"> Namespace_Modulename :: order의 템플릿을 변경했습니다. /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 8:24에

1
작동하지 않습니다. 그러나 대답은 받아들입니다.
밀라노 시멕

29

의 차이를 이해하기 위해, <arguments>그리고 <action>당신은 마 젠토이 객체의 생성자가 어떻게 작동하는지 이해해야합니다. 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>

참고 : 사용자 지정 모듈을 사용하여 코어의 템플릿을 변경하고 이전 코드가 작동하지 않아 화를내는 경우 변경하려는 코어 모듈 (module.xml) 이후에 모듈이로드되어 있는지 확인하십시오. 실행 bin/magento setup:upgrade:)


이것은 내 의견으로는 가장 깨끗한 방법입니다.
벤 크룩

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메소드 를 사용하기 전에 블록을 덮어 쓰지 않은 경우에만 작동합니다 . 마 젠토 2.2.x 이상

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