Wie kann man Pseudoartikel über Controller in den Warenkorb legen?

Heute mal kein Problem aus einem Kundenshop, sondern vielmehr Gedanken zu einem eigenen SW6 Shop. Hintergrund ist der, dass ich bereits einen SW5 habe und dort einen eigenen Konfigurator habe. Nach und nach mache ich mir natürlich auch Gedanken bezüglich Migration zu SW6 (mein Lieblingsthema, da kann nix schief gehen).

Nun ist es allerdings so, dass ich für mein Vorhaben in SW6 über einen Frontend Controller Pseudoartikel erzeugen muss, die dann in den Warenkorb gelegt werden sollen. Hier muss ich gestehen, dass ich absolut überhaupt kein Plan habe wie ich das umsetzen könnte.

Ich weiß wie ich bestehende Artikel in den Warenkorb legen kann, aber eben nicht Artikel die es im Bestand gar nicht gibt. Wo ich also keine UUID zum Artikel habe.

Wenn irgendwer irgendwelche Tipps hat welche mich zum Ziel führen, würde das mein Herz erfreuen :slight_smile:

Siehe Add Cart Items | Shopware Documentation

Viele Grüße

Werde ich testen. Aber ich befürchte dass sich dieses Beispiel auf bestehende Artikel bezieht.

Nein, da geht es auch um custom line items mit eigener factory und cart processor.

Viele Grüße

Hm, ok. So ganz klappt das noch nicht bzw. es wird gar nichts angezeigt. Kommt auch keine Fehlermeldung.

Versuch 1 - ohne Erfolg

$lineItem = $this->factory->create([
'type' => LineItem::CUSTOM_LINE_ITEM_TYPE,
'referencedId' => '09900000000000000000000000000001',
'quantity' => 2,
'payload' => ['price' => 9.99 ]
], $context);
$this->cartService->add($cart, $lineItem, $context);

Versuch 2 - ohne Erfolg

$lineItem = new LineItem('09900000000000000000000000000001', LineItem::CUSTOM_LINE_ITEM_TYPE, null, 2);
$lineItem->setStackable(true);
$lineItem->setRemovable(true);
$lineItem->setLabel("test");
$lineItem->setPriceDefinition(new AbsolutePriceDefinition(9.99, null));
$this->cartService->add($cart, $lineItem, $context);

Vielleicht hat jemand noch eine Idee?

Jedes line item im cart ohne einen processor fliegt automatisch (wieder) raus. Du solltest die Doku vielleicht erst einmal -ganz- lesen und abarbeiten :wink:

Viele Grüße

Ich weiß leider was du meinst :frowning: Der Handler ist eingebaut. Processor ist eingebaut, jedoch beim Test nichts. Nicht mal eine Fehlermeldung.

naja „rausfliegen“ wird das Item nicht, aber der Warenkorb weiß nicht wie das Custom-Item angezeigt werden soll ! sprich es braucht ein Template. Mittlerweile muss dafür nur eine Stelle angepasst werden.

ABER nach meiner leidigen Erfahrung hat ein CustomItem den Nachteil, dass sich dieses nicht zur „Zusammenarbeit“ mit anderen Plugins bewegen lässt. Alle Plugin, die in den Warenkorb „schauen“ (Processor oder Collector) und dann nach PRODUCT_ITEMs filtern funktionieren nicht mehr (Rabatte, Zuschläge, Versandkosten-Berechnung, etc.).

Mein Weg war dann, den „Type“ in einem CustomField zu speichern. Im Item bleibt das aber ein Product.

Nein, jedes custom line item (mit einem eigenen typ) ohne processor wird aus dem cart gelöscht. Oder noch technischer erklärt: jedes custom line item ohne processor wird vom cart nicht in den calculated cart übernommen.

Viele Grüße

Ja hatte ich ursprünglich auch versucht, aber leider keine Lösung gefunden um das zum laufen zu bekommen.

Beschäftigt euch doch mit dem Beispiel aus der Doku. Das sollte eigentlich einwandfrei funktionieren. Bei konkreten Fragen könnt ihr diese natürlich gerne hier stellen.

Oder: schaut euch eines der 2.000 Plugins im Store an, die eigene custom line items verwenden. Die Plugins sind ja alle quelloffen.

Viele Grüße

Was denkst du was ich mache :man_facepalming:

Ja klar, ich buche jetzt 100 Plugins damit eins finde wo ich sehen kann wie das funktioniert. Sorry, aber das ist eine blöde Idee und nicht wenig hilfreich.

Das war ja nur eine Empfehlung, wenn dir die Doku nicht ausreicht. Mir persönlich hilft es immer wenn ich mir Software von Dritten anschaue, die meine oder ähnliche Probleme lösen. Und es gibt nun mal zahlreiche Plugins - konfiguratoren, Bundes, pseudo Produkte, Optionen etc. - die custom line Items verwenden und die Probleme, vor denen du gerade stehst, bereits gelöst haben.

Viele Grüße

Nun ja, die Sache ist so dass ich ich im Vorfeld nicht korrekt erkennnen kann wie ob in dem Plugin auch wirklich Pseudo-Produkte in den Warenkorb gelegt werden. In einem Plugin XYZ heißt es auch, dass man Pseudo-Produkte anlegen kann, sind aber in wirklichkeit Produkte die nur im Listing etc… nicht auftauchen und werden im Backend fest definiert. Das geht alles an dem vorbei was ich gern umsetzen möchte.

Natürlich habe ich mir schon etliche Beispiele angesehen, aber sie alle basieren auf echte Produkte die in den Warenkorb legt werden. Und bei den hier verlinkten Beispielen passiert einfach nichts. Vielleicht sind die auch gar nicht mehr aktuell.

Von daher dachte ich, dass sich jemand ggf. damit schon mal wirklich beschäftigt hat.

Hier mein aktueller Versuch:

  #[Route(path: '/picture-configurator', name: 'frontend.picture-configurator', methods: ['GET'])]
  public function PictureConfigurator(Request $request, SalesChannelContext $context): Response
  {

    $page = $this->genericPageLoader->load($request, $context);

    // only test
    $ProductId = Uuid::randomHex();
    $productLineItems = new LineItem( $ProductId, LineItem::PRODUCT_LINE_ITEM_TYPE, $ProductId, 2 );
    $productLineItems->setStackable(true);
    $productLineItems->setRemovable(true);
    $productLineItems->setLabel("test");
    $productLineItems->setPriceDefinition(new AbsolutePriceDefinition(9.99, null));

    $cart = $this->cartService->getCart($context->getToken(), $context);
    $this->cartService->add( $cart, $productLineItems, $context );

    return $this->renderStorefront('@iffConfigurator/storefront/page/picture-configurator.html.twig', ['page' => $page] );

  }

Nein, du wirst wahrscheinlich niemals DAS Plugin finden, das EXAKT deine Anforderungen für dich löst - aber sie können dazu dienen dir die Konzepte und Grundlagen zu vermitteln.

Für deinen aktuellen Versuch: du könntest dir jetzt z.B. einmal den ProductCartProcessor anschauen, um heraus zu finden wie die Prozesse im Warenkorb ablaufen und warum dein „Produkt“ wieder raus fliegt.

Viele Grüße

1 „Gefällt mir“

Über den Add Cart Collector/Processor | Shopware Documentation kannst du z.B. eigene, freie Items dem Warenkorb hinzufügen. Haben wir z.B. mit Zuschlägen/Mindestbestellwerte schon gemacht.

Hier ein Beispiel:

Das ist auch wieder ein vollkommen anderes Konzept. Du legst nicht über den cart service ein line item in den cart und schleifst es durch einen processor immer mit/durch, sondern du umgehst den cart komplett und fügst bei jedem Durchlauf des processors dein line item direkt in den calculated cart. Das kannst du z.B. bei fest definierten prozentualen Aufschlägen auf den Warenkorb machen - aber nicht, wenn du z.B. Eingaben akzeptieren möchtest (z.B. eine Option „+ Geschenkpapier“ auf der PDP). Außerdem führt das zu einem extrem „merkwürdigem“ Verhalten, wenn du eine Bestellung manuell in der Administration anpassen möchtest.

Viele Grüße

Ja das wird wohl aktuell das beste sein. Irgendwo da bleibt mein Eintrag hängen.

Kurzes Feedback:

Der erste Eintrag mit einem echten Pseudo-Produkt hat nun geklappt :slight_smile:

Allerdings darf ich dazu (nicht wie in der Beschreibung steht) LineItem::PRODUCT_LINE_ITEM_TYPE als Konstante benutzen, dass überschreibt mir sogar bestehende Produkte im Warenkorb. Ich musste eine eigene Konstante definieren, welche im Handler übereinstimmen muss. Und das war die Ursache warum nichts ging.

Muss mich korrigieren:

In meinem Falle muss ich mit ‚CUSTOM_LINE_ITEM_TYPE‘ arbeiten. Damit werden beim Pseudo-Artikel im Warenkorb auch Versandkosten angezeigt und der Artikel ist Bestellbar :slight_smile:

Jetzt muss ich noch knobeln, wie ich eine Pseudo-Produktnummer mit übergebe.