Per TWIG auf Template eines anderen Plugins zugreifen?

Hallo alle zusammen,

kann ich mit einem Plugin direkt per Twig die Templatedatei eines anderen Plugins einbinden bzw. erweitern?

Wenn ich eine Theme-Datei überschreiben bzw. anpassen will, sieht die Einbindung ja wie folgt aus:

{% sw_extends ‘@Storefront/storefront/block/cms-block-category-navigation.html.twig’ %}

Wie würde es aussehen, wenn es an diesem Twig-Template bereits Änderungen von Plugin fremdesPlugin gibt? Wie könnte ich direkt diese Templatedatei in meinem Plugin einbinden um weitere Änderungen vornehmen?

 

1 „Gefällt mir“

Den @Storefront Teil kannst du ignorieren dieser ist egal. Die Änderungen von allen Plugins werden zusammen getan, die die selbe Datei erweitern

@shyim heißt das, ich kann einfach extenden? Also im Plugin „Shop-Blog“, z.B. dann

'@Storefront/storefront/page/blog-blog-post-detail/index.html.twig'

eingeben, oder muss ich dann @ShopBlog/storefront … eintragen?
Wo müssen die View-Dateien im Theme-Ordner liegen? Einfach unter „Theme/src/Resources/views/storefront/page/blog-blog-post-detail/index.html.twig“ oder brauche ich einen eigenen Plugin-Ordner innerhalb des Themes?

Die Antwort von shyim ist mit Vorsicht zu beachten. twig überschreibt Twig-Blöcke nur einmal. Wenn du zwei Plugins hast, die den gleichen Twig-Block überschreiben, dann wird eines davon ignoriert.

Der @Part sagt Symfony, wo bzw. in welchem Plugin es die Dateien/Ordner suchen soll.

@ShopBlog/storefront/page/blog-blog-post-detail/index.html.twig wäre dann korrekt.

1 „Gefällt mir“

@abart_owidmann Hast du eine Lösung gefunden und möchtest diese teilen? Ich versuche vergeblich die View-Dateien von diesem Plugin zu überschreiben. Ist vielleicht das, was du auch versucht hast zu überschreiben.

@philiscoding wie bereits @Max_Shop erwähnt hat, kannst du mit „@pluginname/storefront/…/name.html.twig“ das Template eines Plugins anpassen.

Wichtig hierbei ist die Installationsreihenfolge (bzw. das created_at Attribute) der Plugins.

vg

1 „Gefällt mir“

danke! hatte einen blöden Typo. Funktioniert jetzt bei mir.

Ich habe gerade einen Fall, wo ich in meinem Theme eine TWIG-Datei sowohl vom Core als auch einem Plugin extenden muss. Wie kann ich das am besten anstellen?

Habe es herausgefunden: Einfach vom @Storefront extenden und die im Plugin verwendeten Blöcke überschreiben. Hat bei mir auch funktioniert, wenn ich vom @PluginName extended habe.

Nachtrag: Habe auch mit „created_at“ in der Datenbank herumgespielt - macht bei mir keinen Unterschied.

1 „Gefällt mir“

Im Theme (JSON-Datei) kann ma die Reihenfolge angeben, was wie überschreiben wird.

Daher können die Resultate variieren.

1 „Gefällt mir“

Gibt es da heute eine „sichere“ Methode den Twig-Code eines anderen Plugins zu überschreiben?

And Twig hat sich nichts geändert. Blöcke können nur einmal überschrieben werden. Die Reihenfolge, nach der die Themes bzw. Plugins geladen werden ist relevant. Das sollte nach wie vor anhand des Datums erfolgen. Zur Not Plugin deinstallieren (alle Daten löschen) und neu installieren, dann wird es nach den anderen Plugins geladen.

Danke für die Info. Betrifft das nur die initiale Installation oder auch Updates? Wenn z.B. ein Plugin das früher installiert wurde ein Update erhält, wird dann die Reihenfolge geändert?
Ich sehe in der Datenbank 4 Felder - installed_at, upgraded_at, created_at und updated_at.
Ansonsten bleibt ja nur die brachiale Methode den Code des anderen Plugins zu ändern und zu beten, das man diese Änderung bei allen Updates nachzieht. :see_no_evil:

Das Installationsdatum, soviel ich weiß. Sonst würde sich Shopware ja ständig anders verhalten :laughing:

Wenn ich die Doku von Shopware ansehe steht da folgendes Beispiel:

// <plugin root>/src/Resources/theme.json
{
  "name": "SwagBasicExampleThemeExtend",
  "author": "Shopware AG",
  "views": [
     "@Storefront",
     "@Plugins",
     "@SwagBasicExampleTheme",
     "@SwagBasicExampleThemeExtend"
  ],

In diesem Fall würden also die Korrekturen eines Blocks durch ExampleTheme und ExampleThemeExtend ignoriert werden, sofern ein Plugin, das vorher dran kommt, den Block bereits überschrieben hat?

Mittlerweile kann man auch in einem Plugin die Template Priority mit der Methode getTemplatePriority() angeben.

1 „Gefällt mir“

Ok, danke für die Info. Hab dazu etwas gefunden:

Doch ich vermute, dass dies die Anzahl der Überschreibungen die Begrenzung ist.

Leider finde ich das auch oft Problematisch mit dem ziehen der TWIG - ich muss teilweise eben die Plugininfos in mein Customtheme mit reinbringen - da diverse Plugins auf die selben TWIGs zugreifen und dann wie bekannt ist - nur 1 funktioniert… Deshalb mache ich es jedenfalls so dies gesammelt im Theme zu integrieren - oder hat hier jemand noch bessere Ideen ? :slight_smile:

Ich mache es auch so, dass ich ab einem bestimmten Punkt dazu übergehe, TWIG-Schnipsel aus anderen Plugins ins eigene Theme/Plugin zu übernehmen. Anders geht es manchmal einfach nicht (bzw. ist nicht mehr praktikabel). Generell versuche ich aber, zu extenden, wo immer es geht.

Das eigene Theme funktioniert m.W. nur, wenn man lediglich vom Shopware-Standard-Theme ableitet. Wenn ein gekauftes Theme im Einsatz ist, kann man nur die Datenbank-Anpassungen als Sub-Theme nutzen. Alle Änderungen in TWIG müssen in ein separates Plugin gepackt werden. Themeware bietet da z.B. ein Mini-Plugin an. So entsteht das Problem, dass Plugins untereinander Konflikte haben können. Ich komme da im schlimmsten Fall nur weiter, wenn ich die anderen Plugins in deren Source patche. Das ist eine sehr üble Methode, doch ich kenne da keinen anderen Weg.