Magento 2: Cách đặt mẫu tùy chỉnh cho khối lõi


15

Tôi đang cố gắng ghi đè register.phtml trong mô-đun của mình, nhưng có vẻ như có một số vấn đề cấu hình khiến Magento không thể sử dụng mẫu tùy chỉnh của tôi để ghi đè lên mô-đun lõi. Tôi đã kiểm tra mã nhưng không thể tìm thấy vấn đề. Bất cứ ai có thể giúp đỡ? Cảm ơn trước. mô-đun:

<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 trong 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"
      ]
    ]
  }
}

Câu trả lời:


18

Chỉ cần tham chiếu khối cần thiết và đặt mẫu làm thuộc tính của referenceBlocknút:

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

Cú pháp thay thế:

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

Ngoài ra nếu bạn đang sử dụng Enterprise Edition, hãy chắc chắn để đưa Magento_CustomerCustomAttributesvào sequencetrong của bạn module.xmlbởi vì nó cũng đè mẫu này và có thể ghi đè lên thay đổi của bạn.


1
Cảm ơn Alex, nhưng nó không làm việc cho tôi. Tôi tự hỏi tôi đã bỏ lỡ một số chi tiết quan trọng, ví dụ như tập tin cấu hình hoặc có lỗi đánh máy.
Ricky.C

Chỉ cần cố gắng đưa tay cầm bố trí như vậy vào mô-đun Captcha (nó có sự phụ thuộc vào mô-đun Khách hàng để được tải sau nó, giống như mô-đun tùy chỉnh của bạn) và nó hoạt động với tôi. Mô-đun của bạn có được Magento công nhận không? Và tất nhiên hãy nhớ xóa bộ nhớ cache trước khi làm mới trang. Hãy thử điều này với Captcha, chỉ để hiểu nếu sự cố xảy ra với mô-đun hoặc khai báo bố cục của bạn.
Alex Paliarush

@ Ricky.C xem câu trả lời cập nhật, đặc biệt là về EE.
Alex Paliarush

Tôi đã thử cú pháp thay thế, nó hoạt động trên Community Magento 2.0 mới nhất của tôi. Cảm ơn rất nhiều.
Ricky.C

1

Sử dụng mã này trong tệp bố trí của bạn thay vào đó:

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

Nó thay thế "layout" bằng "page" và thêm thẻ body

EDIT: Thay thế thứ 2 là loại bỏ khối ban đầu và thêm một khối mới với mẫu mong muốn

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

Cảm ơn câu trả lời của bạn, tôi đã thử nhưng vẫn thất bại
Ricky.C

Hãy thử với giải pháp thứ 2. Nhân tiện, tập tin mẫu của bạn có trong Namespace / ModuleName / view / frontend / samples / form / register.phtml không?
csmarvz

Điều này vẫn thất bại đối với tôi, tôi nghĩ bởi vì tôi đang làm việc với một mẫu adminhtml. Vì vậy, tôi đã thử một phương pháp thậm chí còn thay thế hơn: Sao chép mẫu vào mô-đun của riêng tôi và sau đó ghi đè Khối để gọi setTemplatephương thức, sau đó tìm thấy mẫu trong cùng mô-đun. Giải pháp rất bẩn nhưng điều duy nhất làm việc cho tôi!
Jacques

0

Bạn thiếu thẻ <body> sau thẻ <page>, vui lòng thử:

<?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
Cảm ơn câu trả lời của bạn, nó cũng không làm việc cho tôi.
Ricky.C

Bạn đã thay đổi thẻ <layout> thành thẻ <page>?
Giải pháp pháp sư

Có, tôi vừa sao chép mã của bạn và thay đổi Namespace_ModuleName
Ricky.C

0

Ghi đè các phương thức setTemplate hoạt động tốt nhất đối với tôi.

/ **
 * Trình kết xuất cột tên đơn đặt hàng
 * /
tên lớp 
mở rộng \ Magento \ Sales \ Block \ adminhtml \ Item \ Cột \ Name
{

    hàm công khai setTemplate ($ template) {
        return cha mẹ :: setTemplate ('Magento_Sales ::'. $ mẫu);
    }

    / **
     * Thêm ngắt dòng và giá trị cắt ngắn
     *
     * @param chuỗi $ value
     * mảng @return
     * /
    Hàm công khai getFormattedOption ($ value)
    {
        $ còn lại = '';
        $ value = $ this-> truncateString (
                 str numplace (';', '; 
', $ value), 1024, '', $ còn lại ); trả về ['value' => nl2br ($ value), 'phần còn lại' => nl2br ($ phần còn lại)]; } }

0

Tôi biết điều này đã cũ, nhưng nếu nó giúp được ai đó,

github này vấn đề magento2 / vấn đề / 3356 bang mà referenceBlockđối số phương pháp (mentionned trong câu hỏi) bị một lỗi như trái ngược với phương pháp phản đối và làm việc:

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

tài liệu (Đặt mẫu khối) không phản ánh trạng thái thực tế của sự vật.


1
vâng, phương thức mới không phải lúc nào cũng hoạt động, vì vậy phải sử dụng một phương pháp không dùng nữa
TheKitMurkit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.