victa Posted February 24, 2011 Share Posted February 24, 2011 Bonjour,Je suis en train de mettre en place une boutique pro qui proposera des produits aux pharmaciens, pour calculer les réductions sur la quantité, j'ai modifié la requête du panier pour trier les produits par catégorie par défaut, ce qui correspond pour moi à des laboratoires pharmaceutiques. Ensuite je somme les articles et si un "palier" de 12 articles par exemple est atteint pour un labo j'essaye d'ajouter un bon de réduction que j'ai crée dans le backoffice et stocké dans une table crée pour l'occasion comme suit : id_palier id_labo valeur reduc (l'id du bon) 1 1 12 3 2 1 24 4 3 3 12 2 Dans le fichier OrderOpcController.php (je suis sur la 1.4.11 pour l'instant), j'ai mis ce code ci. public function preProcess() { parent::preProcess(); /**********************************************************************************************************/ /*********************************** Liste des promos par labo/qte ****************************************/ /**********************************************************************************************************/ $result = Db::getInstance()->ExecuteS('SELECT labpal.valeur, labpal.reduc, SUM(cp.quantity) AS qte FROM `'._DB_PREFIX_.'labo` lab LEFT JOIN `'._DB_PREFIX_.'product` p ON p.id_category_default = lab.id_cat LEFT JOIN `'._DB_PREFIX_.'cart_product` cp ON p.id_product = cp.id_product LEFT JOIN `'._DB_PREFIX_.'labo_palier` labpal ON lab.id_labo = labpal.id_labo WHERE cp.`id_cart` = '.(int)$this->cart->id.' GROUP BY p.id_category_default'); foreach ($result as $row) { if( $this->cart->addDiscount( (int)$row['reduc'] )) { echo '<!-- numero de bon '.$row['reduc'].' -->'; } else { echo '<!-- bug -->'; } } Le code me retourne donc bien un commentaire "numéro de bon 3" en entête (avant la DTD). ce qui voudrais dire qu'il a ajouter la réduc au panier mais rien dans le panier, ni dans la base de donnée dans ps_cart_discount... quelqu'un aurait une idée ?PS : hélas je ne peux vous donner accès au site qui est privatisé par le module "privateshop". Link to comment Share on other sites More sharing options...
Broceliande Posted February 24, 2011 Share Posted February 24, 2011 Pour avoir le bon de réduc dans la BDD, il manquerait peut être un $cart->update(); juste après l'ajout?Pour que le bon s'affiche , il faudra faire un redirect sur l'ur actuelle pour recharger la page. Link to comment Share on other sites More sharing options...
Broceliande Posted February 24, 2011 Share Posted February 24, 2011 Un autre truc puisque tu est sur la 1.4 , tu modifies la classe directement ? ou bien tu la surcharges (/overrides)? Link to comment Share on other sites More sharing options...
victa Posted February 25, 2011 Author Share Posted February 25, 2011 J'ai essayé ces modifications que tu me suggère, par contre non, je ne surclasse pas n'étant pas trop sur de comment il faut procéder, tu aurais une piste ?J'ai donc mis if( $this->cart->addDiscount( (int)$row['reduc'] )) { $this->cart->update();} Et rien ne change, ni bon dans le résumé du panier, ni dans la base de donnée... Link to comment Share on other sites More sharing options...
victa Posted February 25, 2011 Author Share Posted February 25, 2011 C'est bon ! Pour les personnes intéressés et qui tomberait ici je poste ma solution (vraiment perso)Donc dans /override/controllers/OrderOpcController.php (éventuellement a créer) je met mon code maison <?php class OrderOpcController extends OrderOpcControllerCore { public function preProcess() { parent::preProcess(); /**********************************************************************************************************/ /*********************************** Liste des promos par labo/qte ****************************************/ /**********************************************************************************************************/ $result = Db::getInstance()->ExecuteS('SELECT reduc FROM '._DB_PREFIX_.'labo_palier INNER JOIN '._DB_PREFIX_.'labo ON '._DB_PREFIX_.'labo.id_labo = '._DB_PREFIX_.'labo_palier.id_labo INNER JOIN '._DB_PREFIX_.'product ON '._DB_PREFIX_.'labo.id_cat = '._DB_PREFIX_.'product.id_category_default INNER JOIN '._DB_PREFIX_.'cart_product ON '._DB_PREFIX_.'product.id_product = '._DB_PREFIX_.'cart_product.id_product WHERE '._DB_PREFIX_.'cart_product.id_cart = '.(int)$this->cart->id.' AND '._DB_PREFIX_.'cart_product.quantity >= '._DB_PREFIX_.'labo_palier.valeur GROUP BY CONCAT('._DB_PREFIX_.'labo_palier.id_labo,\'|\',valeur)'); $this->cart->deleteAllDiscount(); foreach ($result as $row) { $this->cart->addDiscount( (int)($row['reduc']) ) } /***********************************************************************************************************/ } } ?> Ce code a pour but de scanner deux tables maisons pour le panier courant et trouver les labos "contenus" dans le panier et leurs paliers de réduction. Chaque palier atteint donne droit à un bon de réduction créé dans le backoffice.Je l'ajoute donc automatiquement et je met à jour (pas besoin d'autre chose puisque ont est dans le preprocess, le bon s'affichera donc dans la liste des bons du client.Comme vous pouvez le voir aussi j'ai créé pour me simplifier la vie une nouvelle fonction au doux nom de deleteAllDiscount(), pour se faire dans le fichier /override/classes/Cart.php j'ai ajouté ceci : <?php class Cart extends CartCore { /* Supprime tous les bons du panier */ public function deleteAllDiscount() { return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_discount` WHERE `id_cart` = '.(int)($this->id).''); } } ?> Un peu violent je vous l'accord mais on pourrait imaginer une notation particulière des "bons automatiques" pour les exclure de cette fonction...Bon courage à tous. Link to comment Share on other sites More sharing options...
Broceliande Posted February 25, 2011 Share Posted February 25, 2011 Oui je devais te répondre avant mais pas eu le temps.Inutile donc que je te détaille la surcharge tu viens de le faire avec brio : je parie que ça va servir à beaucoup Ma suggestion du $cart-update() , faite à l'aveugle, n'avait finalement aucun intérêt dans ce cas précis, si on regarde de près la fonction addDiscout : public function addDiscount($id_discount) { return Db::getInstance()->AutoExecute(_DB_PREFIX_.'cart_discount', array('id_discount' => intval($id_discount), 'id_cart' => intval($this->id)), 'INSERT'); } L'insertion est fait directement et non en objet, pas besoin donc de recourir à update.Cela signifiait donc que soit addDiscount($id_discount) n'etait pas exécutée soit que l'id était erroné...Content que tu sois parvenu à tes fins. Link to comment Share on other sites More sharing options...
victa Posted February 25, 2011 Author Share Posted February 25, 2011 En fait la requete (que je viens de mettre à jour) fonctionne bien mais le soucis est que la réduction est affecté au total du panier (HT puisque ce sont des pros) mais pas au labo en question uniquement... forcément 5% sur 12 articles d'un labo n'équivaut pas à 5% sur une commande de 500€ au total... dont 12 articles d'un labo et le reste d'autres labos. 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