J'ai trouvé un bug bizarre dans Magento EE 1.14.2 (affecte également CE 1.9.2) avec le panier.
Étapes à reproduire:
- Connectez-vous en tant que client A
- Ajouter le produit X au panier
- Passer à un autre navigateur
- Ajouter le produit X au panier
- Connectez-vous en tant que client A
Panier prévu:
- 2 x produit X
Panier réel:
- 1 x produit X
- 1 x produit X
C'est-à-dire que les produits ne sont pas fusionnés.
Au lieu de changer de navigateur, vous pouvez également effacer le cookie de session ou choisir une quantité différente pour le produit.
Le pire effet secondaire est que la quantité maximale de commande est appliquée par article. Dans mon cas, il y avait une remise de 100% sur un produit mais vous ne pouviez le commander qu'une seule fois. Avec cette petite astuce, vous pouvez le commander gratuitement en n'importe quelle quantité.
Pourquoi cela se produit-il et comment puis-je l'empêcher?
la source
unset()
appels, mais ce n'est toujours pas sûr car tout paramètre POST arbitraire est également ajouté à l'option buyRequest. Je vais ignorer complètement cette option à la place.Il s'est avéré qu'il s'agit d'un bogue
Mage_Sales_Model_Quote_Item::compare()
introduit dans Magento CE 1.9.2 / EE 1.14.2. La méthode est utilisée pour comparer les articles pour décider s'ils sont le même produit et peuvent être fusionnés (lors de la connexion et lors de l'ajout de produits au panier).Lors de la comparaison de toutes les options personnalisées, il doit ignorer les options qui ne sont pas représentatives (
_notRepresentOptions
), à savoir l' option info_buyRequest .Dans les versions précédentes de Magento, cela ressemblait à ceci:
et a fonctionné correctement. Maintenant, cela ressemble à ceci:
et la vérification supplémentaire des
hasCustomOptions()
causes du bogue décrit. Pourquoi? Il semble que le chèque ait été ajouté pour toujours séparer les produits avec des options personnalisées. Je ne pense pas que cela ait du sens, du moins pas dans la manière dont il est mis en œuvre, mais il y a une raison à cela que je ne connais pas.Cependant,
$item->getProduct()->hasCustomOptions()
renvoie toujours vrai pour les articles de devis!Voici la méthode:
Mais
$this->_customOptions
contient également l'info_buyRequest
option de l'élément de devis.Pour une solution discrète, j'ai essayé de supprimer le
info_buyRequest
option de tous les produits dans un observateursales_quote_merge_before
, sans succès.La raison en est
Mage_Sales_Model_Quote_Item_Abstract::getProduct()
endroit où l'option est à nouveau copiée à partir de l'élément de devis lui-même:Solution
J'ai créé une réécriture pourMage_Sales_Model_Quote_Item
avec un remplacement pourgetProduct()
ne pas inclure l'info_buyRequest
option à ce stade:public function getProduct() { $product = parent::getProduct(); $options = $product->getCustomOptions(); if (isset($options['info_buyRequest'])) { unset($options['info_buyRequest']); $product->setCustomOptions($options); } return $product; }
Cela a causé des problèmes avec les produits groupés, l'alternative ci-dessous ou le patch officiel décrit par @ AnnaVölkl est une meilleure solution
Alternative
Vous pouvez également supprimer l'infraction
&& !$item->getProduct()->hasCustomOptions()
dans lecompare()
méthode si vous réécrivez de toute façon le modèle d'élément. Je ne sais pas quel problème il a essayé de résoudre, mais il en a créé plus ...Mise à jour du 29 janvier 2016
J'ai signalé cela à Magento et j'ai obtenu la réponse qu'ils ne pouvaient pas reproduire le problème, donc le correctif ne sera pas intégré dans l'édition communautaire (Soumission APPSEC-1321).
Cela signifie que si vous rencontrez le problème, vous devez appliquer le correctif d'entreprise SUPEE-6190 après chaque mise à jour ou utiliser une réécriture de classe à la place.
la source
However, $item->getProduct()->hasCustomOptions() always returns true for quote items!
Il vérifie les données du produit pour les options personnalisées, pas l'article de devis :)Comme je peux le voir, la réponse ci-dessus est déjà disponible dans la dernière version de Magento, mais nous rencontrions toujours le problème. Cela n'a pas fonctionné car nous avons fait beaucoup de personnalisations. Pensé à partager la solution.
Pour nous, c'était très simple car nous n'utilisons que des produits simples. Nous avons donc étendu la fonction de comparaison de fusion de devis à ceci:
NS_Module_Model_Sales_Quote_Item étend Mage_Sales_Model_Quote_Item {
}
et ajouté
mais. pour ceux qui utilisent également des produits configurables, cela pourrait ne pas vous être utile. Dans ce cas, vous pouvez imprimer les deux tableaux: $ itemOptionValue et $ optionValue et voir la différence. annule toutes les clés supplémentaires qui ne sont pas communes aux deux tableaux. Cela devrait résoudre le problème.
la source
Vous pouvez simplement ajouter une option au produit dans l'événement sales_quote_add_item:
Lien de référence: désactiver la fusion des positions du chariot?
la source