lundi 2 avril 2012

prestashop 1.4.X : imposer des commande par lot de quantité

La problématique du jour :
- Faire en sorte qu'un produit se commande par colisage imposés : par 2,4,6,8,10....
Donc, interdire, pour ce genre de produit, une commande de 3.

L'astuce :
Utiliser le champ "minimal_quantity" et un peu les maths, aussi...

Procédure
1- Le champ minimal_quantity devient le controleur des palliers de commande : on ne peut commander le produit que par multiple du minimum de Quantité minimale
Donc, dans la fiche du produit, on n'oublie pas de renseigner ce champ...

2- dans votre theme : product.js
On modifie la fonction
function checkMinimalQuantity

if ($('#quantity_wanted').val() < minimal_quantity)
devient
if ($('#quantity_wanted').val() % minimal_quantity !=0)

Oui, on utilise les modulos (caractère % en php) , qui affichent le reste d'une division. (pour faire simple, hein)


3- le controller du panier, histoire de bloquer ce pallier de commande partout, meme dans la page panier
fonction preProcess() du CartController (qui commence ligne 84 dans une verison 1.4.7)

ligne 176
après
 if (!sizeof($this->errors))
{


/* MODIF COMMANDE PAR LOT */
if ($add AND $qty >= 0)
{
if ((int)$idProductAttribute)
                        $minimal_quantity = Attribute::getAttributeMinimalQty((int)$idProductAttribute);
                     else
                        $minimal_quantity = $producToAdd->minimal_quantity;                

                     if ($qty % $minimal_quantity != 0)
                     {
                        $this->errors[] = Tools::displayError('Veuillez respecter le colisage ');
                     }
 
    /* FIN MODIF COMMANDE PAR LOTS */

Ensuite, le code se poursuit par

/* Product addition to the cart */
if (!isset(self::$cart->id) OR !self::$cart->id)
{
etc...

Voila !


3 commentaires:

  1. Super, merci pour cette astuce.

    RépondreSupprimer
  2. Bonjour,
    Je ne retrouve pas la fonction preProcess() dans la version 15.
    Savez-vous où faire la modification ?

    RépondreSupprimer
  3. Bonjour,

    Il faut le faire dans la fonction processChangeProductInCart() du CartController, le mieux étant de faire un Override de la fonction.

    Il faut sûrement adapter le code, car le CartController a été ré-écrit depuis la 1.4.

    RépondreSupprimer