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:
foreach ($this->getOptions() as $option) {
if (in_array($option->getCode(), $this->_notRepresentOptions)) {
continue;
}
und funktionierte richtig. Nun sieht es so aus:
foreach ($this->getOptions() as $option) {
if (in_array($option->getCode(), $this->_notRepresentOptions)
&& !$item->getProduct()->hasCustomOptions()
) {
continue;
}
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:
public function hasCustomOptions()
{
if (count($this->_customOptions)) {
return true;
} else {
return false;
}
}
$this->_customOptions
Enthält aber auch die info_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 entfernen sales_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:
public function getProduct()
{
$product = $this->_getData('product');
[...]
if (is_array($this->_optionsByCode)) {
$product->setCustomOptions($this->_optionsByCode);
}
return $product;
}
Lösung
Ich habe ein Umschreiben für Mage_Sales_Model_Quote_Item
mit einer Überschreibung für erstellt getProduct()
, um die info_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 der compare()
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.