Jump to content

Empêcher un client d'ajouter deux fois le même produit dans son panier


Recommended Posts

Salut tout le monde,

 

J'aimerais savoir comment faire pour qu'un client n'ait pas le droit d'ajouter deux fois le même produit dans son panier. Je vends des produits téléchargeables, et donc le client ne doit pas avoir la capacité d'acheter deux fois le même produit, j'ai envie de m'épargner la maintenance de devoir gérer les erreurs dans les commandes.

 

Savez-vous comment procéder?

 

Merci

Link to comment
Share on other sites

Tu peux surcharger la méthode updateqty de la classe Cart.php.

 

Dans le fichier classes/cart.php, tu remplaces la fonction:

public function updateQty($quantity, $id_product, $id_product_attribute = NULL, $id_customization = false, $operator = 'up')
{
 $product = new Product((int)$id_product, false, (int)Configuration::get('PS_LANG_DEFAULT'));
 /* If we have a product combination, the minimal quantity is set with the one of this combination */
 if (!empty($id_product_attribute))
  $minimalQuantity = (int)Attribute::getAttributeMinimalQty((int)$id_product_attribute);
 else
  $minimalQuantity = (int)$product->minimal_quantity;
 if (!Validate::isLoadedObject($product))
  die(Tools::displayError());
 if (isset(self::$_nbProducts[$this->id]))
  unset(self::$_nbProducts[$this->id]);
 if (isset(self::$_totalWeight[$this->id]))
  unset(self::$_totalWeight[$this->id]);
 if ((int)$quantity <= 0)
  return $this->deleteProduct((int)$id_product, (int)$id_product_attribute, (int)$id_customization);
 else if (!$product->available_for_order OR Configuration::get('PS_CATALOG_MODE'))
  return false;
 else
 {
  /* Check if the product is already in the cart */
  $result = $this->containsProduct((int)$id_product, (int)$id_product_attribute, (int)$id_customization);
  /* Update quantity if product already exist */
  if ($result)
  {
if ($operator == 'up')
{
 $result2 = Db::getInstance()->getRow('
  SELECT '.(!empty($id_product_attribute) ? 'pa' : 'p').'.`quantity`, p.`out_of_stock`
  FROM `'._DB_PREFIX_.'product` p
  '.(!empty($id_product_attribute) ? 'LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON p.`id_product` = pa.`id_product`' : '').'
  WHERE p.`id_product` = '.(int)($id_product).
  (!empty($id_product_attribute) ? ' AND `id_product_attribute` = '.(int)$id_product_attribute : ''));
 $productQty = (int)$result2['quantity'];
 $newQty = (int)$result['quantity'] + (int)$quantity;
 $qty = '+ '.(int)$quantity;
 if (!Product::isAvailableWhenOutOfStock((int)$result2['out_of_stock']))
  if ($newQty > $productQty)
   return false;
}
elseif ($operator == 'down')
{
 $qty = '- '.(int)$quantity;
 $newQty = (int)$result['quantity'] - (int)$quantity;
 if ($newQty < $minimalQuantity AND $minimalQuantity > 1)
  return -1;
}
else
 return false;
/* Delete product from cart */
if ($newQty <= 0)
 return $this->deleteProduct((int)$id_product, (int)$id_product_attribute, (int)$id_customization);
else if ($newQty < $minimalQuantity)
 return -1;
else
 Db::getInstance()->Execute('
 UPDATE `'._DB_PREFIX_.'cart_product`
 SET `quantity` = `quantity` '.$qty.', `date_add` = NOW()
 WHERE `id_product` = '.(int)$id_product.
 (!empty($id_product_attribute) ? ' AND `id_product_attribute` = '.(int)$id_product_attribute : '').'
 AND `id_cart` = '.(int)$this->id.'
 LIMIT 1');
  }
  /* Add product to the cart */
  else
  {
$result2 = Db::getInstance()->getRow('
SELECT '.(!empty($id_product_attribute) ? 'pa' : 'p').'.`quantity`, p.`out_of_stock`
FROM `'._DB_PREFIX_.'product` p
'.(!empty($id_product_attribute) ? 'LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON p.`id_product` = pa.`id_product`' : '').'
WHERE p.`id_product` = '.(int)$id_product.
(!empty($id_product_attribute) ? ' AND `id_product_attribute` = '.(int)$id_product_attribute : ''));
if (!Product::isAvailableWhenOutOfStock((int)$result2['out_of_stock']))
 if ((int)$quantity > $result2['quantity'])
  return false;
if ((int)$quantity < $minimalQuantity)
 return -1;
if (!Db::getInstance()->AutoExecute(_DB_PREFIX_.'cart_product', array('id_product' => (int)$id_product,
'id_product_attribute' => (int)$id_product_attribute, 'id_cart' => (int)$this->id,
'quantity' => (int)$quantity, 'date_add' => date('Y-m-d H:i:s')), 'INSERT'))
 return false;
  }
 }
 // refresh cache of self::_products
 $this->_products = $this->getProducts(true);
 $this->update(true);
 if ($product->customizable)
  return $this->_updateCustomizationQuantity((int)$quantity, (int)$id_customization, (int)$id_product, (int)$id_product_attribute, $operator);
 else
  return true;
}

 

Par le code suivant:

public function updateQty($quantity, $id_product, $id_product_attribute = NULL, $id_customization = false, $operator = 'up')
{
 $product = new Product((int)$id_product, false, (int)Configuration::get('PS_LANG_DEFAULT'));
 /* If we have a product combination, the minimal quantity is set with the one of this combination */
 if (!empty($id_product_attribute))
  $minimalQuantity = (int)Attribute::getAttributeMinimalQty((int)$id_product_attribute);
 else
  $minimalQuantity = (int)$product->minimal_quantity;
 if (!Validate::isLoadedObject($product))
  die(Tools::displayError());
 if (isset(self::$_nbProducts[$this->id]))
  unset(self::$_nbProducts[$this->id]);
 if (isset(self::$_totalWeight[$this->id]))
  unset(self::$_totalWeight[$this->id]);
 if ((int)$quantity <= 0)
  return $this->deleteProduct((int)$id_product, (int)$id_product_attribute, (int)$id_customization);
 else if (!$product->available_for_order OR Configuration::get('PS_CATALOG_MODE'))
  return false;
 else
 {
  /* Check if the product is already in the cart */
  $result = $this->containsProduct((int)$id_product, (int)$id_product_attribute, (int)$id_customization);
  /* Update quantity if product already exist */
  if ($result)
  {
return false;

/* Delete product from cart */
if ($newQty <= 0)
 return $this->deleteProduct((int)$id_product, (int)$id_product_attribute, (int)$id_customization);
else if ($newQty < $minimalQuantity)
 return -1;
else
 Db::getInstance()->Execute('
 UPDATE `'._DB_PREFIX_.'cart_product`
 SET `quantity` = `quantity` '.$qty.', `date_add` = NOW()
 WHERE `id_product` = '.(int)$id_product.
 (!empty($id_product_attribute) ? ' AND `id_product_attribute` = '.(int)$id_product_attribute : '').'
 AND `id_cart` = '.(int)$this->id.'
 LIMIT 1');
  }
  /* Add product to the cart */
  else
  {
$result2 = Db::getInstance()->getRow('
SELECT '.(!empty($id_product_attribute) ? 'pa' : 'p').'.`quantity`, p.`out_of_stock`
FROM `'._DB_PREFIX_.'product` p
'.(!empty($id_product_attribute) ? 'LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON p.`id_product` = pa.`id_product`' : '').'
WHERE p.`id_product` = '.(int)$id_product.
(!empty($id_product_attribute) ? ' AND `id_product_attribute` = '.(int)$id_product_attribute : ''));
if (!Product::isAvailableWhenOutOfStock((int)$result2['out_of_stock']))
 if ((int)$quantity > $result2['quantity'])
  return false;
if ((int)$quantity < $minimalQuantity)
 return -1;
if (!Db::getInstance()->AutoExecute(_DB_PREFIX_.'cart_product', array('id_product' => (int)$id_product,
'id_product_attribute' => (int)$id_product_attribute, 'id_cart' => (int)$this->id,
'quantity' => (int)$quantity, 'date_add' => date('Y-m-d H:i:s')), 'INSERT'))
 return false;
  }
 }
 // refresh cache of self::_products
 $this->_products = $this->getProducts(true);
 $this->update(true);
 if ($product->customizable)
  return $this->_updateCustomizationQuantity((int)$quantity, (int)$id_customization, (int)$id_product, (int)$id_product_attribute, $operator);
 else
  return true;
}

 

Ce empêche d'ajouter une deuxième fois un produit dans le panier. Le client peut mattre au panier par exemple 10 unités d'un produit A. Mais la deuxième fois, il lui interdira disant qu'il a atteint la quantité maximale pour ce produit.

 

Attention, il vaudrait mieux overrider la fonction dans le dossier override plutôt que de changer directement le fichier cart.php comme on a fait là.

Edited by franckm1000 (see edit history)
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...