Jump to content

[Résolu] Fonction Cart->RemoveCartRule() qui ne supprime pas la règle du panier


cryoth

Recommended Posts

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 by cryoth (see edit history)
Link to comment
Share on other sites

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

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

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 by cryoth (see edit history)
Link to comment
Share on other sites

    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.

  • Thanks 1
Link to comment
Share on other sites

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

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

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 ;)

  • Like 1
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...