Saya menemukan bug aneh di Magento EE 1.14.2 (juga mempengaruhi CE 1.9.2) dengan troli.
Langkah-langkah untuk mereproduksi:
- Masuk sebagai pelanggan A
- Tambahkan produk X ke troli
- Beralih ke browser lain
- Tambahkan produk X ke troli
- Masuk sebagai pelanggan A
Troli yang diharapkan:
- 2 x Produk X
Kereta aktual:
- 1 x Produk X
- 1 x Produk X
Yaitu produk tidak digabung.
Alih-alih beralih browser, Anda juga dapat menghapus cookie sesi atau memilih jumlah yang berbeda untuk produk.
Efek samping terburuk dari ini adalah bahwa kuantitas pesanan maksimum diterapkan per item. Dalam kasus saya, ada diskon 100% untuk suatu produk tetapi Anda hanya bisa memesannya satu kali. Dengan sedikit trik ini, Anda dapat memesannya dalam jumlah berapa pun, gratis.
Mengapa ini terjadi dan bagaimana saya bisa mencegahnya?
sumber
unset()
panggilan juga, tapi itu masih tidak aman karena parameter POST sewenang-wenang ditambahkan ke opsi buyRequest juga. Saya akan mengabaikan opsi ini sepenuhnya.Ternyata ini adalah bug
Mage_Sales_Model_Quote_Item::compare()
yang diperkenalkan di Magento CE 1.9.2 / EE 1.14.2. Metode ini digunakan untuk membandingkan item untuk memutuskan apakah mereka adalah produk yang sama dan dapat digabung (saat login dan ketika menambahkan produk ke troli).Saat membandingkan semua opsi khusus, itu harus melewati opsi yang tidak representantatif (
_notRepresentOptions
), yaitu opsi info_buyRequest .Dalam versi Magento sebelumnya, tampilannya seperti ini:
dan bekerja dengan benar. Sekarang terlihat seperti ini:
dan pemeriksaan tambahan untuk
hasCustomOptions()
penyebab bug yang dijelaskan. Mengapa? Sepertinya cek telah ditambahkan untuk selalu menjaga produk dengan opsi khusus terpisah. Saya pikir itu tidak masuk akal, paling tidak dalam cara penerapannya, tetapi akan ada beberapa alasan untuk itu yang tidak saya sadari.Namun,
$item->getProduct()->hasCustomOptions()
selalu kembali benar untuk item kutipan!Inilah metodenya:
Tetapi
$this->_customOptions
juga berisiinfo_buyRequest
opsi dari item kutipan.Untuk solusi yang tidak mengganggu, saya mencoba untuk menghapus
info_buyRequest
opsi dari semua produk di pengamatsales_quote_merge_before
, tanpa hasil.Alasannya terletak di
Mage_Sales_Model_Quote_Item_Abstract::getProduct()
mana opsi disalin lagi dari item kutipan itu sendiri:Larutan
Saya membuat penulisan ulang untukMage_Sales_Model_Quote_Item
dengan menimpagetProduct()
agar tidak menyertakaninfo_buyRequest
opsi pada saat ini:public function getProduct() { $product = parent::getProduct(); $options = $product->getCustomOptions(); if (isset($options['info_buyRequest'])) { unset($options['info_buyRequest']); $product->setCustomOptions($options); } return $product; }
Ini menyebabkan masalah dengan produk bundel, alternatif di bawah ini atau tambalan resmi seperti yang dijelaskan oleh @ AnnaVölkl adalah solusi yang lebih baik
Alternatif
Anda juga bisa menghapus kesalahan
&& !$item->getProduct()->hasCustomOptions()
dalamcompare()
metode jika Anda menulis ulang model barang. Saya tidak tahu masalah apa yang coba dipecahkannya, tetapi itu menciptakan lebih banyak ...Perbarui 29 Jan 2016
Saya melaporkan ini ke Magento dan mendapat tanggapan bahwa mereka tidak dapat mereproduksi masalah, sehingga tambalan tidak akan membuatnya menjadi edisi komunitas (Submission APPSEC-1321).
Ini berarti, jika Anda memiliki masalah, Anda perlu menerapkan patch perusahaan SUPEE-6190 setelah setiap pembaruan atau menggunakan penulisan ulang kelas sebagai gantinya.
sumber
However, $item->getProduct()->hasCustomOptions() always returns true for quote items!
Ini sedang memeriksa data produk untuk opsi kustom bukan item kutipan :)Seperti yang saya lihat jawaban di atas sudah tersedia di versi terbaru Magento tapi kami masih mendapatkan masalah. Itu tidak berhasil karena kami telah melakukan banyak penyesuaian. Pikir berbagi solusi.
Bagi kami itu sangat sederhana karena kami hanya menggunakan produk sederhana. Jadi, kami memperluas fungsi membandingkan gabungan kutipan ke ini:
NS_Module_Model_Sales_Quote_Item meluas Mage_Sales_Model_Quote_Item {
}
dan ditambahkan
tapi. bagi mereka yang menggunakan produk yang dapat dikonfigurasi juga maka itu mungkin tidak membantu Anda. Dalam hal ini Anda dapat mencetak kedua array: $ itemOptionValue dan $ optionValue dan melihat perbedaannya. hapus semua kunci tambahan yang tidak umum di kedua array. Itu harus menyelesaikan masalah.
sumber
Anda bisa menambahkan opsi ke produk di acara sales_quote_add_item:
Tautan referensi: Nonaktifkan penggabungan posisi keranjang?
sumber