Gegenseitiges Überschreiben von Smarty-Blöcken verhindern

Liebes Forum :slight_smile: :slight_smile:

ich möchte die Auflistung der Einkaufswelten auf der Home-Seite verändern. Das geht in home/index.tpl in dem Block „frontend_home_index_promotions“. Das habe ich in einem Plugin gemacht und es funktioniert auf der homeseite wie gewünscht.
Aber: Die Landingpage verwendet für seine Einkaufswelt den gleichen Block (in campain/index.tpl, die wiederum auf home/index.tpl extended). Das Plugin überschreibt also auch den Block „frontend_home_index_promotions“ der Landingpage, und diese funktioniert dann nicht mehr.

Was mache ich denn da falsch und wie kann man das gegenseitige Überschreiben verhindern?

Liebe Grüße
 

Kerstin

Hi,

grundsätzlich kannst du mit „controllerName“ im Template rausfinden, ob du bspw. auf der „index“ oder „campaign“-Seite bist.

Allerdings glaube ich, dass du hier generell irgendwo falsch abgebogen ist, wenn du einfach in einem eigenen Template eine Datei „frontend/home/index.tpl“ anlegst und sowas machst, greift das auch nur auf der jeweiligen Seite:

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

{block name='frontend_home_index_promotions' prepend}

    MEINE ÄNDERUNG


{/block}

Ich schätze, dass du noch mit „extendsTemplate“ in deinem Plugin arbeitest - dann kann sowas passieren.

Besten Gruß,

Daniel

1 „Gefällt mir“

Vielen Dank für die Antwort. Die Sache mit dem Controller hatte ich mir als Notlösung auch schon überlegt, ich dachte aber es sollte auch anders gehen. So richtig schön ist das ja nicht.

Ich schätze, dass du noch mit „extendsTemplate“ in deinem Plugin arbeitest 

_ Noch _, im Sinne von „das macht man so nicht mehr“ ? Dann würde ich gerne wissen, wie man es jetzt macht.

Liebe Güße

Kerstin

 

Siehe Shopware 5 Plugin update guide

Viele Grüße

1 „Gefällt mir“

aja, vielen Dank. Das muss ich mir in Ruhe zu Gemüte führen.

Viele Grüße

Kerstin

@Kerstin83 schrieb:

aja, vielen Dank. Das muss ich mir in Ruhe zu Gemüte führen.

Viele Grüße

Kerstin

Hallo,

kurz und knapp:

seit Shopware 5 soll man kein extendsTemplate() mehr nutzen, da dies das Überschreiben der Plugin-Templatedateien verhindert. Du musst also einfach den extendsTemplate()-Befehl weglassen und die Templatedateien exakt so ablegen (in dem Pfad), wie Sie im Bare-Theme abgelegt wurden und dann dort eben die entsprechenden Blöcke, die du anpassen möchtest, ändern.

Beispiel:

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

{block name="frontend_detail_index_detail"}
    {include file="frontend/swag_example1/detail_extension.tpl"}
{/block}

Sozusagen legst du die Datei „index.tpl“ in deinem Plugin unter „Views/frontend/detail“ ab. Es erbt dann durch die gleiche Struktur automatisch.

Beste Grüße

Sebastian

 

1 „Gefällt mir“

Ganz vielen Dank für die Kurzform :slight_smile: :slight_smile:

Werde ich dann einmal versuchen und nochmal berichten.

Viele Grüße

Kerstin

hmmm… also ganz so einfach scheint es doch nicht zu sein. Folgendes scheint nicht zu funktionieren:

Bootstrap.php:

    public function onPostDispatchFrontend(Enlight_Event_EventArgs $arguments)
   {

        $view            = $arguments->getSubject()->View();
        $view->addTemplateDir ($this->Path() . ‚Views/‘);

   }

Views/frontend/index/index.tpl:

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

… block…

Das funktioniert so leider nicht (ich habe es mit einem Plugin getestet, das mit extendsTemplate() funktioniert hat).

Liebe Grüße

Kerstin

Hallo,

was funktioniert denn nicht? So ist aber nunmal der Weg und so macht es auch jeder bzw. so ist es ja auch in der Doku. Am besten du postest einmal den kompletten Quelltext.

Beste Grüße

Sebastian

So ich habe noch ein bisschen herumprobiert, aber es will nicht klappen.

Es handelt sich um ein Plugin, das dem body eine weitere Klasse anhängt. Zunächst mit extendsTemplate (funktioniert):

Bootstrap.php mit extendsTemplate:

 true,
        'update'  => true,
        'enable'  => true
    );

    private function installSubscribeEvents()
    {
        $this->subscribeEvent(
            'Enlight_Controller_Action_PostDispatch_Frontend',
            'onPostDispatchFrontend'
        );
    }

    public function onPostDispatchFrontend(Enlight_Event_EventArgs $arguments)
    {
        $view            = $arguments->getSubject()->View();
        $view->addTemplateDir ($this->Path() . 'Views/');
        $view->extendsTemplate('AddBodyClasses/frontend/index/index.tpl');            
    }

     public function install()
    {
        try
        {
            $this->installSubscribeEvents();
            return array(
                'success'         => true,
                'invalidateCache' => array( "frontend", "backend", "config" ) 
            );
        }
        catch ( Exception $e )
        {
           return array(
                'success' => false,
                'message' => $e->getMessage()
            );
        }        
    }

    public function uninstall()
    {
         return array('success' => true, 'invalidateCache' => array('frontend'));
    }

}

und in  Views/AddBodyClasses/frontend/index/index.tpl:

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

{block name="frontend_index_body_classes"}
    {$smarty.block.parent} bodyclass
{/block}

So funktioniert das Plugin, es wird an die Klassen im body noch die Klasse bodyclass angehängt.

Jetzt die Version ohne extendsTemplate (funktioniert nicht):

Bootstrap.php ohne extendsTemplate (Rest gleich):

    public function onPostDispatchFrontend(Enlight_Event_EventArgs $arguments)
    {
        $view            = $arguments->getSubject()->View();
        $view->addTemplateDir ($this->Path() . 'Views/');
     }

und die gleiche index.tpl wie oben liegt unter und in  Views/frontend/index/index.tpl

Eigentlich, wie du gesagt hast. Funktioniert aber nicht :frowning: (d.h., es wird keine Klasse angehängt).

Versucht habe ich es auch mit dem Pfad Views/responsive/frontend/index/index.tpl und ich habe es auch ohne der Zeile  $view->addTemplateDir ($this->Path() . ‚Views/‘); getestet. Und verschiedenes anderes. Funktioniert aber alles nicht.

Vielleicht fällt euch der Fehler auf.

Liebe Grüße

Kerstin

Hallo,

auf jeden Fall ist es nicht mehr erlaubt, extendsTemplate zu nutzen (siehe unter anderem Daniel).

Der Code sieht erst einmal richtig aus (also der ohne extendsTemplate) und müsste auch so funktionieren.

Du hast also deine Ordnerstruktur so: keAddBodyClasses/Views/frontend/index/index.tpl ?

Hast du einmal geprüft, ob nicht ein anderes Plugin oder dein Theme selbst deine Klasse wieder überschreibt (das erste geladene Plugin ist ja primär und auch das Theme vererbungsmäßig an letzter Stelle)?

Hast du einmal:

protected $injectBeforePlugins = true;

in deiner Theme.php auf false gesetzt, damit das Theme die Plugins nicht überschreibt (um dies auch auszuschließen)? Auf jeden Fall müsste das genau so klappen, kann also bei dir nur an einem anderen Plugin liegen (das auch den Block anpasst) oder an deinem Theme (das den Block anpasst).

Beste Grüße

Sebastian

Ich habe es jetzt mal in einem ganz neuen shop versucht - ohne eigenes theme, ohne plugins. Aber: das gleiche.

Könntest du bitte einmal mein Plugin testen? Der Code müsste ja so wie er ist funktionieren, irgendetwas ist aber falsch :frowning:

Hallo, ich kannte das auch noch nicht und habe das eben getestet. Auch bei mir klappt es nur in der Version mit extendsTemplate. Scheint also noch etwas anderes zu sein. Ich habe shopware 5.1.2

Es würde mich auch mal interessieren…

Beste Grüße