Yann - Prestaplugins Posted September 24, 2010 Share Posted September 24, 2010 Bonjour,Quelqu'un a t'il trouvé le moyen de bloquer l'ajout d'un produit dans le panier (en le retirant immédiatement par exemple) par un hook, afin de ne pas toucher au code prestashop.Il semblerait qu'après le hook "cart", l'objet $cart ne soit pas rafraichit, alors que notre hook a pu le modifier, et du coup mon produit apparait toujours, même si en réalité il n'y est plus... Link to comment Share on other sites More sharing options...
DevNet Posted September 24, 2010 Share Posted September 24, 2010 Bonjour,Peut-être grâce au hook "cart" : "Cart creation and update".A déclarer dans l'install du module : registerHook('cart') Visible sur classes/Cart.php : public function add($autodate = true, $nullValues = false) { $return = parent::add($autodate); Module::hookExec('cart'); return $return; } public function update($nullValues = false) { self::$_nbProducts = 0; $return = parent::update(); Module::hookExec('cart'); return $return; } A tester sur dans la classe du module pour la méthode à traiter : public function hookCart($params) { [...] } Bonne continuation Link to comment Share on other sites More sharing options...
Yann - Prestaplugins Posted September 24, 2010 Author Share Posted September 24, 2010 En fait j'ai mal formulé ma demande. Ce que je souhaite bloquer, c'est la quantité d'un article dans le panier.Je ne veux pas avoir plus d'1 produit XXX à la fois.J'ai donc essayé de faire un hookCart qui remet toujours la quantité à 1, comme tu le proposes, sauf qu'a priori (si je n'ai pas commis d'erreur), ce qui est retourné par la méthode add et update est le panier avant appel au hook, donc quoi qu'on fasse dans le hook (suppression de l'article fraichement ajouté par exemple, ou remise de la quantité à 1), l'objet $return n'est pas mis à jour, et le résultat affiché par le détail du panier ne tient pas compte de notre action. Il affiche par exemple toujours 2 comme quantité, alors qu'il n'y en a plus qu'un en réalité.Je suis obligé de rafraichir ma page pour avoir la bonne info, ce qui est plutôt génant. Link to comment Share on other sites More sharing options...
zeroual Posted February 10, 2011 Share Posted February 10, 2011 BonjourAvez trouvez la solution pour cette problématique. Je cherche la même chose si vous avez trouvez la solutionMerci pour votre aide Link to comment Share on other sites More sharing options...
Yann - Prestaplugins Posted February 10, 2011 Author Share Posted February 10, 2011 Oui je l'ai trouvé, mais j'ai été obligé de passer par une modification du code source du fichier order.php.J'y ai collé un morceau de code qui vérifie que le produit n'est qu'une seule fois dans le panier, et si ce n'est pas le cas, il remet la quantité à 1.Le défaut c'est que cela n'agit par sur l'ajout par Ajax, donc le panier peut très bien afficher 2 produits ou plus... mais lorsque le client déclenche le process de commande en déroulant les étapes, ça remet à 1, donc ce n'est pas trop génant.Il est possible de corriger le soucis du panier aussi, mais je ne voulais pas trop modifier le core, donc pour moi cela suffit... Link to comment Share on other sites More sharing options...
Asenar Posted February 10, 2011 Share Posted February 10, 2011 Bonjour Patanockcomme je disais donc dans le bug tracker, c'est une feature et pas un bug .Par curiosité, peux-tu nous faire partager le code que tu as modifié ? Link to comment Share on other sites More sharing options...
Yann - Prestaplugins Posted February 10, 2011 Author Share Posted February 10, 2011 Mon code n'a malheureusement rien à voir avec ce qu'il faudrait réellement modifier pour permettre d'intéragir avec le panier.Ce qu'il faudrait, comme expliqué dans le bugtracker, c'est recharger le panier après l'appel au hook cart dans les methode add et update de la classe Cart. Là, la variable $return est initialisé dès le début, et renvoyé en résultat, donc même si le hook agit sur le panier, cela n'est pas pris en compte immédiatement sur le site puisque c'est $return qui est utilisé pour rafraichir le panier.Il faut donc faire un refresh de la page, ou changer de page pour voir le résultat effectif de notre hook.Moi j'ai contourné le probleme, plutôt que de bloquer le produit a 1 seul exemplaire dans le panier (faisable par le hook, mais pas pris en compte immédiatement dans l'affichage), je le remets à 1 lors du process final d'achat.J'avais déjà dû modifier le fichier order.php pour rajouter des hooks qui n'existent pas en standard, donc plutôt que de toucher à la classe Cart.php, j'ai continué dans le fichier order.phpJe me suis contenté dans la méthode displaySummary du fichier order.php de faire ceci au tout début : function displaySummary() { global $smarty, $cart; Module::hookExec('sendsmsCheckCartForSms', array('cart' => $cart)); $cart = new Cart($cart->id); J'appelle mon hook, ma méthode check si mon produit est déjà dedans et si c'est le cas remet systématiquement la quantité à 1. public function checkCartForSms($params) { $cart = $params['cart']; $result = $cart->containsProduct(intval(Configuration::get('SENDSMS_ID_PRODUCT')), 0, null); if (!empty($result['quantity'])) { $cart->deleteProduct(intval(Configuration::get('SENDSMS_ID_PRODUCT'))); $cart->updateQty(1, intval(Configuration::get('SENDSMS_ID_PRODUCT'))); } } Ensuite je recharge mon panier pour prendre en compte les modifications dans la méthode displaySummary.J'aurais peut-être pu éviter cela en faisant un global $cart dans ma méthode, plutôt que de le passer en paramètre maintenant que j'y pense, ainsi il aurait théoriquement était modifié en live, sans besoin de le recharger.Je vois par ailleurs que je fais un delete du produit avant de le remettre, donc certainement que le updateQty se contente de rajouter la quantité passée en paramètre, mais je n'ai pas du trouver de méthode permettant de réinitialiser directement la valeur.Voilou, tu penses pouvoir intégrer cette demande dans une prochaine version de la classe Cart.php ? Link to comment Share on other sites More sharing options...
Asenar Posted February 10, 2011 Share Posted February 10, 2011 C'est vrai que limiter le nombre d'achats à un seul par produit pourrait être intéressant (même si les gens préfèrent vendre le plus possible en général !)Je garde ça sur un penses-bête et on verra plus tard Là on se concentre sur la release ! Link to comment Share on other sites More sharing options...
Yann - Prestaplugins Posted February 10, 2011 Author Share Posted February 10, 2011 Le but est pas forcément de limiter le nombre de produit.Une autre utilisation de ce hook pourrait être d'ajouter automatiquement un autre produit au panier lorsque tu ajoutes un produit bien particulier (produits liés, ou cadeau...), ou encore d'en enlever certains qui seraient incompatible entre eux... Bref, on peut surement trouver plein d'idées d'interaction, c'est juste dommage qu'un hook qui se déclenche sur ajout ou modification du panier ne soit pas pris en compte lors du 1er affichage de la page... Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now