Smarty Blöcke verschieben in .tpl-Dateien

Hallo, 

gibt es eine Möglichkeit Smarty-Blocks innerhalb einer .tpl-Datei zu verschieben und dabei den Namen des Blocks beizubehalten?

Einfaches Beispiel - Verschieben der Breadcrumbs:

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

{* leere Block zunächst, damit dieser an seinem ursprünglichen Ort nicht mehr angezeigt wird *}
{block name='frontend_index_breadcrumb'}{/block}

{block name='frontend_index_navigation'}
    {$smarty.block.parent}

    {* erstelle mir einen neuen breadcrumbs-block *}
    {block name='frontend_index_breadcrumb_verschoben'}
        {if count($sBreadcrumb)}
            
                {block name='frontend_index_breadcrumb_inner'}
                    {include file='frontend/index/breadcrumb.tpl'}
                {/block}
            
        {/if}
    {/block}
{/block}

Möchte beispielsweise nun ein Plugin auf die Breadcrumbs zugreifen, kennt dieses natürlich den neuen Block nicht und greift auf den alten Block. Schöner wäre eine Lösung des Verschiebens, bei welchem der Name des Block unverändert bleibt.

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

{* leere Block zunächst, damit dieser an seinem ursprünglichen Ort nicht mehr angezeigt wird *}
{block name='frontend_index_breadcrumb'}{/block}

{block name='frontend_index_navigation'}
    {$smarty.block.parent}

    {* der Name des Blocks bleibt hier gleich. Smarty.block.parent könnte dann auch funktonieren *}
    {block name='frontend_index_breadcrumb'}
        {$smarty.block.parent}
    {/block}
{/block}

Das Resultat dieser Bearbeitung ist jedoch, dass der Block nicht mehr angezeigt wird, da er oben geleert wird. Leere ich diesen nicht oben, werden die Breadcrumbs typischerweise doppelt angezeigt.

 

Gibt es eine schöne Lösung für ein solches Problem?

 

 

 

 

Mit der smarty capture function den Inhalt des Blocks vor dem Leeren zwischenspeichern und woanders wieder ausgeben:

http://www.smarty.net/docs/en/language.function.capture.tpl

Hallo @d.coder‍,

danke für deine Antwort. Beim Zwischenspeichern mit capture sehe ich aktuell nur den Vorteil den Inhalt des Blocks zu speichern. Der ist mir egal. 

Mir geht es darum den namen des Blocks, also 

name='frontend_index_breadcrumb'

unbedingt zu erhalten, da andere Plugins an dieser Stelle ansetzen wollen. Kopiere ich allerdings einen Block, kann ich dessen Namen nicht mehr verwenden.

Laut smarty forum: The order of parent {block} tags can’t be changed.

http://www.smarty.net/forums/viewtopic.php?t=23532&sid=687bb9257fa63d0743c8855ba6cb528f

 

Jepp, das habe ich befürchtet. Vll. gibt es ja einen Workaround?!

Ich weiß nicht ob das weiterhilft, aber ich habe so ein ähnliches Problem im Warenkorb, das ich die Gesamtsumme am Ende und nicht in der Mitte anzeigen möchte.

Dazu “capture” ich die einzelnen Unterblöcke und definiere den Cart-Footer in der Reihenfolge neu.

Da der Card-Footer aber den UL definiert und der somit doppelt vorhanden wäre, muss ich den eigenen Block auch noch “capturen”.

Hier mein Code, vielleicht hilft das weiter bzw. gibt neue Denkanstöße:

{extends file='parent:frontend/checkout/cart_footer.tpl'}

{block name='frontend_checkout_cart_footer_field_labels_sum'}
    {capture name="basketsum"}
        {$smarty.block.parent}
    {/capture}
{/block}

{block name='frontend_checkout_cart_footer_field_labels_shipping'}
    {capture name="shippingcost"}
        {$smarty.block.parent}
    {/capture}
{/block}

{block name='frontend_checkout_cart_footer_field_labels_totalnet'}
    {capture name="totalnet"}
        {$smarty.block.parent}
    {/capture}
{/block}

{block name='frontend_checkout_cart_footer_field_labels_taxes'}
    {capture name="taxes"}
        {$smarty.block.parent}
    {/capture}
{/block}

{block name='frontend_checkout_cart_footer_field_labels_total'}
    {capture name="totalsum"}
        {$smarty.block.parent}
    {/capture}
{/block}

{block name='frontend_checkout_cart_footer_field_labels'}
    {* Parent capturen, damit nichts ausgegeben, aber die Unterblöcke gerendert werden *}
    {capture name="footerTotalBlock"}
        {$smarty.block.parent}
    {/capture}

    
        {$smarty.capture.basketsum}
        {$smarty.capture.shippingcost}
        {$smarty.capture.totalnet}
        {$smarty.capture.taxes}
        {$smarty.capture.totalsum}
    
{/block}

Die Update Sicherheit innerhalb der Blöcke ist somit hergestellt. Sollte irgendwann im “frontend_checkout_cart_footer_field_labels” Block in der Basis (Bare-Theme) ein neuer Block hinzukommen, fehlt der natürlich.