Standard-Kundengruppe umschreiben

Hallo zusammen,

ich suche eine Möglichkeit die Standard-Kundengruppe umzuschreiben.

Ich bin dazu im Plugin “Default/Core/System/Bootstrap.php” und habe mal “testweise” in die Methode “onInitResource” hartgecoded folgenden Code reingeschrieben:

 $system-\>sUSERGROUP = "H"; $system-\>sUSERGROUPDATA = **array** ('id'=\>2, 'key'=\>'H', 'tax'=\>1); $config-\>defaultCustomerGroup = "H";

Damit sollte eigentlich als Standard-Kundengruppe nun mehr die der Händler aktiviert sein. Ist aber nicht…

Ich kann die Werte mit var_dump ausgeben, kommen also an. Die Methode wird ausgeführt. Mein Cache ist deaktiviert (hoffe ich habe das richtig gemacht, im Backend unter Caches / Performance -> Einstellungen -> Configuration -> HttpCache aktivieren (Häkchen raus). Mein Shop ist im Bearbeitungsmodus.

Kann mir bitte evtl. auch von Shopware jemand einen Tip geben, wie man die Standard-Kundengruppe über ein (eigenes) Plugin so umstellt, dass diese auch überall übernommen wird?

Besten Dank vorab.

Frank

Hi,

ich dachte erst, du willst das grundsätzlich dynamisch machen. Aber wenn ich dich jetzt richtig verstehe, suchst du doch einfach nur die Konfiguration, oder?

Wäre natürlich jetzt die einfachste Variante. Dennoch ist es in SW natürlich immer so, dass „EK“ als Systemgruppe der Fallback ist. Wenn für H also keine Preise definiert sind, wird nach Preisen für EK gesucht.

Was dein bisheriges Vorgehen angeht: Da schreibst du ja direkt in die sSystem-Core-Klasse. Für die meisten Anzeigen im Frontend wird aber bspw. der Storefront-Kontext genutzt: \Shopware\Bundle\StoreFrontBundle\Service\Core\ContextService

Da wird entweder die Kundengruppe aus der Session oder aber die des Shops zurück gegeben. Wenn du dir die Methode \sAdmin::sCheckUser ansiehst, werden dort ja auch unter anderem die entsprechenden Werte in der Session gesetzt - allerdings aus der sSystem, da hast du schon Recht. Aber damit hätten wir schon zwei Ansätze für Debugging: Stimmt der Wert in der Session und stimmt der Wert im Shop- bzw. ProductContext. Das könntest du dir vll. nochmal ansehen.

Schönen Abend noch!

Daniel

Hallo Daniel,

ich hatte bzgl. der Konfig-Einstellungen Tomaten auf den Augen. Danke für den Screenshot. Natürlich will ich das zusätzlich auch dynamisch machen.

Dein Hinweis hat in so fern geholfen, als das ich den ContextService als Übeltäter enttarnt habe. Ich habe mich also entschieden, den Service zu dekorieren. Da das meine ersten Gehversuche mit solcherlei Verschönerungen sind, habe ich jetzt folgendes gemacht (wird bis dahin korrekt instanziert alles)… in meine Methode…

**public function** decorateService() { $coreService = Shopware()-\>Container()-\>get('shopware\_storefront.context\_service'); $contextService = **new** Services\ContextServiceDecorator(); Shopware()-\>Container()-\>set('shopware\_storefront.context\_service', $contextService); }

…liegt jetzt eine neue Klasse new Services\ContextServiceDecorator(); Darin eine Kopie der ursprünglichen ContextService-Klasse.

Leider meckert der jetzt rum, dass die Argumente im Konstruktor nicht passen. Klar, ich übergeb (bis jetzt) ja keine Argumente. Eigentlich geht es ja auch nur um die Methode „getStoreFrontCurrentCustomerGroupKey“, die ich nach meinen Maßstäben neu strukturieren muss (kann ich den anderen Kram dann wegnehmen?)

Daher meine abschließende Frage: Was für Argumente muss ich jetzt für meine neue Dekorator-Klasse nehmen (falls ich das überhaupt muss) und wie übergebe ich Argumente an die neue Methode (getStoreFrontCurrentCustomerGroupKey) in meiner Dekorator-Klasse.

Danke für Deine Hilfe vorab.

Beste Grüße,
Frank

Hi,

bist da schon auf der richtigen Spur. Deine Klasse muss jetzt das Original-Interface implementierien (ContextServiceInterface) und die entsprechenden Methoden implementieren. In denen rufst du dann (wenn du nichts ändern willst) einfach die Original-Methode des dekorierten Objektes auf. Dazu musst du das in deinen eigenen Service injecten.

Lange Rede, kurzer Sinn: Hier gibt es ein Beispiel dazu: Service extensions

Besten Gruß,

Daniel

Hallo zusammen,

ich hab hier einen merkwürdigen Fehler bei der Instanzierung der Klasse ContextService. (Ich hab das Ganze so wie in der Beschreibung aufgebaut, ich lande auch in der Methode decorateService.

In meiner oben beschriebenen Methode lässt sich der Core-Service aber nicht instanzieren, ich hab das Ganze auf die Zeile in der Methode

 $coreService = Shopware()-\>Container()-\>get('shopware\_storefront.context\_service'); 

reduziert (alle anderen davor und danach weggenommen) und bekomme die „Wartungsseite“ im Frontend angezeigt. An der Stelle kann ich also nicht weiterarbeiten oder die Innereien in der Klasse weiter verschönern…

Kann mir vielleicht (vielleicht nicht nur Daniel - wenn er Zeit hat, isses aber auch nett) sagen, warum das nicht geht und welche Lösung es hierzu gibt?

Danke vorab.

Frank

 

Hi,

am besten eben die Fehlerausgabe aktivieren, da müsstest du eine sinnvolle Fehlermeldung bekommen. Sowas passiert aber oft, wenn man versucht das Ding im Backend zu laden oder wenn der Shop für das Frontend noch nicht initialisiert ist. Hängt dann also von dem Event ab, an dem du dich hängst.

Besten Gruß,

Daniel

Hängt dann also von dem Event ab, an dem du dich hängst.

Hallo,

ja, mittlerweile hab ich jetzt durch die aktivierte Fehlerausgabe die Klasse dekorieren können. Allerdings funktioniert das nicht mit dem Event

 $this-\>subscribeEvent( 'Enlight\_Bootstrap\_InitResource\_shopware\_storefront.context\_service', 'decorateContextService' );

Da kriege ich weiterhin die Wartungsseite (trotz aktivierter Fehlerausgabe) und mit einem 

 Enlight\_Controller\_Action\_PostDispatch

wird die Klasse instanziert und dekoriert, aber dabei hat die neue Dekorator-Klasse keinen Einfluss auf die Ausgabe, ich gehe davon aus, dass die Initialisierung zu spät kommt. Ich habe auch versucht, das ganze an einen PreDispatch oder StartDispatch zu hängen, ebenfalls ohne Einfluss auf meine Änderungen oder die Ausgabe.

Hat jemand eine Idee, wie ich die Klasse einflussreich dekorieren kann - besser: welches Event muss ich benutzen, damit ich rechtzeitig aber nicht vorzeitig die Dekorator-Klasse initialisieren kann?

Vielen Dank vorab.

Frank 

 

Hallo zusammen,

ich habe jetzt folgendes Event genutzt, aus der Doku erkenne ich nicht, dass man dies mit einem anderen Event nutzen kann:

 $this-\>subscribeEvent( 'Enlight\_Bootstrap\_AfterInitResource\_shopware\_storefront.context\_service', 'decorateContextService' );

In meiner Event-Methode dekoriere ich den Service wie folgt:

    public function decorateContextService() {

        $contextService = new ContextServiceDekorator (
            Shopware()->Container(),
            Shopware()->Container()->get('shopware_storefront.customer_group_gateway'),
            Shopware()->Container()->get('shopware_storefront.tax_gateway'),
            Shopware()->Container()->get('shopware_storefront.country_gateway'),
            Shopware()->Container()->get('shopware_storefront.price_group_discount_gateway'),
            Shopware()->Container()->get('shopware_storefront.shop_gateway_dbal'),
            Shopware()->Container()->get('shopware_storefront.currency_gateway_dbal'),
            Shopware()->Container()->get('shopware_storefront.context_service')
        );
        Shopware()->Container()->set('shopware_storefront.context_service', $contextService);
    }

Leider kriege ich immer noch den Fehler

Uncaught TypeError: Argument 2 passed to Shopware\Components\Compatibility\LegacyStructConverter::__construct() must be an instance of Shopware\Bundle\StoreFrontBundle\Service\Core\ContextService, instance of ShopwarePlugins\SwagPluginSystem\StoreFrontBundle\ContextServiceDekorator given, called in 

Für mich heißt das also, dass der Context-Service (Shopware()->Container()->get(‚shopware_storefront.context_service‘)) noch nicht initialisiert ist, und ich eine Instanz davon brauche um den dekorieren zu können.

Ich habe einige Event vor und danach durchprobiert, entweder gibt es die gleiche Fehlermeldung oder ich krieg ne Wartungsseite.

Es muss doch hier eine Möglichkeit geben, den Service sauber dekorieren zu können.

Kann mir bitte jemand helfen???

Danke vorab.

Frank