Template-Vererbung und Smarty 3 {include} - Statements?

Hallo zusammen, als Shopware 5 Einsteiger würde ich mich über Antworten auf folgende Fragen in Bezug auf die Template-Vererbung von Templates, die mit dem Smarty 3 {include} - Statement eingebunden werden, freuen: Wie kann man erreichen, dass das Template im {include}-Statement nicht im Eltern-Theme, sondern im Kind-Theme gesucht wird? Hintergrund: Aus dem Eltern-Theme habe ich einen Block namens „frontend_index_footer“ aus der Datei „index.tpl“ in die entsprechende „index.tpl“ des Kind-Themes kopiert und etwas modifiziert. Er überschreibt somit den geerbten Block aus dem Eltern-Theme. Wie zu erwarten ist, wird mit {include file=„frontend/index/footer.tpl“} das Template „footer.tpl“ des Eltern-Themes eingebunden: {extends file="parent:frontend/index/index.tpl"} {\* Footer \*} {block name="frontend\_index\_footer"} <footer class="footer-main"> {block name="frontend_index_footer_container"} {include file="frontend/index/footer.tpl"} {* TODO: footer.tpl not overriding *} {/block} </footer>{/block} Nun möchte ich jedoch, dass meine modifizierte Version von „frontend/index/footer.tpl“ eingebunden wird. Also nicht die Version aus dem Eltern-Theme, sondern die aus dem Kind-Theme. Was muss ich tun, um dies zu erreichen? Mein erster Versuch, das Template „footer.tpl“ des Eltern-Themes in die gleiche Ordnerstruktur des Kind-Themes zu kopieren und an den Anfang der Datei {extends file=‚parent:frontend/index/footer.tpl‘} zu schreiben, schlug fehl. Ergebnis: Es wird weiterhin ausschließlich das Template „footer.tpl“ des Eltern-Themes geladen, das Template „footer.tpl“ des Kind-Themes wird ignoriert. Mein zweiter Versuch bestand darin, das Template „footer.tpl“ im Kind-Theme umzubenennen in „my-footer.tpl“ und an den Anfang der Datei {extends file=‚parent:frontend/index/footer.tpl‘} zu schreiben. Entsprechend habe ich die {include}-Anweisung angepasst: {extends file="parent:frontend/index/index.tpl"} {\* Footer \*} {block name="frontend\_index\_footer"} <footer class="footer-main"> {block name="frontend_index_footer_container"} {include file="frontend/index/my-footer.tpl"} {/block} </footer>{/block} Das hat das Probelm zunächst gelöst. Aber: Ist es wirklich notwendig, das Template umzubenennen? Verstößt dies nicht gegen die Vererbungsrichtlinien? Später wurde ich durch die Umbenennung mit einem Folgeproblem konfrontiert: Nach dem gleichen Prinzip wie oben habe ich aus dem Template „footer.tpl“ des Eltern-Themes den Block namens „frontend_index_footer_menu“ in das Template „my-footer.tpl“ des Kind-Themes kopiert, um die dort enthaltene weitere {include}-Anweisung zu modifizieren. Es soll erreicht werden, dass anstelle von „frontend/index/footer-navigation.tpl“ aus dem Eltern-Theme das modifizierte und nach dem gleichen Prinzip wie oben ebenfalls umbenannte Template ‚frontend/index/my-footer-navigation.tpl‘ aus dem Kind-Theme geladen wird: [code] {extends file=‚parent:frontend/index/footer.tpl‘} {* Footer menu *} {block name=‚frontend_index_footer_menu‘}

{include file=‚frontend/index/my-footer-navigation.tpl‘}

{/block} [/code] Ergebnis: Es wird eine Fehlermeldung ausgegeben, dass ‚frontend/index/my-footer-navigation.tpl‘ nicht gefunden wurde. Die Smarty-Template-Engine sucht das Theme in der Ordnerstruktur des Parent-Themes, nicht jedoch in der Ordnerstruktur des Kind-Themes. Wie wird erreichet, dass ‚frontend/index/my-footer-navigation.tpl‘ aus dem Kind-Theme geladen wird? Gibt es analog zur objektorientierteren Programmierung ein Schlüsselwort wie „this“ mit einem Zeiger zum eigenen Objekt, also beispielsweise: {include file=‚this:frontend/index/my-footer-navigation.tpl‘}? Vielen Dank für jede Hilfe!

Hallo! Wenn ich dich richtig verstanden habe, willst du diesen einen Block einfach überschreiben. Dazu musst du allerdings nichts in dem Theme ändern, aus dem du dein neues Theme ableitest (sonst könntest du deine Änderungen auch direkt dort vornehmen und bräuchtest kein neues Theme abzuleiten). Wenn du ein Theme abgeleitet hast, musst du wie in deinem ersten Versuch die Ordnerstruktur rekonstruieren und die entsprechende Datei, in der der Block liegt, erstellen. In dieser Datei gibst du quasi den Befehl, den Block zu überschreiben, d.h. Shopware liest zuerst das übergeordnete Theme aus und schaut dann in deinem Theme nach Änderungen (die dann schließlich angezeigt werden). Dazu schreibst du in deine neue *.tpl zunächst, dass es das übergeordnete Theme erweitert, und dann, welcher Block genau bearbeitet werden soll: {extends file='parent:frontend/index/index.tpl'} {block name='frontend\_index\_footer'} ... {/block} In diesem Fall wird der gewählte Block frontend_index_footer komplett überschrieben, mit den attributen prepend oder append kannst du aber auch Inhalte einfach vor- oder hinter den ausgwählten Block ergänzen. Genau kannst du dir das aber auch im Getting started with Shopware 5 templating-Tutorial ansehen! Ab “Selecting Themes” wird es für dich richtig interessant. Um noch einmal genau auf deine Fragen einzugehen: 1. Folge den Anweisungen aus dem Tutorial (oder meinen) 2. Du solltest nichts im Template umbenennen. Spätestens beim nächsten Update sind deine Änderungen dann wieder gelöscht bzw. werden nicht angezeigt, weil die Verlinkung nicht mehr stimmt. 3. Die Datei, die in deinem abgeleiteten Theme liegt, sollte genaus heißen, wie die im übergeordneten Theme. Dann wird die Datei auch von Shopware erkannt und entsprechend verarbeitet. Gruß! P.S.: Damit das ganze funktioniert, musst du dein abgeleitetes Theme im Theme-Manager aktiviert haben.

Hallo eXsiLe, danke für Deine Antwort. Nur löst sie mein Problem nicht. Es ging mir um die Smarty 3 {include}-Statements. Wie kann ich erreichen, dass das Template im {include}-Statement nicht im Eltern-Theme, sondern im Kind-Theme gesucht wird?

Hallo Thorsten, in dem Fall würde ich den {include} Befehl an einen Block im Template anheften. Wenn du beispielsweise einen bestimmten Inhalt vor dem Footer realisiern möchtest, so: {extends file='parent:frontend/index/index.tpl'} {block name='frontend\_index\_footer' prepend} {include file='xyz.tpl'} ... {/block} Eine statische Shopseite kannst du einfach in den Ordner custom von deinem Theme legen und diese dann im Backend einbinden. Dazu erstellst du die Seite und gibst unter Tpl.-Variable 1 an, wo der Inhalt angezeigt werden soll (sContent) und unter Tpl. Pfad 1 den Pfad zur Template Seite (bspw. frontend/custom/xyz.tpl). Gruß!

1 Like

Update: Der aktuelle Stand ist, dass die Vererbung im Zusammenhang mit Smarty 3 {include} - Statements auf einer gleichen Installation unter Mac OSX funktioniert, unter Windows hingegen bekommt die VM nicht mit, wenn sich Dateien geändert haben. Scheint ein Caching-Problem der VM zu sein. Ist ein solches Problem bekannt?

Gibt es dazu schon Lösungen, habe das gleiche Problem.

Ähnliches Problem hier. Gibt es dafür keine Lösung? :frowning: