cryoth Posted July 22, 2020 Share Posted July 22, 2020 (edited) Bonjour à tous, Je souhaite créer un clone d'un panier existant pour un système d'abonnement, le 1er panier est récupéré et cloné avec la fonction duplicate(). Dans le cas ou il y a eut une offre spécifique sur le 1er achat je dois supprimer cette règle du panier qui a été cloné. En suivant les commentaires de la classe Cart je trouve "RemoveCartRule" (joie), mais lorsque je l'utilise, la règle ne semble pas être supprimée du panier. Voici mon code : $cart = new Cart($idCart); $result = $cart->duplicate(); if ($result['success']) { $new_cart = $result['cart']; $rules = $new_cart->getCartRules(); foreach ($rules as $rule) { $new_cart->removeCartRule($rule["id_cart_rule"]); } var_dump($new_cart, $new_cart->getCartRules()); } Mon panier cloné ($new_cart) affiche toujours la règle de prix malgré que removeCartRule() me retourne un résultat vrai. Aurais-je oublié quelquechose dans ma démarche ? Merci à tous ceux qui pourront m'aider. Edited July 24, 2020 by cryoth (see edit history) Link to comment Share on other sites More sharing options...
cryoth Posted July 22, 2020 Author Share Posted July 22, 2020 J'avance un peu dans mes recherches et j'ai trouvé que même en passant une requête de suppression à la place de RemoveCartRule() la suppression ne marche toujours pas et pourtant ma ligne Db::getInstance()->delete("cart_cart_rule", "id_cart = ".(int)$new_cart->id) Db::getInstance()->delete("cart_cart_rule", "id_cart = ".(int)$new_cart->id) me retourne bien une valeure "true" également ... Est-ce-que quelqu'un saurais me donner une piste de pourquoi mes règles ne se suppriment pas ? Link to comment Share on other sites More sharing options...
cryoth Posted July 23, 2020 Author Share Posted July 23, 2020 Je me rends compte que je n'ai pas précisé mais ces requêtes sont appelées via un module, et après vérification il n'y a pas de soucis de permission coté BDD. Y aurait-il une raison pour laquelle la requête me retourne un "true" alors que la requête ne s’exécute pas ? S'il-vous-plait quelqu'un ? Link to comment Share on other sites More sharing options...
Mediacom87 Posted July 23, 2020 Share Posted July 23, 2020 Salut, j'avoue que je te lance un truc sans test et je ne sais même pas si c'ets logique en développement de faire cela mais as tu essayer après ton foreach qui retirer les cartrules de faire un new_cart->update(); ? Link to comment Share on other sites More sharing options...
cryoth Posted July 23, 2020 Author Share Posted July 23, 2020 (edited) Merci pour ton retour @Mediacom87, j'ai essayé de passer un new_cart->update(); après ma boucle mais le résultat reste malheureusement le même. J'ai également tenté de vider tous les caches après l'update() mais rien n'y fait la règle du panier persiste et j'ai vérifié en BDD et la liaison sur la table "cart_cart_rule" reste présente malgré mes efforts. Je me demande si Prestashop peut empêcher la suppression de certains éléments comme les règles de panier, je sais que c'est vrai pour les Commandes qui ne peuvent être supprimés. Ce serait étonnant mais bon ... Edited July 23, 2020 by cryoth (see edit history) Link to comment Share on other sites More sharing options...
Mediacom87 Posted July 23, 2020 Share Posted July 23, 2020 Tu fais bien tout ce développement en ayant le mode débug d'activé ? 1 Link to comment Share on other sites More sharing options...
Mediacom87 Posted July 23, 2020 Share Posted July 23, 2020 public function removeCartRule($id_cart_rule) { Cache::clean('Cart::getCartRules_' . $this->id . '-' . CartRule::FILTER_ACTION_ALL); Cache::clean('Cart::getCartRules_' . $this->id . '-' . CartRule::FILTER_ACTION_SHIPPING); Cache::clean('Cart::getCartRules_' . $this->id . '-' . CartRule::FILTER_ACTION_REDUCTION); Cache::clean('Cart::getCartRules_' . $this->id . '-' . CartRule::FILTER_ACTION_GIFT); Cache::clean('Cart::getCartRules_' . $this->id . '-' . CartRule::FILTER_ACTION_ALL . '-ids'); Cache::clean('Cart::getCartRules_' . $this->id . '-' . CartRule::FILTER_ACTION_SHIPPING . '-ids'); Cache::clean('Cart::getCartRules_' . $this->id . '-' . CartRule::FILTER_ACTION_REDUCTION . '-ids'); Cache::clean('Cart::getCartRules_' . $this->id . '-' . CartRule::FILTER_ACTION_GIFT . '-ids'); $result = Db::getInstance()->delete('cart_cart_rule', '`id_cart_rule` = ' . (int) $id_cart_rule . ' AND `id_cart` = ' . (int) $this->id, 1); $cart_rule = new CartRule($id_cart_rule, Configuration::get('PS_LANG_DEFAULT')); if ((int) $cart_rule->gift_product) { $this->updateQty(1, $cart_rule->gift_product, $cart_rule->gift_product_attribute, null, 'down', 0, null, false); } return $result; } Tu remarquera à la fin que l'id_cart_rule est utilisé pour créer une nouvelle cartrule ... j'avoue que je ne me suis pas penché dessus, mais comme cela est ainsi fait depuis la 1.5 on peut estimer que tout est normal dans ce cas. 1 Link to comment Share on other sites More sharing options...
cryoth Posted July 23, 2020 Author Share Posted July 23, 2020 Oui je travail bien en mode debug, donc les modifications devraient bien s'appliquer. Concernant le fonction removeCartRule() elle est inchangée sur mon Prestashop je n'ai pas fait d'override non plus donc je penses que la fonction ne doit pas être en cause dans mon problème. Concernant la création d'une nouvelle cartrule à la fin de la fonction, elle ne dois normalement pas avoir d'incidence car elle n'est utlisée que pour les cas spécifique des produits offerts et dans mon cas je suis sur une règle de type "discount". Au final tout me reconduit sur la ligne : $result = Db::getInstance()->delete('cart_cart_rule', '`id_cart_rule` = ' . (int) $id_cart_rule . ' AND `id_cart` = ' . (int) $this->id, 1); elle me retourne une valeur "true" alors que la requête ne s'applique pas sur la BDD. Je penses que je dois chercher dans cette voie là ... Link to comment Share on other sites More sharing options...
cryoth Posted July 23, 2020 Author Share Posted July 23, 2020 Par acquis de conscience et aussi parce-que je n'ai plus aucune idée de ou chercher, j'ai tenté d’exécuter une requête de type select sur la table cart_cart_rule pour m'assurer que les requêtes arrivaient bien jusqu'à la BDD. Et tout semble normal, la requête Db::getInstance()->executeS('SELECT * FROM `' . _DB_PREFIX_ . 'cart_cart_rule`'); Me renvoi bien la liste complète des liaisons règle/Panier ... Je ne comprends plus ^^" en gros il n'y a que mes fonctiosn "DELETE" qui ne passent pas Link to comment Share on other sites More sharing options...
cryoth Posted July 23, 2020 Author Share Posted July 23, 2020 Je viens de trouver le pourquoi du comment ! Alors en vérifiant mes logs BDD j'ai vu que Prestashop execute bien la requete de suppression, MAIS il applique par dessus un nouvel insert() par la suite de la même valeur ! Et la seule fonction exécutée après ma suppression et mon update() est : $new_cart->getCartRules() $new_cart->getCartRules(); En regardant getCartRules() je m’aperçois qu'il existe dans cette fonction une option "autoadd" qui si elle n'est pas définie ajoute les Rules au Cart lorsqu'elle est exécutée ! public function getCartRules($filter = CartRule::FILTER_ACTION_ALL, $autoAdd = true) { // Define virtual context to prevent case where the cart is not the in the global context $virtual_context = Context::getContext()->cloneContext(); $virtual_context->cart = $this; // If the cart has not been saved, then there can't be any cart rule applied if (!CartRule::isFeatureActive() || !$this->id) { return array(); } if ($autoAdd) { CartRule::autoAddToCart($virtual_context); <-- ICI !!! } Donc en utilisant la fonction avec les paramètres suivants : $new_cart->getCartRules(CartRule::FILTER_ACTION_ALL, false); Plus de soucis, la suppression est bien faite et la règle du panier n'est pas recréée par dessus. Merci @Mediacom87 pour ton aide 1 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