Magento2:ウィジェットテンプレートをオーバーライドする方法


8

CatalogWidgetモジュールにはwidget.xmlがあります。widget.xmlの中に

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

ウィジェットのテンプレートファイルを変更する適切な方法は何ですか?

回答:


10

モジュールでウィジェットを拡張できます。

そのためには、元のウィジェットが定義されているモジュールにモジュールを依存させる必要があります(module.xmlのシーケンスを参照)。

次に、etcディレクトリにwidget.xmlを作成します。

重要なのは、widget.xsdを使用しないことです(拡張に必要のない多くのフィールドが必要です)が、widget_file.xsdです。

以下は、静的ブロックウィジェットにテンプレートを追加する例です。

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

これは、特定のコンテナーのテンプレートを許可するためのコンテナー構成の別の例です。

<?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
私はあなたのwidget.xmlファイルを使用するモジュールを作成しようとしました、そして私はこのエラーを得 Invalid Document Element 'label': This element is not expected. Line: 34 ますそして、そのウィジェットにテンプレートを含めるようにソリューションを実装しますか?私と同じエラーが出るかもしれません。もしそうなら、私はgithubに問題を提出します。少なくとも、私が何か間違ったことをしていることがわかるでしょう。
Nathan Toombs

1
ええと、これを製品スライダーの実際のプロジェクトで使用していますが、まだ機能しています。widget_file.xsdを使用していて、xml構造は正しいですか?多分、widget_file.xsdに対してwidget.xmlを検証してみてください。
David Verholen 16

cms_static_blockでは機能しますが、products_listウィジェットでは機能しません。ウィジェットノードのidパラメータをproducts_listに変更した場合、同じエラーが表示される可能性があります。
Nathan Toombs、

1
実際、私たちのモジュールでは、products_listウィジェットを拡張して、非常に軽量な製品スライダーモジュール(例として私の回答に追加されています)を作成しています。私はそれがあなたの問題を解決するとは思いませんが、テンプレートが元のウィジェットで定義されたコンテナーに許可されるようにコンテナー構成を追加する必要がありました
David Verholen

私のwidget.xmlファイルから欠落しているコンテナー構成が問題だったようです。ありがとう!
Nathan Toombs、

6

ウィジェットを呼び出すgrid.phtmlを置き換えることができます

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

2

カスタムテーマを作成し、.phtmlファイルをそれにコピーして、変更を加えます。

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


わかりましたが、カスタムモジュール内のphtmlをオーバーライドできるソリューションを探しています。xmlファイルなどでオーバーライドする。出来ますか?
ciemin

上記で示したように、Magentoは、正しいフォルダーに配置されている場合、モジュールからphtmlファイルを自動的にロードします。phtmlファイルをオーバーライドするためにXMLを変更する必要はありません。
andyjv

しかし、私はあなたが言及した方法でそのphtmlを上書きして別の方法を探しています カスタムモジュールのスコープでそれを行う必要があります。テーマにファイルを入れたくありません。
ciemin 2016年

ウィジェットのテンプレートファイルを<module>/view/frontend/templates/入力し、CatalogWidgetと同じ方法でXMLにファイルを指定します。CatalogWidgetを拡張していて、テンプレートが<module>/view/frontend/templates/product/widget/content/grid.phtmlである場合でも、カスタムモジュールディレクトリ内のファイルが優先されます。
andyjv 2016年

「CatalogWidgetと同じ方法でXMLでファイルを指定します」それはどういう意味ですか?どんなXML?Magento_CatalogWidgetと同じパスを使用してモジュールにテンプレートをコピーし、module.xmlにシーケンスノードを追加しても機能しません。
ciemin 2016年

2

同じエラーが発生しました:無効なドキュメント要素 'ラベル':この要素は予期されていません。行:34 with products_listこれは私(Magento 2.0.4)のカスタムモジュールのwidget.xmlファイルで機能しました。

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

ありがとう。私の場合、labelタグ(ウィジェット>ウィジェット>パラメータ>パラメータ>ラベル)のみを追加する必要があり、それが機能しました。したがって、これcontainersは必要ありません。
Zsolti

-1

私はウィジェットブロッククラスの設定を作成しました。これにより、テンプレートパスがモジュールディレクトリに相対的になります。

di.xml:

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

クラス:

use Vendor\Module\Block\CatalogWidget\Product;

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

}

今で
Vendor/Module/view/frontend/templates/product/widget/content/grid.phtmlはの代わりにテンプレートが使用されますMagento/CatalogWidget/view/frontend/templates/product/widget/content/grid.phtml


この手順を試しましたが、機能しません。
Abhimanyu Singh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.