Hersteller im Checkout anzeigen

Hallo,

ich möchte den Hersteller für jedes Produkt im Warenkorb anzeigen lassen. In lineItem.payload gibt es nur manufacturerId. Wie kann ich die Daten um den Herstellernamen erweitern?

Falls die Daten nicht zur Verfügung stehen, dann per Subscriber das entsprechende Event heraussuchen und den Hersteller per addAssociation dem Criteria hinzufügen.

public static function getSubscribedEvents(): array
{
    return [
        CheckoutCartPageLoadedEvent::class  => 'onCheckoutPageLoaded'
    ];
}
/**
 * Calls onCheckoutPagesRefresh for handling stuff in all checkout pages
 *
 * @param CheckoutCartPageLoadedEvent $event
 */
public function onCheckoutPageLoaded(CheckoutCartPageLoadedEvent $event) : void
{
    $this->onCheckoutPagesRefresh($event);
    $event->getCriteria()->addAssociation('manufacturer');
}

Dieser Subscriber sollte es doch sein, oder? Aber addAssociation('manufacturer') geht schief. Wie ruft man dass richtig auf?

Ich glaube nicht, dass es das richtige Event ist. Ohne mich lange einzulesen kann dich dir leider nicht weiter helfen.

Zum Punkt $event->getCriteria()->addAssociation(‚manufacturer‘); kann ich dir aber sagen: du musst immer schauen, was deine Referenz ist. Bei dieser Methode müsste die Referenz das ProductEntity sein. Deinem Event nach ist die Referenz aber eher das CartEntity (falls es das überhaupt gibt).

Du müsstest also eine Kette bilden im Sinne von Cart>LineItem->Product->Manufacturer (Kette frei erfunden).

Aber wie gesagt, ohne selbst einzulesen kann ich dazu leider nicht viel sagen und dir das Vorgehen nur beispielhaft skizzieren.

Naja, wird wohl etwas mit der vorhandenen manufacturerId zutun haben?

Ich würde empfehlen eine Twig Funktion zu implementieren, womit du anhand der ManufacturerId die Manufacturers erhälst.

private function onCheckoutPagesRefresh ($event)
{
    //do something in the checkout
    $myLineItems = $event->getPage()->getCart()->getLineItems();
    
    foreach ($myLineItems as $item) {
        $item->setPayloadValue('test1', 'test1');
    }
}

So, nun bekomme ich zumindest den Payload für jedes LineItem erweitert. Wie komme ich hier aber an die Herstellerdaten? Mir fehlt gerade die Verbindung zu addAssociation(‚manufacturer‘).

So, jetzt klappt es. Falls jemand mal das gleiche Problem hat:

private function onCheckoutPagesRefresh ($event)
{
    //do something in the checkout
    $myLineItems = $event->getPage()->getCart()->getLineItems();
    
    foreach ($myLineItems as $lineItem) {
        $product = $this->getProductById($lineItem->getReferencedId(), $event->getContext());
        if ($product->getManufacturer()) $lineItem->setPayloadValue('manufacturerName', $product->getManufacturer()->getName());
    }
}

private function getProductById($productId, $context)
{
    $product = $this->productRepository->search( (new Criteria([$productId]))->addAssociation('manufacturer'), $context )->getEntities()->first();
    return $product;
}
1 Like