Hallo, ich habe einen eigenen Controller für eine eigene Seite. Dort muss im Template prüfen, ob der User gerade eingeloggt ist oder nicht (also quasi kein „User“ ist).
Je nach dem, muss ich Elemente anzeigen oder eben nicht.
Ich habe das mit der Variable
$sUserLoggedIn
versucht, aber die ist immer false, egal ob eingeloggt oder nicht.
Thema ist hier wohl das Caching. Ich brauche eine Lösung die auch cachesafe ist, d.h. alle nicht-eingeloggten Nutzer sollen bestimmte Elemente sehen, alle eingeloggten sollen sie nicht sehen.
Naja, über das Template kannst du sowas nicht machen. Das geht ja auch komplett gegen den Sinn eines Full-Page Caches.
Typischerweise baut man sich ein Plugin mit Widget-Controller, welcher die Information die man braucht zurückliefert. Dann kannst du per Javascript die Daten abfragen und die Elemente im Theme ersetzen. Man sollte natürlich nicht zu viele Calls haben, die so am Cache vorbei gehen, da dann der Cache auch ausbleiben kann, wenn man eh alles dynamisiert.
Das ist aber die typische Vorgehensweise, wenn man bspw. individuelle Inhalte pro Kunde nachladen möchte.
zum Thema Cache: Ich habe ein Formular, welches durch den zugehörigen Controller (eigenes Plugin) vorbefüllt wird. Und zwar werden die ganzen Anschrift-Felder vorbefüllt aus den Daten des aktuell angemeldeten Benutzers. Zudem wird beim Aufruf des Formulars immer eine Artikel-ID mitgegeben, je nachdem von welchem Artikel aus man die Seite aufruft. Mit der Artikel-ID werden dann Artikeldaten in das Formular geladen.
klappt sowas dann überhaupt im zusammenspiel mit Cache? Hatte mir darüber keine Gedanken gemacht
das ganze ist sehr komplex (auch mit verschiedenen Weiterleitungen und Fehlerprüfungen, die jeweils Daten von Action zu Action durchschleußen). Wie eine Art Checkout quasi… der Checkout funktioniert ja auch für jeden Benutzer unabhängig…
Kann man irgendwie Seiten/Controller vom Caching ausschließen?
Naja, wenn du deinen Controller nicht explizit im HTTP-Cache Modul einträgst, wird er auch nicht gecached.
Im Standard werden also Plugin Controller erstmal nicht gecached, du musst schon explizit sagen, dass das gemacht werden soll. Das sollte also bei dir kein Problem sein.
Das mit dem Widget + Javascript machst du halt für Seiten die aus dem Cache kommen (bspw. Detailseite, Kategorieseite).
ahhh… danke! dachte das is genau anders rum, und alle Controller landen erstmal im Cache! Dann bin ich an der Stelle ja beruhigt. Und für mein Eingeloggt/Nicht-Eingeloggt versuch ich das mal mit einem Widget… aber ich könnte theoretisch ja auch einen Ajax-Call machen oder?
Das ist ja ein Ajax-Call. Der Call muss dir nur zurückliefern, was du wissen willst.
In der Regel macht man sowas über einen eigenen Plugin-Controller im widget namespace, den ich per Javascript anspreche (Ajax-Call) und der mir dann die passende Information liefert.
Naja, wenn du deinen Controller nicht explizit im HTTP-Cache Modul einträgst, wird er auch nicht gecached.
Dazu mal eine Zwischenfrage, wenn es erlaubt ist: Gibt es eine Möglichkei bei einem Plugin das automatisch eintragen zu lassen, dass ein Controller gecacht werden soll?
Naja, wenn du deinen Controller nicht explizit im HTTP-Cache Modul einträgst, wird er auch nicht gecached.
Dazu mal eine Zwischenfrage, wenn es erlaubt ist: Gibt es eine Möglichkei bei einem Plugin das automatisch eintragen zu lassen, dass ein Controller gecacht werden soll?
Ich mach das immer so in der Install/Deinstall-Methode.
private function createCacheRoute()
{
$CacheRouteInstaller = $this->container->get('shopware.http_cache.route_installer');
$CacheRouteInstaller->addHttpCacheRoute('frontend/meinController', 14400);
}
private function deleteCacheRoute()
{
$CacheRouteInstaller = $this->container->get('shopware.http_cache.route_installer');
$CacheRouteInstaller->removeHttpCacheRoute('frontend/meinController');
}