Znalazłem dziwny błąd w Magento EE 1.14.2 (dotyczy również CE 1.9.2) z wózkiem.
Kroki ku reprodukcji:
- Zaloguj się jako klient A.
- Dodaj produkt X do koszyka
- Przełącz na inną przeglądarkę
- Dodaj produkt X do koszyka
- Zaloguj się jako klient A.
Oczekiwany koszyk:
- 2 x Produkt X
Rzeczywisty koszyk:
- 1 x Produkt X
- 1 x Produkt X
Oznacza to, że produkty nie zostały scalone.
Zamiast przełączania przeglądarki możesz również wyczyścić sesyjny plik cookie lub wybrać inną ilość dla produktu.
Najgorszym skutkiem ubocznym jest zastosowanie maksymalnej ilości zamówienia na sztukę. W moim przypadku produkt miał 100% zniżki, ale można go było zamówić tylko raz. Dzięki tej małej sztuczce możesz zamówić ją w dowolnej ilości, za darmo.
Dlaczego tak się dzieje i jak mogę temu zapobiec?
źródło
unset()
wywołań, ale nadal nie jest to bezpieczne, ponieważ dowolny parametr POST jest również dodawany do opcji buyRequest. Zamiast tego całkowicie zignoruję tę opcję.Okazało się, że jest to błąd,
Mage_Sales_Model_Quote_Item::compare()
który został wprowadzony w Magento CE 1.9.2 / EE 1.14.2. Ta metoda służy do porównywania produktów w celu ustalenia, czy są one tym samym produktem i mogą zostać połączone (podczas logowania i dodawania produktów do koszyka).Porównując wszystkie opcje niestandardowe, należy pominąć opcje, które nie są represantatywne (
_notRepresentOptions
), a mianowicie opcję info_buyRequest .W poprzednich wersjach Magento wyglądało to tak:
i działał poprawnie. Teraz wygląda to tak:
a dodatkowe sprawdzenie
hasCustomOptions()
powoduje opisany błąd. Dlaczego? Wygląda na to, że czek został dodany, aby zawsze przechowywać osobne produkty z niestandardowymi opcjami. Nie sądzę, żeby miało to sens, przynajmniej nie w sposobie jego implementacji, ale będzie jakiś powód, którego nie jestem świadomy.Jednak
$item->getProduct()->hasCustomOptions()
zawsze zwraca true dla pozycji cytując!To jest metoda:
Ale
$this->_customOptions
zawiera równieżinfo_buyRequest
opcję z pozycji cytatu.Aby uzyskać dyskretne rozwiązanie, próbowałem usunąć tę
info_buyRequest
opcję ze wszystkich produktów w obserwatorzesales_quote_merge_before
bezskutecznie.Powodem jest
Mage_Sales_Model_Quote_Item_Abstract::getProduct()
to, że opcja jest kopiowana ponownie z samego cytatu:Rozwiązanie
Utworzyłem przepisanieMage_Sales_Model_Quote_Item
z przesłonięciem,getProduct()
aby nie uwzględniaćinfo_buyRequest
opcji w tym momencie:public function getProduct() { $product = parent::getProduct(); $options = $product->getCustomOptions(); if (isset($options['info_buyRequest'])) { unset($options['info_buyRequest']); $product->setCustomOptions($options); } return $product; }
To spowodowało problemy z pakietami produktów, alternatywą poniżej lub oficjalną łatką opisaną przez @ AnnaVölkl jest lepszym rozwiązaniem
Alternatywny
Możesz również usunąć przestępstwo
&& !$item->getProduct()->hasCustomOptions()
wcompare()
metodzie, jeśli i tak przepisujesz model przedmiotu. Nie wiem, jaki problem próbował rozwiązać, ale stworzył więcej ...Aktualizacja 29 stycznia 2016 r
Zgłosiłem to Magento i otrzymałem odpowiedź, że nie mogą odtworzyć problemu, więc łatka nie pojawi się w wydaniu społecznościowym (Submission APPSEC-1321).
Oznacza to, że jeśli masz problem, musisz zastosować poprawkę korporacyjną SUPEE-6190 po każdej aktualizacji lub zamiast tego użyć przepisania klasy.
źródło
However, $item->getProduct()->hasCustomOptions() always returns true for quote items!
Sprawdza dane produktu pod kątem opcji niestandardowych, a nie cytat :)Jak widzę powyższa odpowiedź jest już dostępna w najnowszej wersji Magento, ale problem wciąż występował. Nie działało, ponieważ dokonaliśmy wielu dostosowań. Myśl o udostępnieniu rozwiązania.
Dla nas było to bardzo proste, ponieważ używamy tylko prostych produktów. Rozszerzyliśmy więc funkcję porównywania scalania cytatów o to:
NS_Module_Model_Sales_Quote_Item rozszerza Mage_Sales_Model_Quote_Item {
}
i dodał
ale. dla tych, którzy również używają produktów konfigurowalnych, może Ci to nie być pomocne. W takim przypadku możesz wydrukować obie tablice: $ itemOptionValue i $ optionValue i zobaczyć różnicę. odznacz wszystkie dodatkowe klucze, które nie są wspólne w obu tablicach. To powinno rozwiązać problem.
źródło
Możesz po prostu dodać opcję do produktu w przypadku sales_quote_add_item:
Odnośnik: Wyłącz scalanie pozycji koszyka?
źródło