Aktuelle Session Kundengruppe ändern

Ich habe mehrere Kundengruppen mit unterschiedlichen Preisen. Ich möchte nun, dass man mittels Button im Frontend (z.b. per Ajax-Request) zwischen verschiedenen Gruppen hin und herschalten kann.

Wo setz ich da am besten an? Gibt es bereits ne bestehende Action die ich dafür nutzen kann oder brauch ich nen eigenen Endpoint? 

Hatte auch mal so ein Projekt gestartet, und erst nun auf Eis gelegt.

Es reicht nicht, in der Session nur die “Kundengruppe” zu ändern. Spätestens wenn Du den HTTP-Cache benutzt, musst Du auch da noch den Keks “x-cache-context-hash” umschreiben, damit nicht auch für die “neue” Kundengruppe die Daten aus der “ersten Gruppe” ausgeliefert werden (Einkaufswelten, Listen,…).

Inspiration:
https://github.com/shopwareLabs/SwagUserPrice/blob/master/Subscriber/CacheKeyExtender.php weil ja auch für den Kundenpreis der Cache “ausgehebelt” werden muss  Wink

Für die “action” selber wirst Du wohl am besten einen eigenen (widget)-Controller anlegen und ein wenig mit AJAX arbeiten müssen.
Button => AJAX auf Controller => setzt Keks => Seite reload.
“Fertiges” habe ich zumindest doch nicht gefunden  Wearing-Sunglasses

Das war zumindest mein Ansatz  Wink

Dann musst Du natürlich noch überlegen, was passiert, wenn sich der “umgeschaltete Gast” registriert / anmeldet - ggf. musst Du dann auch da noch die Kundengruppe umschreiben.

1 „Gefällt mir“

Danke ich schaus mir mal an.

mhh so nebenbei, wieso is this-\>container-\>get('session') sowie Shopware()-\>Session() leer, _SESSION aber hat die daten die ich such?

edit: nvm. my bad.

also direkt in die session zu schreiben funktioniert anscheinend. den cache cookie setzt er nach dem zweiten refresh ebenfalls. Mal noch ein bisschen rumspielen und halt halt so umschreiben dass man nicht beliebig von jder gruppe in jede wechseln kann. hier mal der prototyp. Das mit dem automatisch ner kundengruppe beim registrieren zuweisen hab ich schon indem ich den registerservice dekoriert hab. Mal schauen wie das auch mit dem Warenkorb ist, wenn da schon was drinliegt und man die gruppe switcht die aber andere preise hat

    public function ajaxSwitchCustomerGroupAction() {
        Shopware()->Plugins()->Controller()->ViewRenderer()->setNoRender();
        $this->View()->setTemplate(); // load empty template
        $this->Response()->setHeader('Content-Type', 'application/json');
        
        $toGroupId = (int)$this->Request()->getParam('groupId', 0);
        /* @var session Session */
        $session = $this->container->get('session');
        $em = $this->container->get('models');    
        
        if (!$session->offsetExists('sUserId') && empty($session->offsetGet('sUserId'))) {            
            /* @var group Shopware\Models\Customer\Group */
            $group = $em->find('Shopware\Models\Customer\Group', $toGroupId);
            if (!empty($group)) {                   
                $session->offsetSet('sUserGroup', $group->getKey());
                return $this->Response()->setBody(json_encode(['success' => true, 'groupKey' => $group->getKey()]));  
            }            
        }        
        
        return $this->Response()->setBody(json_encode(['success' => false]));          
    }

 

Bei mir hat das ohne CacheKeyExtender nicht zuverlässig funktioniert - insbesondere die Slider in den EKW waren da sehr unzuverlässig.

Noch eine Anregung:
Unter Chrome konnte ich beobachten, dass jeder TAB (wenn Kunde weitere Fenster öffnet) seinen eigenen Cache-Cookie hatte. Wechselt TAB1 Kundengruppe und danach TAB2 Link geklickt: Alte Kundengruppe.

Tipp: Bau dir einen JS-“Watchdog”, der immer wieder Dein Widget anpingt. Kundengruppe unverändert: keine Reaktion.
Kundengruppe geändet: Response Kundengruppe, dass JS bei geänderte Gruppe die Seite im TAB neu laden soll. Durch den Response SOLLTE sich auch im TAB das Cookie ändern, und danach hat auch das TAB die “richtigen” Preise   

@sonic‍

Ok, ich habe nun eine „Von Hinten durch die Brust ins Auge Lösung“, die aber anschienend soweit funktioniert:

Ich habe einen Endpoint, der die neue Kundengruppe in die Session schreibt. diese wird per ajax Call getriggert. Wenn der Ajax Call 

erfolgreich war, wird per Javascript der x-cache-context-hash cookie gelöscht. Danach wird mit einem zweiten Javascript aufruf, ein zweiter Endpoint meines Controllers aufgerufen

der den neuen context cookie mitliefert. Der browser legt dann automatisch den cookie an. danach wird per Javascript die seite Neugeladen.

Hier ein auszug wie der neue cookie erzeugt wird:

    public function switchCustomerGroupRefreshCacheHashAction() {
        Shopware()->Plugins()->Controller()->ViewRenderer()->setNoRender();
        $this->View()->setTemplate(); // load empty template
        $request = $this->Request();
        $response = $this->Response();
        /** @var CacheControl $cacheControl */
        $cacheControl = $this->container->get('http_cache.cache_control');

        $context = $this->container->get('shopware_storefront.context_service')->getShopContext();

        $cacheControl->setContextCacheKey($request, $context, $response);
        return $this->Response()->setBody('');
    }

Mal die Tage weiter testen ob das so auch alles gut klappt. Jetzt noch schauen wie das mit dem Flyout Cart am besten geht, dass der sich auch gleich aktualisiert.

1 „Gefällt mir“

Wenn ich mal wieder Lust und Zeit habe, werde ich wohl *mein* Projekt auch noch einmal ausgraben und weiter entwickeln  Wink
THX für die Code-Freizügigkeit.  Thumb-Up
Mein „Basteltrieb“ ist irgendwie beim Umzug von Berlin nach NRW im Sommer noch in Berlin geblieben *lach*

Wobei bei mir das eigentlich auch mit einem AJAX und Reload später funktioniert hat.