best practice - Plugin Block wählen und überschreiben

Moin, ich kann es schlecht im Satz erklären und würde gern wissen ob es eine bessere Praxis gibt hierzu:

Was will ich erreichen : Der User soll sich im Plugin aussuchen welchen hinterlegten Block er überschreiben will.

Wie ich es bisher löste : In der createConfig() ein select-box mit mehrere Blocknamen hinterlegt. Anschliessend im Template die Blöcke eingepflegt und innerhalb eine If/else Frage und je nachdem entweder Block überschrieben oder smarty.block.parent returnt.

{block name="a"}
 {if $config->blockA}
   überschreiben
 {else}
   {$smarty.block.parent}
 {/if}
{/block}

{block name="b"}
 {if $config->blockB}
   überschreiben
 {else}
   {$smarty.block.parent}
 {/if}
{/block}

Danke und Gruss

[EDIT: Block-Model vereinfacht]

[EDIT2: Was ich verhinder will ist eigentlich, dass ich jedes mal “überschreiben” Code mehrmals drin habe.]

Hallo,

 

ein bisschen mehr Kontext wäre nett. So ist es nur ein Schuss ins Blaue. Außerdem frage ich mich sowieso, für welchen Anwendungsfall man das braucht. Logik kommt normalerweise in den Controller, nicht in die View. Die View zeigt normalerweise nur Daten an, die sie übergeben bekommt. Dein Vorhaben widerspricht also pauschal gesagt dem MVC Pattern.

 

 

MFG

 

derwunner

Moin, genau das denke ich auch, und bin auf eine andere Lösung gespannt. Ich benötige das im Footer. Ein neuer Block soll dort eingefügt werden und einen alten überschreiben. Der Pluginuser soll selbst entscheiden welcher der 4 Blöcke überschrieben werden soll. @derwunner‍

Ok, dann gibt es mehrere Möglichkeiten. Ganz sauber ist aber keine davon.

Möglichkeit 1: Definiere eine eigene Smarty Funktion, die Du um alle vier Blöcke packst. Diese Funktion liest dann die Config ein und weiß welcher Block überschrieben werden muss.

Möglickeit 2: Benutze dafür JavaScript, zum Beispiel eine Angular Direktive oder einen (hässlichen) jQuery Selector.

Möglichkeit 3: Es gibt die Möglichkeit im Plugin Controller einzelne Smarty Blöke zu rendern. Das heißt Du prüfst bereits im Controller ab, welcher Block überschrieben werden soll und ersetzt den durch den neuen Inhalt des eben gerenderten Blocks. Glaube es gibt eine $template->setBlock Methode in Smarty. Auf jeden Fall weiß ich, dass es so prinzipiell möglich ist. Hoffe, ich konnte diese Möglichkeit verständlich erklären… ^^

Edit: Mir ist noch eine 4. Möglichkeit eingefallen: Schreibe für alle Blöcke, die überschrieben werden können in jeweils eigene kleine Templates, die sich vom Basis Template vererben und nur den einen Block XY überschreiben. Dann musst Du nur noch anhand der Config im Controller das richtige Überschreibungstemplate einbinden via $this->View()->setTemplate(). Denke das ist die sauberste Lösung.