Theme-Block in Plugin überschreiben - Wie?

Hallo,

wie kann ich in einem Plugin denn einen Block im Theme überschreiben bzw. erweitern?

ich hab ein eigenes Theme, welches vom Shopware-Theme ableitet.

zB diese Datei:  storefront/base.html.twig

{% sw_extends '@Parent/storefront/base.html.twig' %}

darin erweitere ich mit einem eigenen Block einen Block von Shopware. Soweit so gut.

nun hab ich aber noch ein Plugin, welches meinen eigenen Block aus dem Theme ebenfalls noch erweitern soll.

also wieder  storefront/base.html.twig , wieder mit dem selben extends

{% sw_extends '@Parent/storefront/base.html.twig' %}

aber diese Block-Erweiterung (auch direkt Überschreiben geht nicht) klappt einfach nicht… auch nicht nach diversen cache:refresh, theme:compile oder sonst was…

was mach ich falsch?

Hallo,

müsste es nicht eher:

{% sw_extends ‘@Storefront/storefront/base.html.twig’ %}

lauten, siehe: https://docs.shopware.com/en/shopware-platform-dev-en/how-to/extending-storefront-block#overriding-the-template . Und dann einfach den eigenen, individuellen Twig - Block aus dem eigenen Theme anpassen?

Grüße

Sebastian

im Online-Trainings-Video von Shopware wurde gesagt, dass das „@Storefront“ obsolet ist und in Zukunft lieber „@Parent“ eingesetzt werden soll. 

Damit man vom echten „Parent“ ableitet und nicht immer von Storefront.

 

EDIT: habs jetzt trotzdem mal mit @Storefront versucht.

in beiden Dateien steht jetzt: 

{% sw_extends '@Storefront/storefront/base.html.twig' %}

in meinem Theme steht:

{% sw_extends '@Storefront/storefront/base.html.twig' %}

{% block base_footer_inner %}
    {{ parent }}
    {% block dasisteintest %}
        hallo welt
    {% endblock %}
{% endblock %}

und in meinem Plugin

{% sw_extends '@Storefront/storefront/base.html.twig' %}

{% block dasisteintest %}
    {{ parent }} 
    noch mehr Hallo Welt
{% endblock %}

meiner Meinung nach müsste im Footer jetzt also stehen: hallo welt noch mehr Hallo Welt… da steht aber nur „hallo welt“

Passt denn die Vererbungsreihenfolge in deiner Theme.json? Da gibst du die Reihenfolge ja an.

Hi [@Moritz Naczenski](http://forum.shopware.com/profile/14574/Moritz Naczenski „Moritz Naczenski“)‍,

da hab ich das drin was beim Standard theme:create erzeugt wird.

"views": [
     "@Storefront",
     "@Plugins",
     "@MyTheme"
  ],

müsste ich MyTheme und Plugins also tauschen? Dann bin ich halt nicht mehr fähig, Drittanbieter-Plugins zu modifizieren, weil mir dort was nicht passt…

wie ist denn eigentlich die Reihenfolge der Vererbung dort? Von unten nach oben oder oben nach unten? _Storefront -> Plugins -> MyTheme? _Dann hätte natürlich MyTheme immer Recht und ein Plugin könnte niemals ein Theme überschreiben… Blödsinn irgendwie… wie macht das dann zB PayPal? Ist ja auch nicht extra aufgeführt.

EDIT: hab jetzt mein Plugin dort auch mal aufgeführt

"views": [
     "@Storefront",
     "@Plugins",
     "@MyTheme",
     "@MyPlugin"
  ],

jetzt seh ich im Frontend aber nur noch den Inhalt vom Plugin-Block, obwohl dort {{ parent }} drin steht … ganz egal ob ich @Parent oder @Storefront nutze…

aber es kann ja eigentlich nicht Sinn der Sache sein, dass man dort Plugins aufführen muss. Eigentlich muss doch automatisch jedes Plugin Blöcke aus dem aktuell gewählten Theme erweitern können oder nicht? 

 

EDIT 2: Wenn ich @MyPlugin in der theme.json nutze, dann erscheint der Block aus dem Plugin zumindest an der Stelle, wo ich ihn im Theme hinzugefügt hab. Der Block an sich scheint sich also zu vererben. Jedoch klappt das mit {{ parent }} offenbar nicht im Plugin … es wird immer nur der eigene Inhalt gezeigt, nicht beide zusammen…

hat denn keiner von Shopware mehr ne Antwort?

Das ist genau so wie in SW5 auch - du definierst die Vererbungsreihenfolge.

Das Default ist aktuell “Theme kommt als letztes”, heißt dein Plugin wird vom Theme überschrieben. Wenn du es andersrum heben willst musst du imho @plugin und @mytheme tauschen. In SW5 kannst du ja auch definieren, wer der letzte in der Kette ist. Das ist also erstmal korrekt.

Was ist denn nun der konkrete Fehler, wenn du die beiden in der theme.json miteinander tauschst.

Hallo [@Moritz Naczenski](http://forum.shopware.com/profile/14574/Moritz Naczenski „Moritz Naczenski“)‍,

aber ich konnte doch in SW5 jederzeit in einem Plugin einen Block erweitern und dann im Theme nochmal, oder etwa nicht? Dafür gibts ja die Vererbung und Parent.

hab das jetzt so

"views": [
     "@Storefront",
     "@Plugins",
     "@MyTheme",
     "@MyPlugin"
  ],

damit nur @MyPlugin mein Theme überschreibt, nicht aber die anderen Plugins. Der „Parent“ von MyPlugin müsste dementsprechend MyTheme sein, oder nicht?

Das heißt, wenn ich den Block an beiden Stellen erweitere und  {{ parent }} verwende, müsste zuerst der Inhalt von MyTheme angezeigt werden und dann der Inhalt von MyPlugin. Oder nicht?

Aktuell ist es so, dass nur der Inhalt von MyPlugin sichtbar ist… weil das {{ parent }} offenbar nicht den Inhalt von MyTheme einbindet.

Meiner Meinung nach müsste das aber auch funktionieren, ohne dass ich die Reihenfolge in theme.json verändere… eben über {{parent}}… Dann kommt eben zuerst der Inhalt von MyPlugin und dann der Inhalt von MyTheme … aber das klappt eben nicht.

Wenn ich das @MyPlugin in der theme.json weglasse, dann wäre doch @Plugins der Parent von @MyTheme, richtig? Folglich sollte wenn ich im @MyTheme mit {{parent}} arbeite, auch der Inhalt vom Plugin sichtbar sein… ist er aber nicht

@FloC3 schrieb:

aber ich konnte doch in SW5 jederzeit in einem Plugin einen Block erweitern und dann im Theme nochmal, oder etwa nicht? Dafür gibts ja die Vererbung und Parent.

Nur wenn du die Template inheritance richtig definiert hast. Du konntest es auch so machen, dass ein Plugin niemals dein eigenes Theme überschreiben konnte. Stichwort „Injectbeforeplugins“.

 

  • Storefront
  • MyTheme
  • Plugins

Müsste heißen: Mit „MyTheme“ kannst du nur Themes aus „Storefront“ (parent) überschreiben und Plugins können „MyTheme“ und „Storefront“ überschreiben.

 

  • Storefront
  • Plugins
  • MyTheme

heißt: Mit „Plugins“ kann ich nur „Storefront“ (parent) überschreiben, nicht „MyTheme“. Mit „MyTheme“ kann ich „Plugins“ (parent) und Storefront (parent) überschreiben. 

 

Ich glaube am einfachsten ist es, wenn du einfach mal ein Beispiel erzeugst:

  • Theme was genau eine Datei überschreibt/erweitert
  • Plugin was genau eine Datei überschreibt/erweitert aus Theme

Dann kann das auch jeder lokal nachvollziehen ohne sich da groß einarbeiten zu müssen.

Hallo [@Moritz Naczenski](http://forum.shopware.com/profile/14574/Moritz Naczenski „Moritz Naczenski“)‍,

aus viel mehr als einer Datei und einem Block besteht mein Konstrukt sowieso nicht. Ich wollte das ausprobieren…

"views": [
     "@Storefront",
     "@Plugins",
     "@MyTheme",
     "@MyPlugin"
  ],

dann meine Datei im Theme: \ MyTheme\src\Resources\views\storefront\base.html.twig

{% sw_extends '@Parent/storefront/base.html.twig' %}

{% block base_footer_inner %}
    {% block test %}
        hallo welt!
    {% endblock %}
{% endblock %}

und dann noch meine Plugin-Datei: \MyPlugin\src\Resources\views\storefront\base.html.twig

{% sw_extends '@Parent/storefront/base.html.twig' %}

{% block test%}
	{{ parent }}
	Wo bist du?
{% endblock %}

 

es müsste doch also mein Plugin den Block „test“ aus dem Theme erweitern oder? Durch den Einsatz von {{ parent }} sollte der Inhalt vom Theme kommen und durch „Wo bist du?“ ergänzt werden. Die Ausgabe sollte also lauten: „Hallo Welt! Wo bist du?“

Die Ausgabe lautet aber „Wo bist du?“.

heißt für mich: {{ parent }} macht nicht das was es soll… ?

Probiers mal mit {{ parent() }}

Gut gesehen, war mir garnicht aufgefallen.

Es muss auf jeden Fall {{ parent() }} sein, damit es funktioniert.

 

Vll. hängt es auch hiermit zusammen: Shopware Issuetracker

1 Like

Wenn du es reproduzieren kannst, mach ein Ticket auf oder verlinke es hier bitte. Dann kann sich das auch die Entwicklung mal ansehen.

“hochvoten” bringt bei shopware 6 nix - da sind so viele elementare grundfunktionen offen (artikel kopieren, bestellungen löschen) das sowas eher das kleinste problem ist. bedenke: du benutzt eine shopware 6 beta"stable" - produktiv vielleicht einsetzbar mit standard shop funktionen 2023 - falls du bis dahin nicht (hoffentlich) genervt aufgegeben hast und zu einem funktionalen system mit standard funktionen gewechselt bist.

die geschichte wiederholt sich halt - den gleichen gau konnte man bei magento 1 auf 2 und auch xt:commerce sehen.

keine innovation / brauchbare plattform = und die geschichte wird sich auch hier wiederholen.

Hallo zusammen,

das von BenjaminHa beschriebene Verhalten hängt damit zusammen, dass Themes momentan nicht von “views” berücksichtigt werden, wenn sie nicht aktiv dem aktuellen Verkaufskanal zugewiesen sind. Damit verschiedenen Verkaufskanälen verschiedene Themes zugewiesen werden können, liegt hier aktuell eine “Trennung” vor. Diese Trennung wurde ursprünglich implementiert um zu verhindern, dass Themes ungewünschte Template-Änderungen aus einem anderen Theme eines anderen Verkaufskanals haben. Das wollen wir aber überarbeiten und dafür sorgen, dass die theme.json immer berücksichtigt wird und sozusagen “immer gewinnt”. Auch wenn Themes die dort gesetzt werden gerade gar nicht aktiv bzw. einem Verkaufskanal zugewiesen sind: https://issues.shopware.com/issues/NEXT-7344

Für den Moment könnt ihr als Workaround eure “Basis Theme” Template-Anpassungen in ein reguläres Plugin kopieren und das “Custom Theme” darauf aufbauen:

"views": [
  "@Storefront",
  "@PluginBaseTheme",
  "@MyCustomTheme"
],

@FloC3‍ : Das Beispiel mit den zwei Blöcken “base_footer_inner” und “dasisteintest” habe ich bei mir nachgebaut mit folgender views Reihenfolge:

"views": [
  "@Storefront",
  "@TestTheme",
  "@Plugins"
],

Wenn die {{ parent() }} Funktion wie oben beschrieben mit den Klammern verwendet wird, bekomme ich auch beide Ausgaben.

Viele Grüße
Tobias

1 Like