EE 1.14.2 / CE 1.9.2: Girişte doğru şekilde birleştirilmeyen teklif öğeleri (sepetteki kopya ürünler)


16

Magento EE 1.14.2'de (ayrıca CE 1.9.2'yi de etkiler) tuhaf bir hata buldum.

Yeniden oluşturma adımları:

  1. Müşteri A olarak oturum açın
  2. X ürününü sepete ekle
  3. Farklı bir tarayıcıya geçme
  4. X ürününü sepete ekle
  5. Müşteri A olarak oturum açın

Beklenen alışveriş sepeti:

  • 2 x Ürün X

Gerçek araba:

  • 1 x Ürün X
  • 1 x Ürün X

Yani ürünler birleştirilmez.

Tarayıcıyı değiştirmek yerine oturum çerezini temizleyebilir veya ürün için farklı bir miktar seçebilirsiniz.

Bunun en kötü yan etkisi, kalem başına maksimum sipariş miktarının uygulanmasıdır. Benim durumumda, bir üründe% 100 indirim vardı, ancak sadece bir kez sipariş verebilirsiniz. Bu küçük hile ile, herhangi bir miktarda, ücretsiz olarak sipariş edebilirsiniz.

Bu neden oluyor ve nasıl önleyebilirim?

Yanıtlar:


18

Yukarıdaki böcek güzel sarın Fabian!

Bu hata ile karşılaşacak olan diğer kullanıcılar için, bunun için Magento'dan bir yama zaten var.

Kurumsal bir müşteri olarak, bunu PATCH_SUPEE-6190_EE_1.14.2.0_v1.shdüzeltmek için istekte bulunabilirsiniz .

Güncelleme 24.02.2016: Bu aynı zamanda en son SUPEE-7405 v 1.1 yamasında da ele alındı. Twitter'da Fabian'a göre ( buna ve tweet'lere bakın ) hala tam olarak çözülmediği bir şans var. Lütfen kendiniz de test edin.

EE 1.14.2.0'da olduğu gibi çözüm:

diff --git a/app/code/core/Mage/Sales/Model/Quote/Item.php b/app/code/core/Mage/Sales/Model/Quote/Item.php
index 3554faa..d759249 100644
--- a/app/code/core/Mage/Sales/Model/Quote/Item.php
+++ b/app/code/core/Mage/Sales/Model/Quote/Item.php
@@ -502,8 +502,8 @@ class Mage_Sales_Model_Quote_Item extends Mage_Sales_Model_Quote_Item_Abstract
                         $itemOptionValue = $_itemOptionValue;
                         $optionValue = $_optionValue;
                         // looks like it does not break bundle selection qty
-                        unset($itemOptionValue['qty'], $itemOptionValue['uenc']);
-                        unset($optionValue['qty'], $optionValue['uenc']);
+                        unset($itemOptionValue['qty'], $itemOptionValue['uenc'], $itemOptionValue['form_key']);
+                        unset($optionValue['qty'], $optionValue['uenc'], $optionValue['form_key']);
                     }
                 }

Not: Genellikle burada EE kodu göndermezdim, ancak sorun / dosyalar CE'deki ile aynı olduğundan ve sadece EE özelliğini etkilemediğinden, umarım tamamdır.


4
Bunu onaylıyorum.
philwinkle

5
Kaymasına izin vereceğiz.
benmarks

1
Sonra kaydırın.
Marius

Bu, paket ürünlerle ilgili sorunlara neden olan düzeltmemden daha iyi çalışıyor. Paylaşım için teşekkürler!
Fabian Schmengler

1
"Related_products" parametresi yalnızca son durumda mevcut olduğu için maalesef ürünü bir kez ürün listesinden ve bir kez de ürün ayrıntı sayfasından eklerseniz bu atlanabilir. unset()Çağrılara da "related_products" ekleyebilirsiniz , ancak buyRequest seçeneğine herhangi bir keyfi POST parametresi de eklendiğinden hala güvenli değildir. Bunun yerine bu seçeneği tamamen görmezden geleceğim.
Fabian Schmengler

15

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->_customOptionsde içerir info_buyRequest.

Mütevazi bir çözüm için, info_buyRequestseçeneği bir gözlemcideki tüm ürünlerden sales_quote_merge_beforebaş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_Itemiç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.


However, $item->getProduct()->hasCustomOptions() always returns true for quote items!Alıntı öğe için değil özel seçenekler için ürün verilerini kontrol ediyor :)
kanevbgbe 12:18

1
@kanevbgbe şaşırtıcı bir şekilde, hayır. Magento, bir teklif öğesiyle ilişkilendirilmiş ürün örneğini "hazırlar" ve özel seçenek değerlerini ekler
Fabian Schmengler

Sepet eylemine ekleme işleminde ürün örneğinin tamamen yüklendiğini (teklif yüküne kıyasla), bu yüzden teklifin algoritmalarının doğrudan teklif öğesi örneğinden setProduct () ile ayarlandığını biliyorum, belki o zaman bu kontrol farklı bir çıktıya sahiptir. .
kanevbgbe

1

Gördüğüm gibi, yukarıdaki cevap Magento'nun en son sürümünde zaten mevcut ama yine de sorunu alıyorduk. İşe yaramadı çünkü çok fazla özelleştirme yaptık. Çözümü paylaşmayı düşündüm.

Bizim için sadece basit ürünler kullandığımız için çok basitti. Bu nedenle, alıntı birleştirme karşılaştırma işlevini şu şekilde genişlettik:

NS_Module_Model_Sales_Quote_Item, Mage_Sales_Model_Quote_Item {

public function compare($item) {
    if ($this->getProductId() == $item->getProductId()) {
        return true;
    }
    return parent::compare($item);
}

}

ve ekledi

<models>
   <sales>
      <rewrite>
         <quote_item>NS_Module_Model_Sales_Quote_Item</quote_item>
      </rewrite>
   </sales>
</models>

fakat. yapılandırılabilir ürünler kullananlar için size yardımcı olmayabilir. Bu durumda, her iki diziyi de yazdırabilirsiniz: $ itemOptionValue ve $ optionValue ve farkı görün. her iki dizide ortak olmayan tüm ek anahtarları kaldırın. Bu sorunu çözmek gerekir.


-1

Sales_quote_add_item etkinliğinde ürüne bir seçenek ekleyebilirsiniz:

$data['microtime'] = microtime(true);
$product->addCustomOption('do_not_merge', serialize($data));
$item->addOption($product->getCustomOption('do_not_merge'));

Referans bağlantısı: Alışveriş sepeti konumlarının birleştirilmesi devre dışı bırakılsın mı?


Bu geçici bir çözümdür, ancak birleştirme işleminin tamamen devre dışı bırakılması genellikle istenmez.
Fabian Schmengler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.