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.