Bunun Mage_Sales_Model_Quote_Item::compare()
Magento CE 1.9.2 / EE 1.14.2'de tanıtılan bir hata olduğu ortaya çıktı. Yöntem, aynı ürün olup olmadıklarına ve birleştirilebileceğine karar vermek için öğeleri karşılaştırmak için kullanılır (giriş sırasında ve sepete ürün eklerken).
Tüm özel seçenekleri karşılaştırırken _notRepresentOptions
, temsili olmayan ( ) seçenekleri , yani info_buyRequest seçeneğini atlamalıdır .
Önceki Magento versiyonlarında şöyle görünüyordu:
foreach ($this->getOptions() as $option) {
if (in_array($option->getCode(), $this->_notRepresentOptions)) {
continue;
}
ve düzgün çalıştı. Şimdi şöyle görünüyor:
foreach ($this->getOptions() as $option) {
if (in_array($option->getCode(), $this->_notRepresentOptions)
&& !$item->getProduct()->hasCustomOptions()
) {
continue;
}
ve ek kontrol hasCustomOptions()
, açıklanan hataya neden olur. Neden? Özel seçeneklere sahip ürünleri her zaman ayrı tutmak için kontrol eklendi gibi görünüyor. En azından uygulandığı şekilde mantıklı olduğunu düşünmüyorum, ancak bunun farkında olmadığım bir nedeni olacak.
Ancak, $item->getProduct()->hasCustomOptions()
teklif öğeleri için her zaman doğru döner!
Bu yöntem:
public function hasCustomOptions()
{
if (count($this->_customOptions)) {
return true;
} else {
return false;
}
}
Ancak teklif öğesinden seçenek $this->_customOptions
de içerir info_buyRequest
.
Mütevazi bir çözüm için, info_buyRequest
seçeneği bir gözlemcideki tüm ürünlerden sales_quote_merge_before
başarıyla kaldırmaya çalıştım .
Nedeni Mage_Sales_Model_Quote_Item_Abstract::getProduct()
, seçeneğin teklif öğesinin kendisinden tekrar kopyalandığı yerde yatmaktadır :
public function getProduct()
{
$product = $this->_getData('product');
[...]
if (is_array($this->_optionsByCode)) {
$product->setCustomOptions($this->_optionsByCode);
}
return $product;
}
Çözüm
Bu noktada seçeneği dahil etmemek Mage_Sales_Model_Quote_Item
için bir geçersiz kılma ile yeniden yazma oluşturdum :getProduct()
info_buyRequest
public function getProduct()
{
$product = parent::getProduct();
$options = $product->getCustomOptions();
if (isset($options['info_buyRequest'])) {
unset($options['info_buyRequest']);
$product->setCustomOptions($options);
}
return $product;
}
Bu, paket ürünler, aşağıdaki alternatif veya @ AnnaVölkl tarafından açıklanan resmi yama ile ilgili sorunlara neden oldu.
Alternatif
Öğe modelini yine de yeniden yazıyorsanız && !$item->getProduct()->hasCustomOptions()
, compare()
yöntemdeki suçu da kaldırabilirsiniz . Hangi sorunu çözmeye çalıştığını bilmiyorum, ama daha fazlasını yarattı ...
Güncelleme 29 Ocak 2016
Bunu Magento'ya bildirdim ve sorunu yeniden üretemedikleri cevabını aldım, bu yüzden yama topluluk sürümüne girmeyecek (Gönderme APPSEC-1321).
Bu, sorununuz varsa, SUPEE-6190 kurumsal yamasını her güncellemeden sonra uygulamanız veya bunun yerine bir sınıf yeniden yazma işlemi kullanmanız gerektiği anlamına gelir.