Jump to content

Bloquer l'ajout d'un produit au panier, par un hook ?


Recommended Posts

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

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

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

  • 4 months later...

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

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.php

Je 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

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 :P !)

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

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... :D

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...