마 젠토 2 : 코어 블록을위한 커스텀 템플릿 설정 방법


15

내 모듈에서 register.phtml을 재정의하려고하는데 Magento가 내 사용자 지정 템플릿을 사용하여 핵심 모듈의 템플릿을 재정의하지 못하는 구성 문제가있는 것 같습니다. 코드를 확인했지만 문제를 찾을 수 없습니다. 누구든지 도울 수 있습니까? 미리 감사드립니다. module.xml :

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Namespace_ModuleName" setup_version="0.0.2">
        <sequence>
            <module name="Magento_Customer"/>
        </sequence>
    </module>
</config>

네임 스페이스 \ ModuleName \ view \ frontend \ layout 아래 customer_account_create.xml :

<?xml version="1.0"?>
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
    <referenceBlock name="customer_form_register">
        <arguments>

            <argument name="template" xsi:type="string">Namespace_ModuleName::form/register.phtml</argument>

        </arguments>
    </referenceBlock>
</layout>

composer.json :

{
  "name": "namespace/module-modulename",
  "description": "modulename",
  "type": "magento2-module",
  "version": "0.0.2",
  "license": [
    "OSL-3.0",
    "AFL-3.0"
  ],
  "require": {
    "php": "~5.5.0|~5.6.0",
    "magento/framework": "~0.42",
    "magento/magento-composer-installer": "*",
    "magento/module-customer": "*"
  },
  "extra": {
    "map": [
      [
        "*",
        "Namespace/ModuleName"
      ]
    ]
  }
}

답변:


18

필요한 블록을 참조하고 템플릿을 referenceBlock노드의 속성으로 설정 하십시오.

<?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="customer_form_register" template="VendorName_ModuleName::form/register.phtml"/>
    </body>
</page>

대체 구문 :

<referenceBlock name="customer_form_register">
    <action method="setTemplate">
        <argument name="template" xsi:type="string">VendorName_ModuleName::form/register.phtml</argument>
    </action>
</referenceBlock>

당신은 Enterprise Edition을 사용하는 경우 또한, 넣어 확인 Magento_CustomerCustomAttributessequence당신의 module.xml그것은 또한이 템플릿을 무시하기 때문에 변경 사항을 오버라이드 (override) 할 수 있습니다.


1
감사합니다 Alex, 그러나 그것은 나를 위해 작동하지 않습니다. 구성 파일과 같은 중요한 세부 정보를 놓치거나 오타가 있는지 궁금합니다.
Ricky.C

이러한 레이아웃 핸들을 Captcha 모듈에 넣으려고했는데 (고객 모듈에 의존하므로 사용자 정의 모듈과 같이로드 됨) 저에게 효과적이었습니다. Magento가 모듈을 인식합니까? 물론 페이지를 새로 고치기 전에 캐시를 지우십시오. 모듈이나 레이아웃 선언에 문제가 있는지 이해하기 위해 Captcha로 시도하십시오.
Alex Paliarush 2016

@ Ricky.C는 특히 EE에 관한 업데이트 된 답변을 참조하십시오.
Alex Paliarush 2016

대안 구문을 시도했지만 최신 Community Magento 2.0에서 작동합니다. 고마워
Ricky.C

1

대신 레이아웃 파일에서이 코드를 사용하십시오.

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="customer_form_register">
            <arguments>
                <argument name="template" xsi:type="string">Namespace_ModuleName::form/register.phtml</argument>
            </arguments>
        </referenceBlock>
    </body>
</page>

"layout"을 "page"로 바꾸고 body 태그를 추가합니다

편집 : 두 번째 대안은 원래 블록을 제거하고 원하는 템플릿으로 새 블록을 추가하는 것입니다

<referenceBlock name="customer_form_register" remove="true"/>
<referenceContainer name="content">
    <block class="Magento\Customer\Block\Form\Register" name="my_customer_form_register" template="Namespace_ModuleName::form/register.phtml">
        <container name="form.additional.info" as="form_additional_info"/>
        <container name="customer.form.register.fields.before" as="form_fields_before" label="Form Fields Before" htmlTag="div" htmlClass="customer-form-before"/>
    </block>
</referenceContainer>

귀하의 답변에 감사드립니다, 나는 그것을 시도했지만 여전히 실패
Ricky.C

두 번째 솔루션을 사용해보십시오. 그런데 Namespace / ModuleName / view / frontend / templates / form / register.phtml의 템플릿 파일입니까?
csmarvz

이것은 여전히 ​​실패했습니다. 관리 HTML 템플릿으로 작업하고 있기 때문에 생각합니다. 그래서 다른 대안을 시도했습니다. 템플릿을 내 자신의 모듈로 복사 한 다음 Block을 재정 의하여 setTemplate메소드 를 호출 하면 동일한 모듈에서 템플릿을 찾습니다. 매우 더러운 해결책이지만 나를 위해 일한 유일한 것!
Jacques

0

<page> 태그 다음에 <body> 태그가 없습니다. 다음을 시도하십시오.

<?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="customer_form_register">
        <arguments>

            <argument name="template" xsi:type="string">Namespace_ModuleName::form/register.phtml</argument>

        </arguments>
    </referenceBlock>
</body>
</page>

1
답변 주셔서 감사합니다, 그것은 또한 나를 위해 작동하지 않습니다.
Ricky.C

<레이아웃> 태그를 <페이지> 태그로 변경 했습니까?
마법사 솔루션

예, 방금 코드를 복사하고 Namespace_ModuleName
Ricky를

0

setTemplate 메소드를 재정의하면 가장 효과적입니다.

/ **
 * 판매 주문 항목 이름 열 렌더러
 * /
클래스 이름 
\ Magento \ Sales \ Block \ Adminhtml \ Items \ Column \ Name을 확장합니다.
{

    공용 함수 setTemplate ($ template) {
        부모 반환 :: setTemplate ( 'Magento_Sales ::'. $ template);
    }

    / **
     * 줄 바꿈 추가 및 값 자르기
     *
     * @param 문자열 $ value
     * @ 반환 배열
     * /
    공용 함수 getFormattedOption ($ value)
    {
        $ remainder = '';
        $ value = $ this-> truncateString (
                 str_replace ( ';', '; 
', $ value), 1024 '' '', 나머지 ); [ 'value'=> nl2br ($ value) 반환, 'remainder'=> nl2br ($ 리마인더)]; } }

0

나는 이것이 오래되었다는 것을 알고 있지만 누군가에게 도움이된다면

이 github 문제 magento2 / issues / 3356 따르면 referenceBlockarguments 메소드 (질문에서 언급 됨 )는 더 이상 사용되지 않고 작동하는 메소드와 달리 버그로 인해 발생합니다.

<referenceBlock name="customer_form_login">
    <action method="setTemplate">
        <argument name="template" xsi:type="string">
            VendorName_ModuleName::form/login.phtml
        </argument>
    </action>
</referenceBlock>

문서 (블록 템플릿 설정) 는 실제 상태를 반영하지 않습니다.


1
꼭 사용 하나되지 않도록 예, 새로운 방법은 항상 일을하지 않습니다
TheKitMurkit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.