Supprimer le merge des paniers
Sur presque tous les projets Magento sur lesquels j'ai eu l'occasion de travailler il est apparu nécessaire de désactiver le merge du panier du client avec celui du visiteur lors de la connexion.
Pour cela nous devons commencer par identifier l'évènement lancé par Magento qui puisse nous permettre de supprimer ce fameux « merge » car aucune option en admin nous permet de l'empêcher.
Identifier l'évènement
Il suffit d'investiguer un peu :
Objet Mage_Sales_Model_Quote
, qui est donc notre objet « panier » :
Ligne 1678 : public function merge(Mage_Sales_Model_Quote $quote)
.
Pour vérifier que notre merge passe bien par là on y place un log : Mage::log(__METHOD__ . ':' . __LINE__);
.
On se connecte, on ajoute un produit à notre panier, on se déconnecte, on ajoute un produit dans notre panier et on se connecte à nouveau : là on a un log qui apparaît.
Nous avons trouvé sans trop de difficultés l'endroit où est fait le merge.
On remarque dans la méthode le lancement d'un évènement intéressant :
A partir de là on déduit que l'évènement est sales_quote_merge_before
et que ces deux données sont :
- Le panier
quote
: panier du client - Le panier
source
: panier du visiteur
La construction du module
- Un modèle
Observer
quicatch
notre évènement et qui vide le panier du client. - Un helper
Data
qui nous permet de savoir si notre module est activé et si on peut vider le panier du client quand celui du visiteur est vide. - Un fichier
system.xml
qui nous permet d'ajouter un peu de configuation (configuration utilisée dans le helper).
Le helper
Le helper n'est utilisé que pour savoir deux choses :
- Notre module est-il activé ? Ou plutôt, pouvons-nous supprimer le merge des paniers ? Via la méthode
isActive
. - Pouvons-nous vider le panier du client si le panier du visiteur est vide ? Via la méthode
cleanIfEmpty
.
Le modèle
Le modèle catch
notre évènement est vide le panier du client que si les conditions suivantes sont validées :
- Notre module est actif.
- Le panier du visiteur a des produits OU on peut vider le panier du client si le panier du visiteur est vide.
Le system.xml
Le system.xml
permet d'ajouter un peu de configuration, tout simplement.
Nous ne nous prenons pas la tête avec les ACL
car ils sont déjà gérés par Magento pour cette partie de la configuration.
Conclusion
Il est en réalité assez simple, à présent, via le module complet, ou en suivant les étapes de cet article, de supprimer le merge des paniers du visiteur et du client lors de la connexion de notre client.
Vous trouverez le code complet du module sur github.