Magento2: Cách ghi đè mẫu widget


8

Có widget.xml trong mô-đun CatalogWidget. Bên trong widget.xml có

        <parameter name="template" xsi:type="select" required="true" visible="true">
            <label translate="true">Template</label>
            <options>
                <option name="default" value="product/widget/content/grid.phtml" selected="true">
                    <label translate="true">Products Grid Template</label>
                </option>
            </options>
        </parameter>

Một cách thích hợp để thay đổi tệp mẫu cho widget là gì?

Câu trả lời:


10

bạn có thể mở rộng các widget trong mô-đun của bạn.

Để làm được điều đó, mô-đun của bạn phải phụ thuộc vào mô-đun nơi tiện ích gốc được xác định (xem trình tự trong mô-đun).

Sau đó, bạn tạo một widget.xml trong thư mục vv của bạn.

Điều quan trọng là, không sử dụng widget.xsd (có nhiều trường bắt buộc mà bạn không cần phải mở rộng) mà là widget_file.xsd.

Dưới đây là một ví dụ để thêm một mẫu vào tiện ích khối tĩnh:

<?xml version="1.0" encoding="UTF-8"?>
<widgets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Widget:etc/widget_file.xsd">
    <widget id="cms_static_block">
        <parameters>
            <parameter name="template" xsi:type="select">
                <options>
                    <option name="option_id" value="Your_Module::view/form.phtml">
                        <label translate="true">Your Template</label>
                    </option>
                </options>
            </parameter>
        </parameters>
    </widget>
</widgets>

Dưới đây là một ví dụ khác với cấu hình bộ chứa, để cho phép mẫu cho các bộ chứa cụ thể:

<?xml version="1.0" encoding="UTF-8"?>
<widgets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Widget:etc/widget_file.xsd">
    <widget id="products_list">
        <parameters>
            <parameter name="template" xsi:type="select">
                <options>
                    <option name="slider" value="Vendor_Module::product/widget/content/slider.phtml">
                        <label translate="true">Products Slider Template</label>
                    </option>
                </options>
            </parameter>
        </parameters>
        <containers>
            <container name="content">
                <template name="slider" value="slider" />
            </container>
            <container name="content.top">
                <template name="slider" value="slider" />
            </container>
            <container name="content.bottom">
                <template name="slider" value="slider" />
            </container>
        </containers>
    </widget>
</widgets>

1
Tôi đã thử tạo một mô-đun sử dụng tệp widget.xml của bạn và tôi gặp lỗi này Invalid Document Element 'label': This element is not expected. Line: 34 Dòng 34 lỗi này được đề cập là trong nhà cung cấp / magento / module-catalog-widget / etc / widget.xml Bạn có thể thử tạo mô-đun không và thực hiện giải pháp của bạn để bao gồm một mẫu trong widget đó? Tôi nghĩ rằng bạn có thể nhận được cùng một lỗi như tôi. Nếu bạn làm tôi sẽ gửi một vấn đề trên github. Nếu không ít nhất tôi sẽ biết mình đang làm gì đó sai.
Toombs Nathan

1
hm, chúng tôi đang sử dụng điều này trong một dự án thực tế cho một thanh trượt sản phẩm và nó vẫn hoạt động. Bạn có chắc chắn rằng bạn đang sử dụng widget_file.xsd và cấu trúc xml của bạn là chính xác? Có thể thử xác thực widget của bạn dựa trên widget_file.xsd.
David Verholen

Nó hoạt động cho cms_static_block nhưng không phải cho products_listwidget. Nếu bạn thay đổi tham số id trên nút widget thành sản phẩm_list, bạn có thể sẽ gặp lỗi tương tự tôi đang thấy.
Nathan Toombs

1
thực tế, trong mô-đun của chúng tôi, khi họ mở rộng tiện ích sản phẩm_list để tạo mô-đun thanh trượt sản phẩm thực sự nhẹ (thêm vào ví dụ cho câu trả lời của tôi). Tôi không nghĩ rằng nó sẽ giải quyết vấn đề của bạn, nhưng chúng tôi đã phải thêm cấu hình bộ chứa để mẫu được phép cho các bộ chứa được xác định trong tiện ích gốc
David Verholen

Có vẻ như cấu hình bộ chứa bị thiếu trong tệp widget.xml của tôi là vấn đề. Cảm ơn!
Nathan Toombs

6

Bạn có thể thay thế Grid.phtml nơi bạn gọi widget

{{widget type="Magento\CatalogWidget\Block\Product\ProductsList" title="Our Products" products_count="8" template="Namespace_Modulename::product/widget/content/grid.phtml" }}

2

Tạo một chủ đề tùy chỉnh và sao chép tệp .phtml vào đó và thực hiện các thay đổi của bạn.

app/design/frontend/<package>/<theme>/Magento_Catalog_Wiget/templates/product/widget/content/grid.phtml


Ok, nhưng tôi đang tìm một giải pháp mà tôi có thể ghi đè lên phtml bên trong modul tùy chỉnh của mình. Để ghi đè trong một số tệp xml hoặc một cái gì đó. Có thể không?
ciemin

Magento sẽ tự động tải tập tin phtml của bạn từ mô-đun của bạn nếu nó được đặt vào đúng thư mục, như tôi trình bày ở trên. Không có thay đổi XML cần thiết để ghi đè tệp phtml.
andyjv

Nhưng tôi đang tìm cách khác để ghi đè phtml đó theo cách bạn đã đề cập. Tôi cần phải làm điều đó trong phạm vi mô-đun tùy chỉnh của mình, tôi không muốn đặt bất kỳ tệp nào vào một chủ đề.
ciemin

Các tệp mẫu cho các widget đi vào <module>/view/frontend/templates/và bạn sẽ chỉ định tệp trong XML của mình giống như cách CatalogWidget thực hiện. Ngay cả khi bạn đang mở rộng CatalogWidget và mẫu của bạn <module>/view/frontend/templates/product/widget/content/grid.phtml, tệp trong thư mục mô-đun tùy chỉnh của bạn sẽ được ưu tiên.
andyjv

"bạn sẽ chỉ định tệp trong XML của mình giống như cách CatalogWidget thực hiện" ý của bạn là gì? XML gì? Sao chép mẫu vào mô-đun của tôi với cùng một đường dẫn như trong Magento_CatalogWidget và thêm nút trình tự vào module.xml đơn giản là không hoạt động.
ciemin

2

Tôi có cùng một lỗi: 'Nhãn' Phần tử tài liệu không hợp lệ: Phần tử này không được mong đợi. Dòng: 34 với sản phẩm_list Tệp này làm việc cho tôi ( Magento 2.0.4 ) tệp widget.xml trong mô-đun tùy chỉnh của bạn:

<widgets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Widget:etc/widget.xsd">
    <widget id="products_list">
        <label translate="true">Catalog Products List</label>
        <description translate="true">List of Products</description>
        <parameters>
            <parameter name="template" xsi:type="select">
                <label translate="true">Template</label>
                <options>
                    <option name="slider" value="Vendor_Modul::product/widget/content/slider.phtml">
                        <label translate="true">Slider</label>
                    </option>
                </options>
            </parameter>
        </parameters>
        <containers>
            <container name="content">
                <template name="slider" value="slider" />
            </container>
            <container name="content.top">
                <template name="slider" value="slider" />
            </container>
            <container name="content.bottom">
                <template name="slider" value="slider" />
            </container>
        </containers>
    </widget>
</widgets>

Cảm ơn. Trong trường hợp của tôi, tôi chỉ phải thêm labelthẻ (widget> widget> tham số> tham số> nhãn) và sau đó nó hoạt động. Vì vậy, containerskhông bắt buộc.
Zsolti

-1

Ive đã tạo một ưu tiên cho lớp khối widget làm cho đường dẫn mẫu có liên quan đến thư mục mô-đun.

di.xml:

<preference
    for="Magento\CatalogWidget\Block\Product\ProductsList"
    type="Vendor\Module\Block\CatalogWidget\Product\ProductsList" />

Lớp học:

use Vendor\Module\Block\CatalogWidget\Product;

class ProductList extends \Magento\CatalogWidget\Block\Product\ProductList {

}

Bây giờ mẫu trong
Vendor/Module/view/frontend/templates/product/widget/content/grid.phtmlđược sử dụng thay vìMagento/CatalogWidget/view/frontend/templates/product/widget/content/grid.phtml


Tôi đã thử với bước này nhưng nó không hoạt động.
Abhimanyu Singh
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.