Globale Variabeln

Hallo zusammen,

ich habe vorhin das Update auf 5.2.2 gemacht, und seid dem werden mir globale Variablen nur noch auf den Checkoutseiten zur Verfügung gestellt. Ist hier etwas bekannt?

 

Unten ist der Code, der bis vorhin noch Einwandfrei funktioniert hat. Angezeigt wird es nur auf den Artikeldetailseiten und Kassenseiten!

 

?php


/**
 * Global Vars Plugin
 */
class Shopware_Plugins_Frontend_Data_Bootstrap extends Shopware_Components_Plugin_Bootstrap
{
    
    
    /**
     * Install plugin method
     *
     * @return bool
     */
    public function install()
    {
        $this->subscribeEvents();

        return true;
    }


    private function subscribeEvents()
    {
        $this->subscribeEvent(
            'Enlight_Controller_Action_PostDispatchSecure_Frontend',
            'onPostDispatch'
        );
    }


    /**
     * @return array
     */
    public function getInfo()
    {
        return array(
            'label' => $this->getLabel()
        );
    }

    /**
     * @return string
     */
    public function getLabel()
    {
        return 'Data';
    }


    /**
     * Event listener method
     *
     * @param Enlight_Controller_ActionEventArgs $args
     */
    public function onPostDispatch(Enlight_Controller_ActionEventArgs $args)
        
    {      

        $view = $args->getSubject()->View();

        $dataID = 123;

        $view->assign('plugin_data_data', $dataID);
    }

}

 

 

 

Was meinst Du mit „globaler“ Variable? Die Template-Variable „plugin_data_data“?

1 „Gefällt mir“

Ja genau, so ist es. Sie wird leider nicht mehr zu jedem Template zur Verfügung gestellt…

Prüfe mal folgende zwei Dinge:

  1. Wird die PostDispatch Methode ausgeführt?
  2. Welches Objekt befindet sich in der $view Variable?

Also die Methode wird ja scheinbar nur auf der Artikeldetailseite und im eingeloggten Zustand auf den Checkoutseiten angezeigt. Auf allen anderen Seiten erscheint die Variabel nicht im Smartydebugger.

Im $args =  Enlight_Controller_ActionEventArgs Object

im $args->view() =  Shopware_Proxies_ShopwareControllersFrontendDetailProxy

Aber ich komme einfach nicht dahinter, wieso das Plugin sonst nicht ausgeführt wird. Ich habe es vom Advancedmenu abgeleitet, da hier ja auch die Varibale $advancedMenu überall verfügbar ist.

 

 

Kann es sein, dass dieser Controller einfach nicht mehr imer aufgerufen wird?

Hast du den HTTP cache aktiviert?

Viele Grüße

Nein, ist er nicht. Werden so verteilte Variabeln mitgechached? Das wäre schlecht… Denn ich ich wollte die aktuellen Benutzdaten abfragen.

Dafür brauchst du auf jeden Fall ein Action Widget - eine einfache Variable reicht da nicht. Schau dir mal diesen Beitrag an: Understanding the Shopware HTTP Cache

1 „Gefällt mir“

Achja… hatte ich erst vor wenigen Tagen gelesen und schon nicht mehr daran gedacht  Grin

Gibt es dazu ein gutes Tutorial? Hab nun auf Anhieb nichts zum Thema Action Widget gefunden…

Ja, den Artikel den Moritz gepostet hat…
https://developers.shopware.com/blog/2015/02/11/understanding-the-shopware-http-cache/?_ga=1.103236352.1260807498.1459844739

Dich dürften die ESI Tags interessieren.

Naja dort wird ja nur erklärt, wie der Chache funktioniert. Verstanden habe ich nun dass ich en Widget brauch, welches vom Chache ausgeschlossen wird, und ich dann jedes mal im Template aufrufen muss, um an die Live-Informationen zu kommen. 

Exakt:

Hello world
Some data which was returned after expensive database lookup
​{action controller=my-controller action=test name=peter}

D.h. Du musst einen Contoller implementieren, der Dir die gewünschten Daten zurückliefert:
https://developers.shopware.com/developers-guide/controller/

Das könnte Dich auch noch interessieren:
https://developers.shopware.com/blog/2016/07/11/on-action-tags/

Hallo nochmal,

irgendwie komme ich nicht weiter. Ich habe bis nun folgendes:

 

class Shopware_Plugins_Frontend_SwagController_Bootstrap extends Shopware_Components_Plugin_Bootstrap
{
    public function getVersion()
    {
        $info = json_decode(file_get_contents( __DIR__. DIRECTORY_SEPARATOR .'plugin.json'), true);
        if ($info) {
            return $info['currentVersion'];
        } else {
            throw new Exception('The plugin has an invalid version file.');
        }
    }

    public function getLabel()
    {
        return 'SwagController';
    }

    public function uninstall()
    {
        return true;
    }

    public function update($oldVersion)
    {
        return true;
    }

    public function install()
    {
        $this->registerController('Frontend', 'SwagControllerTest');

        return true;
    }
}

Front()->Plugins()->ViewRenderer()->setNoRender();
		$userdata = Shopware()->Modules()->Admin()->sGetUserData();
        $eingeloggt = Shopware()->Modules()->Admin()->sCheckUser();
		
        $this->View()->assign('plugin_benutzerDaten_userData', $userdata);
		$this->View()->assign('plugin_benutzerDaten_userEingeloggt', $eingeloggt);	
	}
}

{* Extend the base template to get the header, navbar etc *}
{extends file="parent:frontend/index/index.tpl"}
{debug}

Wenn ich nun die URL /SwagControllerTest aufrufe bekomme ich die zwei gewünschte Variabeln geliefert, solange ich das parsen des Templates nicht verbiete aber wie bekomme ich dieses nun bei jedem Aufruf generiert?

{action module=frontend controller=SwagControllerTest action=index} 

 

So wie ich es Verstanden habe, werden nur dem selbst zu zugewiesenen Template die Variablen zugewiesen, ich würde aber gerne die Variablen dem Block zur Verfügung stellen, in dem ich sie gerade brauche!

Irgendwo hab ich noch nen Denkfehler sowei scheinbar ein Verständnisproblem. Könnt ihr mir nochmal helfen? 

Nein, der Ansatz ist IMO falsch. Lies Dir bitte das Thema HTTP Cache durch, dann wird es Dir klar.
Der Action-Controller ist sowas wie ein kleines Artefakt, dass neben dem gecachten Content geladen wird. Hat ein bisschen Ähnlichkeit mit dem AJAX Prinzip - ok, vielleicht weit hergeholt, aber mich erinnert es daran.

D.h.: Du baust einen Controller + Template in Deinem Plugin und der Output dieses Templates wird dann im Haupt-Template automatisch an der Stelle des {action…} Aufrufs ausgegeben. Eine sehr elegante Lösung, da Du dieses Plugin-Template z.B. im Haupttemplate wieder überladen könntest etc. pp.

Also, ich kann nun einen Block an beliebiger Stelle im Template einfügen und diesem Block die gewünschten Variabeln zur Verfügung stellen mit 

{action controller=SwagControllerTest action=index}

Sobal ich aber ein Template nur erweitern oder etwas an einen vorhanden Block anhängen will läd er ewig und die Seite bleibt weiß.

Dabei fällt mir im Firebug aber auf das hierfür keine eigener Aufruf gestartet wird wie bei einem Ajax aufruf, das passiert wahrscheinlich dann im Hintergrund beim laden der Seite.

Für mich stellt es nur als Problem da, da ich diese Information ja je nach Stelle wo ich sie benötige in den Templates brauche. Ich finde aber dafür auch einfach keine Bespiele, weder in den Shopware Templates und Plugins, noch irgendwo im Netz.

Ich habe auch noch nicht herrausgefunden, wie ich in meiner SwagControllerTest.php auf eine andere Funktion zugreifen kann. Meiner derzeitigen Logik nach, ja mit action=myFunction, dann läd er aber die Seite nicht mehr.

Genauso wenig verstehe, wie das dann das Feld name= geht. Also umgesetzt wird es wahrscheinlich wie so ein Get-Aufruf

 

Nein, es ist ja kein AJAX Call… Ich habe das nur aufs Prinzip bezogen. Diese Inklusion passiert natürlich komplett serverseitig. Nur holt er sich alle Daten aus dem HTTP Cache - außer die ESI Module - für die startet er einen eigenen Request an den Shopware Core.

__________________________________________________
Konnte ich Dir helfen? Dann freue ich mich über ein Danke :wink:

1 „Gefällt mir“

Das System habe ich ja nun verstanden. Wie steht es zu der Frage um den Aufruf? --> Ok mein Fehler, sollte vlt mal geauer lesen… muss der function natürlich nen Action mit geben -_-