Wie kann ich die geladenen Produkte in meinem Subscriber erreichen?

Hallo,

Ich versuche ein erstes Shopware 6 Plugin zu erstellen.
Ich stoße auf folgendes Problem: Wenn ich subscribe zum NavigationPageLoadedEvent, wie kann ich die geladenen Produkte in meinem Subscriber erreichen?
Das $event scheint alle Daten einzubetten. Muss ich sie irgendwie aus dem $event holen oder gibt es einen anderen Weg?

public function onNavigationPageLoaded(NavigationPageLoadedEvent $event) : void
{
    // get Loaded articles.. HOW?
}

Für Shopware 5 war es eine Option, die Daten aus der Ansicht abzurufen:

$controller = $args->getSubject();

$view = $controller->View();
        
/* Get current article */
$sArticle = $view->getAssign('sArticle');

 

Hallo,

dazu kannst du am besten in das Event selbst reinschauen. Denn es gibt keine pauschale Antwort, was ein Event alles so enthält  Wink
https://github.com/shopware/platform/blob/master/src/Storefront/Page/Navigation/NavigationPageLoadedEvent.php
und an dieser Stelle wird das Event geworfen: https://github.com/shopware/platform/blob/master/src/Storefront/Page/Navigation/NavigationPageLoader.php#L88

Viele Grüße aus Schöppingen

cool Michael Telgmann

Hallo Michael,

Ich habe ausgiebig versucht, das Event zu debuggen, und am Ende ist es möglich, die Produkte aus dem Event abzurufen.
Aber es scheint nicht der richtige Weg zu sein.

Oder gibt es keine Alternative?

$elements = $event->getPage()->getCmsPage()->getBlocks()->getElements();

foreach ($elements as $element)
{
    if ($element->getType() == 'product-listing')
       //... continue
}

 

Hallo,

was genau möchtest du denn erreichen? Vielleicht ist das Event ja nicht das richtige  Wink

Viele Grüße aus Schöppingen

cool Michael Telgmann

Hallo Michael.

Was ich erreichen möchte, ist das folgende:
Ich möchte einen Google Datalayer hinzufügen, für den Artikelinformationen erforderlich sind.
Ich habe bereits eine Komponente eingerichtet, die den Google Datalayer schreibt.
Diese Komponente wird innerhalb des Subscriber ausgelöst. Die Komponente benötigt jedoch alle Produktinformationen, die auf der Lising-Seite (Navigationsseite) geladen sind.
Dafur brauche ich ein array aller geladenen Produkte, die ich an die Google Datalayer-Komponente senden kann.

Was ist der beste Weg, um dieses Array zu bekommen?

Ich glaube das sollte funktionieren:

class MySubscriber implements EventSubscriberInterface
{

    public static function getSubscribedEvents(): array
    {
        return [
            ProductEvents::PRODUCT_LOADED_EVENT => 'onProductsLoaded'
        ];
    }

    public function onProductsLoaded(EntityLoadedEvent $event): void
    {
        /** @var ProductEntity $productEntity */
        foreach ($event->getEntities() as $productEntity) {
            dd($productEntity);
        }
    }
}

Und dann noch in die services.xml laden

 

Hallo,

Ich habe immer noch Probleme damit, die Produktdaten zu bekommen.

Vielleicht muss ich ein bisschen mehr erklären, was ich erreichen möchte:

Auf der Listingseite benötige ich die bereits geladenen Produktdaten. Diese Daten werden benötigt, um einen Tagmanager-Datenlayer zu erstellen, der im Frontend angezeigt wird.

Dafür subscribe ich auf das NavigationPageLoadedEvent, bei dem die Daten in das Frontend geladen werden müssen. Da die Produktdaten bereits geladen sind, möchte ich das nicht noch einmal tun. Ich bin immer noch verwirrt, wie ich diese Produktdaten im Subscriber erhalten kann.

Ich konnte im gleichen Event mit folgendem Konstrukt die Produkte des Listings abrufen:

 

if ($event->getPage()->getCmsPage()->getType() !== 'product_list') {
    return;
}

/** @var ProductListingStruct $productListingStruct */
$productListingStruct = $event->getPage()->getCmsPage()->getSections()->getBlocks()->getSlots()->getSlot('content')->getData();

/** @var SalesChannelProductEntity[] $products */
$products = $productListingStruct->getListing()->getElements();

Vielleicht gibt es noch eine einfachere und schönere Methode aber ich habe nichts dazu gefunden.

Hallo zusammen.

Vorab vielen Dank für die Codebeispiele hier. Ich versuche auch gerade die Produktliste zu erweitern. Leider ist bei einigen Kategorien 

$event->getPage()->getCmsPage()->getSections()->getBlocks()->getSlots()->getSlot('content')->getData() 

NULL wodurch ->getListing() natürlich nicht mehr funktioniert. Ich habe aktuell noch keine Idee warum das so ist. Gibt es mittlerweile einen besseren Lösungsansatz als hier beschrieben?

Ich müsste die Produkte mit zusätzlichen Attributen anreichern um auf diese im Template reagieren zu können. Ich habe das wie folgt probiert jedoch sehe ich das Attribut in nicht wenn ich mir die Produkte loggen lasse:

/** @var SalesChannelProductEntity $product */
foreach ($products as $product)
{
	$this->productRepository->upsert([[
		'id' => $product->getId(),
		'customFields' => ['MEIN_ATTRIBUT' => true]
	]], $context);
}

Bin ich auf dem Holzweg? Hat jemand bereits ähnliches erfolgreich umgesetzt?

Beste Grüße
Mike