Encontré un error extraño en Magento EE 1.14.2 (también afecta a CE 1.9.2) con el carrito.
Pasos para reproducir:
- Inicie sesión como cliente A
- Añade el producto X al carrito
- Cambiar a un navegador diferente
- Añade el producto X al carrito
- Inicie sesión como cliente A
Carrito esperado:
- 2 x producto X
Carro real:
- 1 x producto X
- 1 x producto X
Es decir, los productos no se fusionan.
En lugar de cambiar el navegador, también puede borrar la cookie de sesión o elegir una cantidad diferente para el producto.
El peor efecto secundario de esto es que se aplica la cantidad máxima de pedido por artículo. En mi caso, había un descuento del 100% en un producto, pero solo se podía pedir una vez. Con este pequeño truco, puedes pedirlo en cualquier cantidad, gratis.
¿Por qué sucede esto y cómo puedo evitarlo?
fuente
unset()
llamadas, pero aún así no es seguro porque cualquier parámetro POST arbitrario se agrega a la opción buyRequest también. Voy a ignorar esta opción por completo en su lugar.Resultó que este es un error
Mage_Sales_Model_Quote_Item::compare()
que se introdujo en Magento CE 1.9.2 / EE 1.14.2. El método se usa para comparar artículos para decidir si son el mismo producto y se pueden combinar (durante el inicio de sesión y al agregar productos al carrito).Al comparar todas las opciones personalizadas, debe omitir las opciones que no son representativas (
_notRepresentOptions
), es decir, la opción info_buyRequest .En versiones anteriores de Magento, se veía así:
Y funcionó correctamente. Ahora se ve así:
y la comprobación adicional de
hasCustomOptions()
causa el error descrito. ¿Por qué? Parece que el cheque se ha agregado para mantener siempre separados los productos con opciones personalizadas. No creo que tenga sentido, al menos no en la forma en que se implementa, pero habrá alguna razón de la que no estoy al tanto.Sin embargo,
$item->getProduct()->hasCustomOptions()
siempre devuelve verdadero para los artículos de cotizaciónEste es el método:
Pero
$this->_customOptions
también contiene elinfo_buyRequest
opción del artículo de presupuesto.Para una solución discreta, traté de eliminar la
info_buyRequest
opción de todos los productos en un observador ensales_quote_merge_before
, sin éxito.La razón radica en
Mage_Sales_Model_Quote_Item_Abstract::getProduct()
que la opción se copia nuevamente del artículo de presupuesto:Solución
Creé una reescrituraMage_Sales_Model_Quote_Item
con una anulación paragetProduct()
no incluir lainfo_buyRequest
opción en este punto:public function getProduct() { $product = parent::getProduct(); $options = $product->getCustomOptions(); if (isset($options['info_buyRequest'])) { unset($options['info_buyRequest']); $product->setCustomOptions($options); } return $product; }
Esto causó problemas con los productos combinados, la alternativa a continuación o el parche oficial descrito por @ AnnaVölkl es una mejor solución
Alternativa
También puede eliminar la infracción
&& !$item->getProduct()->hasCustomOptions()
en elcompare()
método si está reescribiendo el modelo del artículo de todos modos. No sé qué problema trató de resolver, pero creó más ...Actualización 29 de enero de 2016
Informé esto a Magento y obtuve la respuesta de que no podían reproducir el problema, por lo que el parche no entrará en la edición de la comunidad (Presentación APPSEC-1321).
Esto significa que, si tiene el problema, debe aplicar el parche empresarial SUPEE-6190 después de cada actualización o utilizar una reescritura de clase en su lugar.
fuente
However, $item->getProduct()->hasCustomOptions() always returns true for quote items!
Está comprobando los datos del producto para ver las opciones personalizadas, no el artículo de presupuesto :)Como puedo ver, la respuesta anterior ya está disponible en la última versión de Magento, pero aún recibimos el problema. No funcionó porque hemos hecho muchas personalizaciones. Pensé en compartir la solución.
Para nosotros fue muy simple, ya que solo utilizamos productos simples. Entonces, ampliamos la función de comparación de combinación de comillas a esto:
NS_Module_Model_Sales_Quote_Item extiende Mage_Sales_Model_Quote_Item {
}
y agregado
pero. para aquellos que también usan productos configurables, entonces podría no ser útil para usted. En ese caso, puede imprimir ambas matrices: $ itemOptionValue y $ optionValue y ver la diferencia. desarmar todas las claves adicionales que no son comunes en ambas matrices. Eso debería resolver el problema.
fuente
Simplemente puede agregar una opción al producto en el evento sales_quote_add_item:
Enlace de referencia: ¿ Deshabilitar fusión de posiciones de carro?
fuente