erweiterte Funktionen bzw. Benutzung von Smarty Blöcken

Hallo,

ich habe ein paar Fragen zu der erweiterten Benutzung von Blöcken in Smarty. Leider beantworten sich meine Fragen nicht anhand der Dokumentation.

  1. Blöcke vertauschen in abgeleiteten Templates ist nicht möglich. Beispiel:

parent.tpl:

{block name="A"}
    Inhalt Block A
{/block}
{block name="B"}
    Inhalt Block B
{/block}
{block name="C"}
    Inhalt Block C
{/block}

child.tpl:

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

{block name="B"}
    Überschriebener Inhalt von Block B
{/block}

{block name="A"}
    Überschriebener Inhalt von Block A
{/block}

Warum geht das so nicht?

Ich hatte mich bisher immer damit beholfen, alles aus dem Basis Template zu kopieren und es in mein Template einfügen. Somit hatte man keine Ableitung mehr, daraufhin war das Blöcke vertauschen möglich.

Auch interessant dazu: Blöcke auslassen, die man nicht überschreiben möchte ist möglich, nur die Reihenfolge muss intakt bleiben.

  1. Blöcke überschreiben in der n-ten inkludierten Ebene:

Mir war es nicht möglich, Blöcke aus der 3. inkludierten Ebene zu überschreiben. Dazu ein aktuelles Fallbeispiel:

frontend/listing/listing.tpl:

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

{block name="frontend_index_content_wrapper" append}
    {* ging nicht *}
{/block}

 

Mir war es ebenfalls nicht möglich in dem oben gezeigten Beispiel einen neuen Block in diesem abgeleiteten Template einzufügen. Was sehr komisch ist, schließlich sollte das gehen. Hatte ich jedoch den Block durch einen vorhandenen ausgetauscht und meinen Inhalt angehängt, dann ging es. Weiß hier vielleicht jemand warum das so war?

 

Für Hilfe und/ oder Erfahrungsaustausch wäre ich dankbar.

 

 

MFG

 

derwunner

Hallo @derwunner‍,

vielleicht kann ich dir hier ein wenig aushelfen.

Vorab: Tut mir Leid, falls ich eine Aussage falsch verstanden habe und entsprechend falsch antworte.

  1. Die Reihenfolge der Blöcke, die du überschreibst, ist eigentlich vollkommen egal.
    Das habe ich gerade auch nochmal getestet - habe da absolut keine Probleme und kann die Blöcke verschieben wie ich lustig bin.
    Blöcke werden problemlos überschrieben, unabhängig von der Position.

  2. Der von dir genutzte Block existiert in der Datei nicht. Die Datei selbst leitet auch von keinem anderen Template ab, welches diesen Block besitzen würde.
    So funktioniert das in der Tat nicht und hat erstmal nichts mit der „3. inkludierten Ebene“ zu tun.
    Wenn du in diesem Beispiel jedoch von frontend/listing/index.tpl ableiten würdest, funktioniert es.

Davon abgesehen:
Wenn du von einem Template ableitest, kannst du definitiv außerhalb der vorhandenen Blöcken keine neuen Blöcke oder neuen HTML-Code hinzufügen.
Sobald du also von einem Template ableitest, kannst du nur die bereits vorhandenen Blöcke des abgeleiteten Templates bearbeiten.

Hilft dir das ein wenig weiter?  Smile

Gruß,
Patrick  Shopware

Ich glaube bei Punkt 1 ging es Ihm eher darum, dass man die Reihenfolge der Blöcke nicht verändern kann. (Auch die Reihenfolge in der Ausgabe im Frontend)
Was tatsächlich nicht funktioniert. Vermutlich eben deshalb, weil man, wie du gesagt hast, die Blöcke unabhängig von der Reihenfolge in der Datei ändern / überschreiben kann.

Die die Reihenfolge der Blocke müsste man ändern können, wenn man den übergeordneten Block überschreibt und DARIN die Blöcke (auch benannt und vollständingen Inhalt) neu anordnet. Der Block selber ist ja nur ein Container, dessen Anordnung selber ein Element vom übergeordneten Container ist. 

Ja genau, das was @iLuHa‍ schrieb meinte ich. Ich will die Blöcke im abgeleiteten Template vertauschen, um die Anordnung der HTML Elemente zu verändern. Zum Beispiel Footer über Header. Was zwar keinen Sinn ergeben würde, aber ich denke damit ist klar erklärt, was ich meine.

Und in abgeleiteten Templates keine neuen Blöcke definieren zu können, ist Quatsch. Sonst würde man ja nach index.tpl nichts mehr sehen.

@derwunner schrieb:

Und in abgeleiteten Templates keine neuen Blöcke definieren zu können, ist Quatsch. Sonst würde man ja nach index.tpl nichts mehr sehen

Vielleicht habe ich mich ein wenig falsch ausgedrückt, aber dennoch ist folgende Aussage ein Fakt:
In einem abgeleiteten Template werden sämtliche Zeilen, seien es Smarty-Blöcke oder reines HTML, ignoriert, die außerhalb von bestehenden Blöcken liegen.

Ein kleines Beispiel dazu:
 

// Parent.tpl
{block name="A"}
   Mein Inhalt
{/block}

// Child.tpl
{extends file='parent:parent.tpl'}

{block name="A"}
   Das hier funktioniert.

   {block name="B"}
      Das hier auch.
   {/block}
{/block}

{block name="C"}
   Das hier nicht!
{/block}

Und das hier auch nicht.

Vielleicht ist der “Quatsch” damit besser erklärt.  Thumb-Up

[@Patrick Stahl](http://forum.shopware.com/profile/1869/Patrick Stahl “Patrick Stahl”)‍ Ok, sorry, da scheine ich etwas verwechselt zu haben. Bei Twig ging das auf jeden Fall, das weiß ich.

Also zusammenfassend lässt sich sagen, dass die Block Reihenfolge erhalten bleiben muss, das heißt alle äußeren Blöcke müssen im vererbten Template in derselben Reihenfolge auftauchen. Es ist im vererbten Template auch nicht möglich Blöcke zu ergänzen. Das einzige was man vertauschen kann, sind innere Blöcke, wenn man den umschließenden Block überschreibt. In einem inkludierten Template Blöcke von dem umliegenden Template zu überschreiben geht auch nicht. Korrekt?

Ich kenne mich leider nicht mit Twig aus, um das bewerten zu können.

Deine Zusammenfassung klingt soweit erstmal richtig, ja.
Lediglich deinen ersten Satz finde ich etwas verwirrend.
Du kannst die Blöcke im einem vererbten Template platzieren, wie du willst - also von der Reihenfolge her.
Das Ergebnis bleibt das Gleiche: Die Blöcke werden in dem Fall durchaus überschrieben, die Reihenfolge der Ausgabe im Frontend ändert sich jedoch nicht.

Du kannst die Reihenfolge der Blöcke jedoch dann ändern, wenn du den umschließenden Block überschreibst - korrekt.

Ok ja, das klärt meine Frage, danke! :slight_smile: