Ich habe einen seltsamen Fehler in Magento EE 1.14.2 (betrifft auch CE 1.9.2) mit dem Warenkorb gefunden.
Schritte zum Reproduzieren:
- Melden Sie sich als Kunde A an
- Produkt X in den Warenkorb legen
- Wechseln Sie zu einem anderen Browser
- Produkt X in den Warenkorb legen
- Melden Sie sich als Kunde A an
Erwarteter Warenkorb:
- 2 x Produkt X
Aktueller Warenkorb:
- 1 x Produkt X
- 1 x Produkt X
Dh die Produkte werden nicht zusammengeführt.
Anstatt den Browser zu wechseln, können Sie auch das Sitzungscookie löschen oder eine andere Menge für das Produkt auswählen.
Der schlimmste Nebeneffekt ist, dass die maximale Bestellmenge pro Artikel angewendet wird. In meinem Fall gab es einen Rabatt von 100% auf ein Produkt, aber Sie konnten es nur einmal bestellen. Mit diesem kleinen Trick können Sie es in jeder Menge kostenlos bestellen.
Warum passiert das und wie kann ich es verhindern?
quelle
unset()
Aufrufen auch "related_products" hinzufügen , dies ist jedoch immer noch nicht sicher, da der buyRequest-Option auch beliebige POST-Parameter hinzugefügt werden. Ich werde diese Option stattdessen komplett ignorieren.Es stellte sich heraus, dass dies ein Fehler ist
Mage_Sales_Model_Quote_Item::compare()
, der in Magento CE 1.9.2 / EE 1.14.2 eingeführt wurde. Die Methode wird verwendet, um Artikel zu vergleichen, um zu entscheiden, ob sie dasselbe Produkt sind und zusammengeführt werden können (beim Anmelden und beim Hinzufügen von Produkten zum Warenkorb).Beim Vergleich aller benutzerdefinierten Optionen sollten die nicht repräsen- tativen Optionen (
_notRepresentOptions
), dh die Option info_buyRequest , übersprungen werden .In früheren Magento-Versionen sah es so aus:
und funktionierte richtig. Nun sieht es so aus:
und die zusätzliche Prüfung auf
hasCustomOptions()
Ursachen den beschriebenen Fehler. Warum? Es sieht so aus, als ob die Prüfung hinzugefügt wurde, um Produkte mit benutzerdefinierten Optionen immer getrennt zu halten. Ich denke nicht, dass es Sinn macht, zumindest nicht in der Art, wie es implementiert wird, aber es wird einen Grund dafür geben, den ich nicht kenne.Allerdings
$item->getProduct()->hasCustomOptions()
gibt immer wahr für Zitat Artikel!Dies ist die Methode:
$this->_customOptions
Enthält aber auch dieinfo_buyRequest
Option aus dem Angebotsposten.Für eine unauffällige Lösung habe ich versucht, die
info_buyRequest
Option von allen Produkten in einem Beobachter zu entfernensales_quote_merge_before
, ohne Erfolg.Der Grund liegt darin,
Mage_Sales_Model_Quote_Item_Abstract::getProduct()
dass die Option erneut aus der Angebotsposition selbst kopiert wird:Lösung
Ich habe ein Umschreiben fürMage_Sales_Model_Quote_Item
mit einer Überschreibung für erstelltgetProduct()
, um dieinfo_buyRequest
Option an dieser Stelle nicht einzuschließen:public function getProduct() { $product = parent::getProduct(); $options = $product->getCustomOptions(); if (isset($options['info_buyRequest'])) { unset($options['info_buyRequest']); $product->setCustomOptions($options); } return $product; }
Dies führte zu Problemen mit Bundle-Produkten, der unten aufgeführten Alternative oder dem von @ AnnaVölkl beschriebenen offiziellen Patch
Alternative
Sie können die störenden Elemente
&& !$item->getProduct()->hasCustomOptions()
in dercompare()
Methode auch entfernen , wenn Sie das Elementmodell dennoch umschreiben. Ich weiß nicht, welches Problem es zu lösen versuchte, aber es schuf mehr ...Update 29. Januar 2016
Ich habe dies Magento gemeldet und die Antwort erhalten, dass das Problem nicht reproduziert werden konnte, sodass der Patch nicht in die Community-Edition (Submission APPSEC-1321) aufgenommen werden kann.
Das heißt, wenn Sie das Problem haben, müssen Sie den Enterprise-Patch SUPEE-6190 nach jedem Update anwenden oder stattdessen ein Class Rewrite verwenden.
quelle
However, $item->getProduct()->hasCustomOptions() always returns true for quote items!
Es überprüft die Produktdaten auf kundenspezifische Wahlen, nicht das Anführungsstricheinzelteil :)Wie ich sehen kann, ist die obige Antwort bereits in der neuesten Version von Magento verfügbar, aber wir bekamen immer noch das Problem. Es hat nicht funktioniert, weil wir viele Anpassungen vorgenommen haben. Ich dachte daran, die Lösung zu teilen.
Für uns war es sehr einfach, da wir nur einfache Produkte verwenden. Deshalb haben wir die Funktion zum Vergleichen von Quotenzusammenführungen folgendermaßen erweitert:
NS_Module_Model_Sales_Quote_Item erweitert Mage_Sales_Model_Quote_Item {
}
und fügte hinzu
aber. Für diejenigen, die auch konfigurierbare Produkte verwenden, ist dies möglicherweise nicht hilfreich. In diesem Fall können Sie beide Arrays drucken: $ itemOptionValue und $ optionValue und den Unterschied sehen. Deaktivieren Sie alle zusätzlichen Schlüssel, die in beiden Arrays nicht gemeinsam sind. Das sollte das Problem lösen.
quelle
Sie können dem Produkt im Ereignis sales_quote_add_item einfach eine Option hinzufügen:
Referenzlink: Zusammenführung von Warenkorbpositionen deaktivieren?
quelle