2015-07-14 6 views
5

Ich möchte die Reihenfolge der übergeordneten Blöcke in einer untergeordneten Vorlagen ändern, während Sie den Inhalt der übergeordneten Blöcke verwenden.Smarty-Vorlagen: Wie ändert man die Reihenfolge der Blöcke in der untergeordneten Vorlage?

Beispiel:

Mutter Vorlage:

{block outer} 
    {block a} ... some long content ...{/block} 
    {block b} ... some long content ...{/block} 
    {block c} ... some long content ...{/block} 
{/block} 

Kind Vorlage:

{extends file="parent:parent.tpl"} 
{block outer} 
    {block c} reuse content of parent block "c" {/block} 
    {block b} reuse content of parent block "b" {/block} 
    {block a} reuse content of parent block "a" {/block} 
{/block} 

I versucht mit {$smarty.block.parent} Inneren Block a, b und c:

{extends file="parent:parent.tpl"} 
{block outer} 
    {block c} {$smarty.block.parent} {/block} 
    {block b} {$smarty.block.parent} {/block} 
    {block a} {$smarty.block.parent} {/block} 
{/block} 

In diesem Fall enthält {$smarty.block.parent} den Inhalt des übergeordneten Blocks "outer".

Ist es möglich, den Inhalt der inneren Blöcke a, b und c innerhalb der Kindvorlage zu rendern?

Szenario: Der Inhalt der Blöcke a, b und c ist wirklich komplex und ich möchte vermeiden, den gesamten Inhalt vom Eltern kopieren und einfügen.

+0

Konnte man nicht einfach jeden untergeordneten Block zu einer untergeordneten Vorlage machen, dann einfach eine Vorlage mit der Reihenfolge ABC und eine andere mit CBA – MiltoxBeyond

+0

machen Ich bin mir nicht sicher, ob ich Ihren Vorschlag verstehe. :) Wie auch immer, ich kann die Elternvorlage nicht ändern, da sie Teil von ShopWare ist. – Leif

Antwort

0

Haben Sie versucht, den Namen des übergeordneten Blocks hinzuzufügen?

{extends file="parent:parent.tpl"} 
{block outer} 
    {block c} {$smarty.block.parent.c} {/block} 
    {block b} {$smarty.block.parent.b} {/block} 
    {block a} {$smarty.block.parent.a} {/block} 
{/block} 
+0

Das gibt mir Syntaxfehler: $ smarty.block ist ungültig. Seltsame Fehlermeldung in diesem Fall. – Leif

0

Sie können Blöcke als separate tpl-Dateien definieren und sie in beliebiger Reihenfolge einschließen. Oder Sie können Blöcke als Array von PHP-Skript übergeben und in beliebiger Reihenfolge verwenden.

In Vorlage Vererbungsblocks nur Orte definieren, die Sie ändern können.

+0

Vielen Dank für Ihren Vorschlag, aber wie ich in meinem vorherigen Kommentar erwähnt habe, kann ich die Elternvorlage nicht ändern, weil sie Teil von ShopWare ist. Vielleicht ist es mit dieser Template-Struktur einfach nicht möglich. – Leif

0

Ziemlich altes Thema, aber ich habe das genau gleiche Problem und keine Ahnung, wie es noch zu lösen. Ich habe auch versucht, smarty.block.parent mit dem gleichen Ergebnis zu verwenden.

Haben Sie bereits ein Muster gefunden, das dieses Problem löst?

+0

Leider nein. Ich habe diese großen Schablonenteile kopiert. – Leif

+0

gleich hier - wow das ist scheiße ... – fbtb

1

Obwohl dies ein alter Beitrag ist, könnte dies für die Zukunft wichtig sein.
Mein bester Versuch, dieses Problem zu lösen, ist die folgende:

{extends file="parent:parent.tpl"} 

{block a} 
    {capture a} 
     {$smarty.block.parent} 
    {/capture} 
{/block} 

{block c} 
    {capture c} 
     {$smarty.block.parent} 
    {/capture} 
{/block} 

{block b} 
    {$smarty.capture.c} 
    {$smarty.block.parent} 
    {$smarty.capture.a} 
{/block} 
0

ich uppon diese sehr alte Frage stumpled. Ich habe ein ähnliches Problem, ändere die Reihenfolge von {block} ohne Zugriff auf das übergeordnete Thema und ohne den ganzen {Block} zu kopieren.

Ich fand eine kleine Abhilfe dafür.

Beispiel: Elternteils theme's Datei: frontend/index/index.tpl mit Blöcken

Erweiterung der Datei

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

den Block verlauf

{block name="header"} 
    {* define a function with a similar name as the block *} 
    {function name="block__header"} 
     {* define a new block, so you can extend your own block *} 
     {block name="my_header"} 
      {*call parent block to inherit the content *} 
      {$smarty.block.parent} 
     {/block} 
    {/function} 
{/block} 

den Block

{block name="footer" prepend} 
    {call name="block__header"} 
{/block} 

Hinweis bewegen: Wenn Sie die {block name="header"} erweitern später, Ihre erweiterten Inhalte werden auf der ursprünglichen Position angezeigt werden, wobei der ursprüngliche Block war. Um es zu erweitern, verwenden Sie {block name="my_header"}.

In Shopware können Sie protected $injectBeforePlugins = false; in Ihrem Theme.php verwenden, als Sie Plugins Inhalt überschreiben können.

Es ist auch möglich, capture anstelle von function zu verwenden, aber ich dachte {call name="block__header"} ist besser lesbar als {$ block_header}.

Ich habe die Funktion als Snippet in meinem Editor definiert, so dass ich nicht mehr alles neu eingeben muss.

Nochmal: Entschuldigung für die Beantwortung einer so alten Frage, aber ich dachte, es könnte für andere nützlich sein.

Verwandte Themen