Smarty Blöcke verschieben / AGB an Seitenende verschieben

Hallo zusammen,

Ich würde gerne in der Checkout-Confirmation die AGB Bestätigung an das Seitenende verschieben. Allerdings mißfällt es mir sehr dafür das gesamte /checkout/confirm.tpl zu überladen. Ich würde es schöner finden, wenn ich lediglich die Blöcke ohne Inhalte umsortieren könnte und die Inhalte automatisch geerbt werden.

Kennt hier vielleicht jemand einen Kniff?

Danke & LG

Genau so soll man es ja auch machen:

https://developers.shopware.com/designers-guide/

Vielleicht war die Frage nicht klar formuliert…
Inheritance ist klar. Es geht lediglich darum wie man die REIHENFOLGE der Blöcke innerhalb eines Templates ändern kann, ohne den gesamten Markup in das neue Template zu übernehmen, um hier bei Updates auf der sicheren Seite zu sein.

Das Ändern von Inhalten einzelner Blöcke durch Vererbung ist nicht das Thema.

Danke & LG

REIHENFOLGE

Achso.

Ja, da ist man an den Grenzen des Systems… Mir ist nichts bekannt. I

ch versuche immer mit less die Positionen zu ändern (ein float:right; ändert ja u.U. die Reihenfolge aller Elemente einer „Zeile“), aber auch mit positioning und margins und guten Kommentaren drumherum kann man ab und zu was erreichen. Wenn es jedoch zu viel gefrickel wird, dann opfer ich lieber etwas Update-Sicherheit gegenüber der Übersichtlichkeit.

CSS gefällt mir nicht wirklich als Lösung - ist ja nur ein Workaround und eigentlich ein falsches Werkzeug.
Ich kann nicht glauben, dass die Smarty Inheritance keine Option bietet, einfach den Inhalt des Parent-Blocks auszugeben. Ich dachte es wäre mit smarty.block.parent möglich, allerdings bezieht sich das offenbar auf den übergeordneten Block des aktuellen Templates und nicht auf den “echten” Parent.

{extends file="parent:frontend/checkout/confirm.tpl"}

{block name='frontend_index_content'}
    

        {* Error messages *}
        {block name='frontend_checkout_confirm_error_messages'}
            {$smarty.block.parent}
        {/block}

        {* Product table *}
        {block name='frontend_checkout_confirm_product_table'}
            {$smarty.block.parent}
        {/block}

        {* Confirm form *}
        {block name='frontend_checkout_confirm_form'}
            {$smarty.block.parent}
        {/block}

    
{/block}

 

Daran bin ich auch verzweifelt … irgendwann habe ich aufgegeben und es per JavaScript gelöst (ja, ich weiß, ist auch nicht schön):

if (($('.tos--panel')) && ($('#hecomm-tos-at-bottom'))) {
    var tosPanel = $('.tos--panel').detach();
    $('#hecomm-tos-at-bottom').replaceWith(tosPanel);
}

Falls du eine schöne Lösung findest, gib bitte Bescheid.

Danke und Grüße,
Sven

Undecided
Nein, bisher nichts rausgefunden. Nur das smarty.block.parent nicht funktioniert wie erwartet, sondern den gesamten Inhalt des Parent Templates zurückliefert (nicht nur den Block). Also entweder es hat da einen Smarty Bug oder es liegt an der Vererbungsstruktur über mehrere Themes. Jedenfalls wäre smarty.block.parent genau für diesen Zweck gedacht…

Hab dazu auch einen Thread bei Stackoverflow gefunden - leider auch ohne Lösung:
http://stackoverflow.com/questions/31413283/smarty-templates-how-to-change-the-order-of-blocks-in-child-template

Habt ihr eine Lösung gefunden? Würde auch gerne die AGB direkt über den Bestellbutton schieben.

Haben wir auch gerade versucht mit der capture-Methode aus dem stackoverflow Link, leider funktionert es nicht wirklich.

Einzige unschöne Lösung auf Template-Ebene momentan wäre, das Originaltemplate nicht zu beerben sondern ganz zu überschreiben.

Gibt’s denn keine vernünftige Lösung?

Das Problem ist, dass die checkbox nicht in einem eigenen block ist und dass sich das Formular nicht erst am Ende der Seite schließt.

Blöcke verschieben funktioniert aber - am Beispiel des submit Buttons im Filter - so: https://dpaste.de/qaxJ

Viele Grüße

Einzige Lösung ist aktuell das gesamte Template zu überladen und nicht nur Blöcke zu ersetzen… 

Die angegeben Methode mit {capture} funktioniert theoretisch schon.

Ich habe einen workaround, habe diesen auch mal bei stackoverflow gepostet, der komplettheit halber aber auch noch mal hier, mit direktem Bezug auf Shopware.
Ein direktes callen der blöcke ist danach immernoch nicht möglich, aber man muss nicht das gesamte markup kopieren.

Als Beispiel nutze ich hier die frontend/listing/index.tpl, dort soll der banner verschoben werden.

{extends file="parent:frontend/listing/index.tpl"}

{*
	erbe den block, der verschoben werden soll
	und gebe ihm ein paar zusätzliche funktionen
*}
{block name='frontend_index_breadcrumb'}
	{* definiere eine funktion, die genauso heißt wie der block, um sie später wieder zu finden*}
	{function name="block__frontend_index_breadcrumb"}
		{* definiere einen inneren block, um an anderen stellen von hier zu erben *}
		{block name='frontend_index_breadcrump_caller'}
			{* call parent block *}
			{$smarty.block.parent}
		{/block}
	{/function}
{/block}

{*
   der banner soll hinter die topseller
*}
{block name="frontend_listing_index_topseller" append}
    {* rufe die funktion auf *}
	{call name="block__frontend_listing_index_banner"}
{/block}

Achtung! wenn an späterer stelle nocheinmal der block frontend_listing_index_banner aufgerufen wird (in plugins z.B.) wird der Inhalt an der ursprünglichen Stelle dargestellt. Um an der neuen Stelle darzustellen, muss der neue block genutzt werden.

Dazu müsste in der Theme.php protected $injectBeforePlugins = false; gesetzt werden, dann kann man die Plugin templates überschreiben, und das plugin anweisen einen anderen block zu nutzen.