Smarty Security umgehen? Variablen in Templates

Was ich vorhabe: in meinem Plugin einen Eintrag in der Account-sidebar/menü anzeigen, aber nur wenn bestimmte User-eigenschaften gelten. Dafür greife ich auf Shopware()->Config() zu und auch auf die sUserData, die aus Shopware()->Modules()->Admin() kommen.

Nun ist das Problem, dass die Sidebar ja in unterschiedlichen Kontexten geladen wird und einige Controller setzen die entsprechenden Variablen nicht, z.B. Note / Merkzettel, so dass dort mein Template-block nicht auf die User-settings zugreifen kann.

Um das zu umgehen dachte ich, setze ich halt die Variablen direkt im Template: {assign “Shopware” Shopware()} {assign “admin” $Shopware->Modules()->Admin()} usw.

Das wird leider verweigert mit dem Kommentar: PHP function ‘Shopware’ not allowed by security setting. Kann ich die Security-settings irgendwie pimpen von meinem Plugin aus bzw. für mein Plugin? Im Controller darf ich ja auch aufrufen, wozu ich gerade Lust habe, ohne dass irgendwer den Blockwart spielt.

Wie löst Ihr sonst das Problem mit Template-schnipseln, die an allen möglichen Stellen vom Shopware geladen/angezeigt werden? Wie greift Ihr da auf User-daten zu?

Hallo,

wieso benutzt du in deinem Plugin nicht ein späteres Event beispielsweise “Enlight_Controller_Action_PostDispatchSecure_Frontend”
um deine benötigen Variablen an die View weiterzugeben?
 

Grüße Lukaschel

1 Like

Hm, das Problem ist ja nicht so sehr, in welcher Methode ich die Variablen setze, sondern dass das Sidebar-template eben auch in anderen Views/Controllern von Shopware geladen wird, und ich da mein erweitertes Template (frontend/account/sidebar.tpl) anzeigen möchte.

D.h. ich habe da ja keinen eigenen Controller, in dem ich eigenen Code ausführen kann.

Ah, ich musste mich zu den Events nochmal einlesen, habe jetzt verstanden, was du meintest.

Ich hänge mich mit einem Subscriber an o.g. Event und kann damit jedem beliebigen Controller Variablen unterjubeln, indem ich mir einfach die View zu dem Event hole: $view = $args->getSubject()->View();

Auf der Shop-hauptseite wird mein Listener für ‘Enlight_Controller_Action_PostDispatchSecure_Frontend’ leider nicht aufgerufen - auf den Account-seiten hingegen schon. Woran kann denn das liegen? Wird das Event da irgendwie abgeklemmt?

Also wenn ich mich an das Event hänge kriege ich sowohl auf der Hauptseite als auch Listings, Artikeldetailsseite mein Ergebnis, hast du den Cache auch mal geleert?
Ich würde auch in der Plugin Main-Datei, (in der auch die build Methode steckt) in der activate / deactivate Methode den Cache leeren wenn du den parent aufrufst wird dieser geleert.

    /**
     * @param ActivateContext $context
     */
    public function activate(ActivateContext $context)
    {
        parent::activate($context);
    }

    /**
     * @param DeactivateContext $context
     */
    public function deactivate(DeactivateContext $context)
    {
        parent::deactivate($context);
    }

 

Hm, mein Plugin überschreibt gar keine Methoden (ist ein “neues” Plugin), d.h. da sollten die Parent-methoden standardmäßig drin sein. Registrieren mache ich über ein SubscriberInterface. Für Account-seiten geht das auch. Cache leere ich eh nach jeder Installation und compiliere - anders bekommt er z.B. JS-änderungen nicht mit.

Momentan ist anderes wichtiger - aber ich schau bei Gelegenheit evtl nochmal tiefer rein.