LineItemCollection nicht modifizierbar?

Hallo zusammen,

wir brauchen für einen Kunden die Möglichkeit das gleiche Produkt in verschiedenen Konfigurationen in den Warenkorb zu legen. Der einzige Weg dies zu ermöglichen wäre die add Funktion der LineItemCollection dahingehend zu überschreiben, dass nicht mehr die ProduktId als Index für das Element verwendet wird, und die Prüfung ob die Id bereits vorhanden ist rauszuschmeißen.

//Original

public function add($lineItem): void
    {
        $this->validateType($lineItem);

        $exists = $this->get($lineItem->getId());

        if ($exists && $exists->getType() !== $lineItem->getType()) {
            throw new MixedLineItemTypeException($lineItem->getId(), $exists->getType());
        }

        if ($exists) {
            $exists->setQuantity($lineItem->getQuantity() + $exists->getQuantity());

            return;
        }

        $this->elements[$this->getKey($lineItem)] = $lineItem;
    }

// gewünschte Anpassung
public function add($lineItem): void
    {
        $this->validateType($lineItem);

        $exists = $this->get($lineItem->getId());

        $this->elements[] = $lineItem;
    }

Dies würde so auch wunderbar funktionieren (getestet via direkter Anpassung der Corefile). Allerdings gibt es meines Erachtens keine Möglichkeit die LineItemCollection  zu dekorieren, ersetzen oder zu überschreiben, da diese kein Service ist, keinem Interface zugrunde liegt und außerdem überall wo sie verwendet wir direkt initialisiert wird (ohne Dependency Injection). Gibt es hier eine Möglichkeit dieses Verhalten zu beeinflußen (oder wird es dies geben)?

Was nicht funktioniert

  • Template Anpassung um den LineItems key abzuändern -> keine Auswirkung da in der LineItemCollection direkt auf getId() zugegriffen wird und nicht auf den Key
  • Template o. JS Anpassung um die Id zu modifizieren -> Produkt kann gar nicht mehr in den Warenkorb gelegt werden, weil nicht existent, zumal diese Id auch vom eigenen Code benötigt wird
  • LineItemAddedEvent -> kommt zu spät 
  • LineItem im Controller modifzieren -> selbes Problem, Id muss die echte sein und dadurch wird das LineItem nur dem bestehenden „hinzugefügt“

Ich sehe keinen Weg der drumherum führt die LineItemCollection für dieses Vorhaben, welches meiner Meinung nach eine essentielle Funktionalität ist, anzupassen. Viele unserer Kunden benötigen diese Funktionalität zwingend. Eine Anpassung des Cores ist nicht gewünscht.

@Shopware braucht Ihr doch sicherlich auch für Euer CustomProducts Plugin, wenn es denn kommt :slight_smile:

Bau doch einfach einen eigenen Controller :wink:

Du machst eine Kopie des jetzigen Controllers, nimmst alle nicht relevanten methods raus, definierst eine neue Route und setzt an der entsprechenden Stelle eine Random-ID. Dazu noch die Anpassung im Twig-Template (Den Block für den LineItem-Controller ändern) und schon sollte es funktionieren.

Wenn jedoch die selbe Konfiguration gestackt werden soll, dann kann man ja anhand der Konfigration und der Produkt-ID einen md5 erzeugen und als ID nehmen.

 

Und wieso muss die ID die echte sein? Man hat doch noch die Referenz-ID um auf das Ursprungsprodukt zuzugreifen.

Ich habe exakt das gleiche Problem. Ein Hinweis aus dem Gitter Chat war eine neue UUID für den Container zu erzeugen (Container beinhaltet Hauptprodukt plus mein custom LineItem). Dann kann ich beliebig viele Artikel des gleichen Produkts in unterschiedlichen Konfigurationen hinzufügen. Das klappt alles ohne Controller überschreiben usw…

Hallo,

das Problem habe ich auch.

Welche der Vorschläge ist denn nun umsetzbar und empfehlenswert?

Denn Controller sozusagen zu überschreiben sollte ja an sich nicht nötig sein, wenn Shopware das durchdacht hat.

Bzw. wie habt ihr denn das nun letztendlich umgesetzt mowlwurf?

Gruß,

Werner.