Magento : Configurer un montant maximum de commande

Cet article est assez ancien, malgré toute l'attention que j' apporte à mes contenus il est possible que celui-ci ne soit plus d'actualité.
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 😉

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *