Eingeloggter Customer in EntityLoadedEvent?

Hallo zusammen,

ich suche nach einer Möglichkeit den eingeloggten Customer bei Aufruf eines EntityLoadedEvents der Produktseite zu ermitteln, da die anzupassenden Preise vom Kunde abhängig sind. Leider ist der Customer erst im SalesChannelsContext des ProductPageLoaded Events vorhanden.

Wie kann ich die Produktpreise abhängig vom Kunden anpassen? Hat jemand einen Vorschlag?

Hallo Adelbert,

wie liefs mit dem Thema? Ich hänge gerade an einem sehr ähnlichen Problem. Bei mir sollen bestimmte Produkte nur dann angezeigt werden, wenn der User eingeloggt ist und wir feststellen konnten welche „Rollen/Interessen“ dieser hat.

Das heißt eingeloggte User sollen unter Umständen mehr angezeigt bekommen und auch Personen bezogen unterschiedlich.

Dazu habe ich einen Subscriber gebaut, der auf das Event „CmsPageEvents::SLOT_LOADED_EVENT“ hört. Funktioniert auch alles soweit - nur fehlt mir halt an dem Punkt der Sales-Channel-Context oder zumindest die CustomerId, damit ich die Produkte für die User ein/ausblenden kann.

So hats bei mir super funktioniert.

Hallo @AlexBS und vielen Dank für deine Antwort!

Auf diese Lösung bin Ich gestern auch schon gestoßen. Sie hat mir jedoch leider nicht weitergeholfen, da die CustomerId in dem Fall ja trotzdem leer bleibt - diese hätte Ich mir also ebenfalls noch iwo her holen müssen.

Aber Ich konnte gerade eben einen für mich passenden Weg finden. Und der sollte eigentlich auch in jedem anderen Subscriber funktionieren:

private RequestStack $requestStack;

/**
 * @internal
 */
public function __construct(
    SalesChannelContextPersister $contextPersister,
    RequestStack $requestStack
) {
    $this->contextPersister = $contextPersister;
    $this->requestStack = $requestStack;
}

[…]

$salesChannelContext = $this->requestStack->getMainRequest()->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);

Den Request-Stack muss man über Dependency-Injection (services.xml) und dem Constructor dem jeweiligen Subscriber mitgeben. Danach kann man auf die Main-Request - also auf die Haupt-Request, die den Subsriber getriggert hat - zugreifen :+1:

Sehr geil! Muss man auch erstmal drauf kommen. SalesChannelContextPersister und RequestStack hatte ich bisher noch nicht in Verwendung.

Wäre so eine Regel nicht auch mit einer Rule möglich gewesen?

Muss gestehen, dass mir Rules in Shopware jetzt noch nicht so viel sagen. Was kann Ich denn mit denen machen bzw. wie funktionieren die? Und wie beschreibt man die genau um auf einen solchen Kontext zu arbeiten?

Ich weiß nicht genau in welchem Zusammenhang du deine Produkte anzeigen willst, aber man kann zB eine dynamische Produktgruppe erstellen, die mit einer Regel verknüpft ist.

Regel: User ist eingeloggt und User ist von Produktgruppe XYZ
Und dann kann man eine Dynamische Produktgruppe erstellen und diese Regel als Bedingung setzen.

Die dynamische Produktgruppe kann man dann zB für Slider, ganze Kategorielistings oder eigene CMS Elemente nehmen. Das hilft natürlich nur in genau solchen Fällen. Wenn du in einem Listing nur bestimmte Produkte ausnehmen willst, funktioniert das natürlich auf die Weise nicht.

Du kannst im Code aber auch Rules die im RuleBuilder definiert wurden, laden. Ich glaube die aktiven Rules kann man direkt aus dem aktuellen Context Objekt laden.

Subscribe doch einfach SalesChannelEntityLoadedEvent. Da gibts einen SalesChannelContext und darin ist der Customer enthalten.