N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.
Edit 2015 :
Cette solution est datée, et n’est pas la plus pratique.
Préférez plutôt la solution proposée par le lien suivant : http://inchoo.net/magento/magento-maximum-allowed-order-amount/
Si pour une raison x ou y vous souhaitez limiter le montant maximum des commandes réalisées sur votre site ecommerce magentento, voici une solution rapide pour réaliser cette action.
( cette modification a été mise en place sur une version 1.4.1.1 de magento )
Pour réaliser cette action, nous allons ajouter une vérification du montant du panier, avant l’ajout de nouveaux éléments à celui-ci.
Ce comportement est géré dans le modèle du panier situé dans le fichier suivant app/code/core/Mage/Checkout/Model/Cart.php.
Pour commencer et avant toute modification, faites une copie de ce fichier dans le dossier app/code/local/Mage/Checkout/Model/Cart.php
Passons à présent au code , nous allons mettre en place une nouvelle variable qui contiendra le montant maximum du panier au format numérique.
/** * Montant maximum de la commande */ protected $_CartMaxAmount = '400'; |
Nous créons ensuite une fonction qui sera chargée de vérifier que le montant du panier est bien inférieur au montant défini dans notre variable précédente.
/** * Montant panier < Montant maximum de la commande ? * * @param float $productAmount * @return bool */ protected function _isCartAmountOk( $productAmount = '') { $Amount = Mage::getSingleton('checkout/cart')->getQuote()->getGrandTotal(); if ( ( $Amount + $productAmount ) <= $this->_CartMaxAmount ) { return true; } else { return false; } } |
Une fois cette fonction créée, il faut maintenant rajouter cette vérification dans les différents cas de modification du panier :
- Ajout d’un produit unique au panier
- Ajout de plusieurs produits au panier
- Mise à jour d’un produit du panier
Commençons par la fonction d’ajout d’un produit au panier :
/** * Add product to shopping cart (quote) * * @param int $productId * @param int $qty * @return Mage_Checkout_Model_Cart */ public function addProduct($product, $info=null) { $product = $this->_getProduct($product); $request = $this->_getProductRequest($info); //Check if current product already exists in cart $productId = $product->getId(); $items = $this->getQuote()->getAllItems(); $quoteProduct = null; foreach ($items as $item) { if ($item->getProductId() == $productId) { $quoteProduct = $item; break; } } if ($product->getStockItem()) { $minimumQty = $product->getStockItem()->getMinSaleQty(); //If product was not found in cart and there is set minimal qty for it if($minimumQty && $minimumQty > 0 && $request->getQty() < $minimumQty && $quoteProduct === null){ $request->setQty($minimumQty); } } /** * Only add product if shopping cart Amount < max cart amount */ if ( $this->_isCartAmountOk($product->getPrice()*$request->getQty())) { if ($product->getId()) { $result = $this->getQuote()->addProduct($product, $request); /** * String we can get if prepare process has error */ if (is_string($result)) { $this->getCheckoutSession()->setRedirectUrl($product->getProductUrl()); if ($this->getCheckoutSession()->getUseNotice() === null) { $this->getCheckoutSession()->setUseNotice(true); } Mage::throwException($result); } } else { Mage::throwException(Mage::helper('checkout')->__('The product does not exist.')); } Mage::dispatchEvent('checkout_cart_product_add_after', array('quote_item'=>$result, 'product'=>$product)); $this->getCheckoutSession()->setLastAddedProductId($product->getId()); } else { $this->getCheckoutSession()->addError(Mage::helper('checkout')->__('Your cart is over the cart max amount.')); } return $this; } |
Ensuite la fonction d’ajout de plusieurs produits au panier :
/** * Adding products to cart by ids * * @param array $productIds * @return Mage_Checkout_Model_Cart */ public function addProductsByIds($productIds) { $allAvailable = true; $allAdded = true; if (!empty($productIds)) { foreach ($productIds as $productId) { $productId = (int) $productId; if (!$productId) { continue; } $product = Mage::getModel('catalog/product') ->setStoreId(Mage::app()->getStore()->getId()) ->load($productId); if ($product->getId() && $product->isVisibleInCatalog()) { try { //Add Only product if cart amount < max cart amount if ( $this->_isCartAmountOk($product->getPrice())) { $this->getQuote()->addProduct($product); } else { $this->getCheckoutSession()->addError(Mage::helper('checkout')->__('%s was not added to your cart. Because your cart amount is over the allowed max amount.',$product->getName())); } } catch (Exception $e){ $allAdded = false; } } else { $allAvailable = false; } } if (!$allAvailable) { $this->getCheckoutSession()->addError( Mage::helper('checkout')->__('Some of the requested products are unavailable.') ); } if (!$allAdded) { $this->getCheckoutSession()->addError( Mage::helper('checkout')->__('Some of the requested products are not available in the desired quantity.') ); } } return $this; } |
Puis pour finir la fonction de mise à jour :
/** * Update cart items information * * @param array $data * @return Mage_Checkout_Model_Cart */ public function updateItems($data) { Mage::dispatchEvent('checkout_cart_update_items_before', array('cart'=>$this, 'info'=>$data)); //Variable pour afficher une seule fois le message d'erreur $MessageDisplayed = false; foreach ($data as $itemId => $itemInfo) { $item = $this->getQuote()->getItemById($itemId); if (!$item) { continue; } if (!empty($itemInfo['remove']) || (isset($itemInfo['qty']) && $itemInfo['qty']=='0')) { $this->removeItem($itemId); continue; } $qty = isset($itemInfo['qty']) ? (float) $itemInfo['qty'] : false; /* Récupération du prix de l'item */ $product = Mage::getModel('catalog/product')->setStoreId(Mage::app()->getStore()->getId()) ->load($item->getProductId()); $productPrice = $product->getPrice(); $productQty = isset($qty) ? (float) $qty - $item->getQty() : false ; if ( $this->_isCartAmountOk( $productPrice * $productQty)) { if ($qty > 0) { $item->setQty($qty); } Mage::dispatchEvent('checkout_cart_update_items_after', array('cart'=>$this, 'info'=>$data)); } else { if ( !$MessageDisplayed ) { $this->getCheckoutSession()->addError(Mage::helper('checkout')->__('Your cart is over the cart max amount.')); $MessageDisplayed = true; } } } return $this; } |
Une fois l’ensemble des ces modifications effectuée, notre limite de panier est en place.
Le fichier modifié est disponible ici : cart
Ce concept est juste un petit exemple peut être également amélioré en stockant le montant du panier maximum dans une variable de configuration par exemple 😉