Jump to content

[Panier] - Comment Limiter La Quantité D'ajout Au Panier ?


Recommended Posts

Bonjour,

 

Je souhaiterais savoir s'il est possible de paramétrer une quantité maximale d'ajout au panier.

 

C'est à dire, je souhaite que l'internaute ne puisse jamais commander plus de 5 quantités pour chaque produit de son panier pour sa commande.

 

C'est réalisable ?

 

Est-il aussi possible de désactiver le bouton panier sur la fiche produit lorsque le maximum a été atteint ? ou afficher un message lui prévenant que sa quantité maximale a été atteinte ?

 

Merci de votre aide.

Link to comment
Share on other sites

Et donc ? Qu'en avez vous déduit sur moi ? Que je ne connais rien de tout cela ? (vous avez jugé en quelques lignes ?)

 

Je recherche juste un tutorial ou des exemples de code, pas des jugements.

 

Et si je suis venu ici, c'est pas pour coder moi-même, mais savoir comment d'autres ont fait d'abord.

 

Merci de rester dans le contexte et d'éviter de faire perdre du temps.

Edited by Perspikas (see edit history)
Link to comment
Share on other sites

"C'est pas pour coder moi-même" et "je préfère une solution à effectuer dans le code"... Soit tu es schizophréne, soit tu n'as pas compris que je proposais une solution au besoin que tu énonçais au départ...

Mais effectivement, je ne vais plus perdre mon temps... bon courage !

Link to comment
Share on other sites

  • 2 weeks later...

Bonjour,

 

Le module Opart est bien pour limiter un produit simple, mais dès que vous avez une déclinaison du produit, cela ne marche plus (ou très mal) ..

 

Exemple :

Un sac qui a 2 déclinaisons : rouge et jaune. Si je veux le limiter à 2 exemplaires dans le panier je limite la déclinaison rouge à 2 et la jaune à 2.

Mais le consommateur peut acheter 2 de chaque et il repart avec 4 sacs ... (alors que je voulais limiter à 2 ce produit). Mais je ne peux pas bloquer mes déclinaisons à 1 car si le client veut 2 sac jaune il ne pourra pas nous plus.

 

Bref, ce module fait le job pour des problématiques très simpliste.

 

 

Pour apporter un peu de grains à moudre sur ce type d'intégration "main dans le code", voici comment tu peux procéder sans faire de module :

 

OVERRIDE de CartController.php qui se situe dans /controllers/front/CartController

 

C'est la fonction : protected function processChangeProductInCart() qui va nous intéresser (dès qu'il y a un mouvement dans le panier cette fonction est sollicitée )

XX = l'ID du produit que tu veux limiter
/**
* Limite quantité produit panier
* $this->id_product = Identifiant du produit à limiter
* $qty_to_check = Quantité du produit qui sera présente dans le panier après ajout.
* $this->qty = Quantité du produit actuellement demandé
*
*/

if ($this->id_product == XX){

    /* Parcourir le panier pour chaque produit qui est dans le panier
     * $cart_product['id_product'] = ID du produit
     * $cart_product['quantity'] = Quantité du produit
     */

    foreach ($cart_products as $cart_product)
    {
        // Compte le nombre de quantité du produit
        if ($cart_product['id_product'] == XX) {
            $produitLimiterQuantity = $cart_product['quantity']+$produitLimiterQuantity;
        }
    }

    // Empèche de commander plus de XX déclinaisons du produit
    if ($produitLimiterQuantity >=XX) {
        $this->errors[] = sprintf(Tools::displayError('Vous ne pouvez pas commander plus XX quantité de ce produit' , false), $produitLimiterQuantity);    
     }
}    

Dans ton thème (pour la partie Front)

Ici **nombre** = 2

 

Product.tpl : 

 

Ajoute un script JS qui va traquer l'ajout d'une quantité > à **nombre** . Cela n'empêche rien mais ça évite déjà que ton utilisateur puisse faire + sur la quantité alors que celle ci est limité.

<script>
$( ".product_plus" ).click(function() {
    if ($("#quantity_wanted").val() <= 1) {

        $(".product_plus").hide();
        document.getElementById("erreur-qty").innerHTML = "Vous ne pouvez pas commander plus de 2 échantillons";
    };
});

$( ".product_minus" ).click(function() {

    if ($("#quantity_wanted").val() == 2) {

        $(".product_plus").show();
        document.getElementById("erreur-qty").innerHTML = "";
    };
});

$( "#quantity_wanted" ).change(function() {
    if ($("#quantity_wanted").val() >= 2) {
        document.getElementById("erreur-qty").innerHTML = "Vous ne pouvez pas commander plus de 2 échantillons";
        $("#quantity_wanted").val(2);
    }else{
        $(".product_plus").show();
        document.getElementById("erreur-qty").innerHTML = "";
    };

});
    
</script>

Ce script ce interagit sur cette partie là du code (la gestion de la quantité) :

<input type="text" name="qty" id="quantity_wanted" class="cart_quantity_inputNew" value="{if isset($quantityBackup)}{$quantityBackup|intval}{else}{if $product->minimal_quantity > 1}{$product->minimal_quantity}{else}1{/if}{/if}" size="2" maxlength="3" {if $product->minimal_quantity > 1}onkeyup="checkMinimalQuantity({$product->minimal_quantity});"{/if} />

<div class="product_num_buttons right">
    <div class="product_plus"> + </div>
    <div class="product_minus"> - </div>
</div>

shopping-cart-product-line.tpl

 

Dans ce fichier tu va intéragir dans le panier directement en fonction de la quantité. Pour cibler juste, voici 2 conditions :

<!-- XX = l'ID du produit que tu veux limiter -->
{if $product.id_product == xx }

<!-- YY = la quantité max -->
{if $product.cart_quantity-$quantityDisplayed >=YY

Avec ça, tu peux déjà gérer ton problème correctement.

 

Bonne journée!

Edited by NicolasV (see edit history)
Link to comment
Share on other sites

Bonjour,
 
J'utilise Prestashop 1.6
 
je ne sais pas si ça peut aider. j'ai cherché moi aussi à limiter le nombre d'ajout dans le panier et je suis tombée sur ce topic .
 
Il suffit de rajouter les lignes de codes indiquées dans le fichier Cart.php (prestashop/classes/Cart.php), vers la ligne 944.
 
 

 /* If we have a product combination, the minimal quantity is set with the one of this combination */
        if (!empty($id_product_attribute)) {
            $minimal_quantity = (int)Attribute::getAttributeMinimalQty($id_product_attribute);
        } else {
            $minimal_quantity = (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]);
        }


        Hook::exec('actionBeforeCartUpdateQty', array(
            'cart' => $this,
            'product' => $product,
            'id_product_attribute' => $id_product_attribute,
            'id_customization' => $id_customization,
            'quantity' => $quantity,
            'operator' => $operator,
            'id_address_delivery' => $id_address_delivery,
            'shop' => $shop,
            'auto_add_cart_rule' => $auto_add_cart_rule,
        ));


        if ((int)$quantity <= 0) {
            return $this->deleteProduct($id_product, $id_product_attribute, (int)$id_customization);
        } elseif (!$product->available_for_order || (Configuration::get('PS_CATALOG_MODE') && !defined('_PS_ADMIN_DIR_'))) {
            return false;
} elseif ($quantity >1) { //1 produit max par declinaison autorisé
return false;
        } else {
            /* Check if the product is already in the cart */
            $result = $this->containsProduct($id_product, $id_product_attribute, (int)$id_customization, (int)$id_address_delivery);


            /* Update quantity if product already exist */
            if ($result) {
                if ($operator == 'up') {
                    $sql = 'SELECT stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity
FROM '._DB_PREFIX_.'product p
'.Product::sqlStock('p', $id_product_attribute, true, $shop).'
WHERE p.id_product = '.$id_product;


                    $result2 = Db::getInstance()->getRow($sql);
                    $product_qty = (int)$result2['quantity'];
                    // Quantity for product pack
                    if (Pack::isPack($id_product)) {
                        $product_qty = Pack::getQuantity($id_product, $id_product_attribute);
                    }
                    $new_qty = (int)$result['quantity'] + (int)$quantity;
if ($new_qty >1) {//1 produit max par declinaison autorisé
return false;}
                    $qty = '+ '.(int)$quantity;


                    if (!Product::isAvailableWhenOutOfStock((int)$result2['out_of_stock'])) {
                        if ($new_qty > $product_qty) {
                            return false;
                        }
                    } 

 
J'ai limité à 1 produit dans mon cas, car je vends des produits téléchargeables. Je n'utilise pas les fiches produits pour les produits virtuels car j'ai des déclinaisons sur certains produits.
 
Après avoir fait les modifs, mon client va sur la fiche produit, ajoute le produit une fois, et s'il veut ajouter le même encore une fois, un message d'erreur s'affiche genre " vous avez atteint la quantité limite", un truc comme ça. Dans le récapitulatif de commande non-plus il ne peut pas ajouter plus de produits.
 
J'ai vérifié si mon client pouvait ajouter le même produit avec des déclinaisons différentes, et c'est le cas.
 
C'est 4 lignes de codes à tout casser. ( là où il y a //1 produit max par declinaison autorisé)
 
Ensuite pour ce qui est du message d'erreur, je suppose qu'il faut modifier les messages de la gestion des stocks. Je n'ai pas encore réglé ce détail. 
 
Voilà. Bonne journée.

Edited by Claire B (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...