Magento 2: วิธีการตั้งค่าแม่แบบกำหนดเองสำหรับบล็อกหลัก


15

ฉันพยายามที่จะแทนที่ register.phtml ในโมดูลของฉัน แต่ดูเหมือนว่ามีปัญหาการกำหนดค่าบางอย่างที่ทำให้วีโอไอพีไม่สามารถใช้เทมเพลตที่กำหนดเองของฉันเพื่อแทนที่หนึ่งในโมดูลหลัก ฉันตรวจสอบรหัสแล้ว แต่ไม่พบปัญหา ใครช่วยได้บ้าง ขอบคุณล่วงหน้า. 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>

customer_account_create.xml ภายใต้ Namespace \ ModuleName \ view \ frontend \ layout:

<?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_CustomerCustomAttributesไปsequenceในของคุณmodule.xmlเพราะมันยังแทนที่แม่แบบนี้และอาจแทนที่การเปลี่ยนแปลงของคุณ


1
ขอบคุณอเล็กซ์ แต่มันไม่ได้ผลสำหรับฉัน ฉันสงสัยว่าฉันพลาดรายละเอียดที่สำคัญเช่นไฟล์ config หรือพิมพ์ผิด
Ricky.C

เพียงแค่พยายามที่จะวางเลย์เอาต์ดังกล่าวไปยังโมดูล Captcha (มันมีการพึ่งพาโมดูลลูกค้าดังนั้นจึงโหลดหลังจากนั้นเช่นโมดูลที่กำหนดเองของคุณ) และมันใช้งานได้สำหรับฉัน โมดูลของคุณได้รับการยอมรับจาก Magento หรือไม่? และแน่นอนอย่าลืมล้างแคชก่อนรีเฟรชหน้า ลองสิ่งนี้กับแคปต์ชาเพื่อทำความเข้าใจว่าปัญหาเกิดขึ้นกับโมดูลหรือการประกาศเลย์เอาต์ของคุณหรือไม่
Alex Paliarush

@ Ricky.C ดูคำตอบที่อัพเดตโดยเฉพาะเกี่ยวกับ EE
Alex Paliarush

ฉันลองใช้ไวยากรณ์ทางเลือกแล้วมันใช้งานได้กับ 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>

มันแทนที่ "เค้าโครง" กับ "หน้า" และเพิ่มแท็กร่างกาย

แก้ไข: ทางเลือกที่สองคือการลบบล็อกเดิมและเพิ่มใหม่ด้วยเทมเพลตที่ต้องการ

<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

ลองด้วยวิธีที่ 2 ยังไงไฟล์เทมเพลตของคุณใน Namespace / ModuleName / view / frontend / templates / form / register.phtml
csmarvz

สิ่งนี้ยังคงล้มเหลวสำหรับฉันฉันคิดว่าเพราะฉันทำงานกับเทมเพลต adminhtml ดังนั้นฉันจึงลองวิธีอื่นเพิ่มเติม: คัดลอกแม่แบบไปยังโมดูลของฉันแล้วแทนที่ Block เพื่อเรียกใช้setTemplateเมธอดซึ่งจะหาแม่แบบในโมดูลเดียวกัน ทางออกที่สกปรกมาก แต่สิ่งเดียวที่ใช้ได้สำหรับฉัน!
Jacques

0

คุณไม่มีแท็ก <เนื้อหา> หลังจากแท็ก <หน้า> โปรดลอง:

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

คุณเปลี่ยน <layout> tag เป็น <page> tag หรือไม่
Mage Solution

ใช่ฉันเพิ่งคัดลอกรหัสของคุณและเปลี่ยน Namespace_ModuleName
Ricky.C

0

การเอาชนะเมธอด setTemplate นั้นดีที่สุดสำหรับฉัน

/ **
 * ตัวแสดงคอลัมน์ชื่อรายการสั่งซื้อการขาย
 * /
ชื่อคลาส 
ขยาย \ Magento \ Sales \ Block \ Adminhtml \ Items \ Column \ ชื่อ
{

    ฟังก์ชั่นที่สาธารณะ setTemplate ($ แม่แบบ) {
        ผู้ปกครองกลับ :: setTemplate ('Magento_Sales ::'. $ แม่แบบ);
    }

    / **
     * เพิ่มตัวแบ่งบรรทัดและตัดค่า
     * * * *
     * @param string $ value
     * @return array
     * /
    ฟังก์ชั่นที่สาธารณะ getFormattedOption (มูลค่า $)
    {
        $ เหลือ = '';
        $ value = $ this-> truncateString (
                 str_replace (';', '; 
', ค่า $), 1024, '', $ ที่เหลือ ); return ['value' => nl2br ($ value) 'เหลือ' => nl2br ($ เหลือ)]; } }

0

ฉันรู้ว่ามันเก่า แต่ถ้ามันช่วยใครซักคน

ปัญหาGithubฉบับนี้magento2 / problems / 3356ระบุว่าการอ้างอิงบล็อกและวิธีการโต้แย้ง (กล่าวถึงในคำถาม) ได้รับความเดือดร้อนจากข้อผิดพลาดซึ่งตรงข้ามกับวิธีการเลิกและการทำงาน:

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