Magento2: So überschreiben Sie die Widget-Vorlage

8

Das CatalogWidget-Modul enthält die Datei widget.xml. In der widget.xml befindet sich

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

Wie kann die Vorlagendatei für das Widget ordnungsgemäß geändert werden?

Ciemin
quelle

Antworten:

10

Sie können das Widget in Ihrem Modul erweitern.

Dazu muss Ihr Modul von dem Modul abhängen, in dem das ursprüngliche Widget definiert ist (siehe Reihenfolge in der module.xml).

Dann erstellen Sie eine widget.xml in Ihrem etc-Verzeichnis.

Der Schlüssel ist, nicht die Datei widget.xsd zu verwenden (es sind viele Felder erforderlich, die Sie nicht zum Erweitern benötigen), sondern die Datei widget_file.xsd.

Hier ist ein Beispiel zum Hinzufügen einer Vorlage zum statischen Block-Widget:

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

Hier ist ein weiteres Beispiel mit einer Containerkonfiguration, um die Vorlage für bestimmte Container zuzulassen:

<?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>
David Verholen
quelle
1
Ich habe versucht, ein Modul zu erstellen, das Ihre Datei widget.xml verwendet, und ich erhalte diesen Fehler. Invalid Document Element 'label': This element is not expected. Line: 34 Die Zeile 34, auf die sich dieser Fehler bezieht, befindet sich in vendor / magento / module-catalog-widget / etc / widget.xml. Können Sie versuchen, ein Modul zu erstellen? und Implementierung Ihrer Lösung, um eine Vorlage in dieses Widget aufzunehmen? Ich denke, Sie können den gleichen Fehler wie ich bekommen. Wenn Sie dies tun, werde ich eine Ausgabe auf Github einreichen. Wenn nicht, werde ich zumindest wissen, dass ich etwas falsch mache.
Nathan Toombs
1
hm, wir verwenden dies in einem aktuellen Projekt für einen Produktschieberegler und es funktioniert immer noch. Sind Sie sicher, dass Sie die Datei widget_file.xsd verwenden und dass Ihre XML-Struktur korrekt ist? Versuchen Sie möglicherweise, Ihre widget.xml anhand der Datei widget_file.xsd zu überprüfen.
David Verholen
Es funktioniert für cms_static_block, aber nicht für das products_listWidget. Wenn Sie den ID-Parameter auf dem Widget-Knoten in products_list geändert haben, wird wahrscheinlich derselbe Fehler angezeigt, den ich sehe.
Nathan Toombs
1
In unserem Modul erweitern wir das Widget products_list, um ein wirklich leichtes Produkt-Slider-Modul zu erstellen (als Beispiel zu meiner Antwort hinzugefügt). Ich denke nicht, dass es Ihr Problem lösen wird, aber wir mussten die Containerkonfiguration hinzufügen, damit die Vorlage für die im ursprünglichen Widget definierten Container erlaubt ist
David Verholen
Es sieht so aus, als ob die Containerkonfiguration, die in meiner Datei widget.xml fehlt, das Problem war. Vielen Dank!
Nathan Toombs
6

Sie können die grid.phtml ersetzen, in der Sie das Widget aufrufen

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

Erstellen Sie ein benutzerdefiniertes Design, kopieren Sie die HTML-Datei und nehmen Sie Ihre Änderungen vor.

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

andyjv
quelle
Ok, aber ich suche eine Lösung, mit der ich das HTML in meinem benutzerdefinierten Modul überschreiben kann. In einer XML-Datei oder so etwas überschreiben. Ist es möglich?
Ciemin
Magento lädt Ihre HTML-Datei automatisch von Ihrem Modul, wenn sie im richtigen Ordner abgelegt wird, wie oben gezeigt. Es sind keine XML-Änderungen erforderlich, um eine HTML-Datei zu überschreiben.
Andyjv
Aber ich sehe anders aus, als das HTML in der von Ihnen erwähnten Weise zu überschreiben. Ich muss das im Rahmen meines benutzerdefinierten Moduls tun, ich möchte keine Dateien zu einem Thema hinzufügen.
Ciemin
Vorlagendateien für Widgets gehen ein <module>/view/frontend/templates/und Sie würden die Datei in Ihrem XML genauso angeben wie CatalogWidget. Selbst wenn Sie CatalogWidget erweitern und Ihre Vorlage dies ist <module>/view/frontend/templates/product/widget/content/grid.phtml, hat die Datei in Ihrem benutzerdefinierten Modulverzeichnis Vorrang.
Andyjv
"Sie würden die Datei in Ihrem XML genauso angeben wie CatalogWidget" Was meinen Sie damit? welches XML? Das Kopieren der Vorlage in mein Modul mit demselben Pfad wie in Magento_CatalogWidget und das Hinzufügen eines Sequenzknotens zu module.xml funktioniert einfach nicht.
Ciemin
2

Ich hatte den gleichen Fehler: Ungültiges Dokumentelement 'label': Dieses Element wird nicht erwartet. Zeile: 34 mit products_list Dies funktionierte für mich ( Magento 2.0.4 ) widget.xml- Datei in Ihrem benutzerdefinierten Modul:

<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>
Samir Shaban
quelle
Vielen Dank. In meinem Fall musste ich nur das labelTag hinzufügen (Widgets> Widget> Parameter> Parameter> Label) und dann funktionierte es. Das containersist also nicht erforderlich.
Zsolti
-1

Ich habe eine Voreinstellung für die Widgets-Blockklasse erstellt, die den Vorlagenpfad relativ zum Modulverzeichnis erstellt.

di.xml:

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

Klasse:

use Vendor\Module\Block\CatalogWidget\Product;

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

}

Jetzt wird die Vorlage in
Vendor/Module/view/frontend/templates/product/widget/content/grid.phtmlanstelle von verwendetMagento/CatalogWidget/view/frontend/templates/product/widget/content/grid.phtml

Code Spirit
quelle
Ich habe es mit diesem Schritt versucht, aber es funktioniert nicht.
Abhimanyu Singh