最近我在做的一个Magento项目中,有一个小的防欺诈功能。这个功能就是允许的最大订单金额。也许一开始听起来很奇怪,怎么会有人想限制订单的最大金额呢?鉴于该商店销售产品的性质(这里不能透露),这个功能要求似乎很合理。如果你看下Magento后台管理,你会在System > Configuration > Sales > Sales > Minimum Order Amount看到与它相反的功能。 最小订单金额功能和我们最大订单金额略有不同。最大的区别就是,你无法添加超出金额的商品到购物车。那么我们该如何做呢?答案很简单事件/监听(event/observer)系统。我们所要做的是找到相对应的时间并挂钩一个观测者。经过仔细追查,一些尝试和失败以后,最合乎逻辑的事件似乎是:sales_quote_save_before。此外,只实现最大订单金额功能在前端是有道理的,因为我们不希望限制管理员创建订单。考虑到这一点,我们只需要添加以下代码到我们扩展的config.xml文件中: <config> <frontend> <events> <sales_quote_save_before> <observers> <alwayly_maxorderamount_enforceSingleOrderLimit> <class>alwayly_maxorderamount/observer</class> <method>enforceSingleOrderLimit</method> </alwayly_maxorderamount_enforceSingleOrderLimit> </observers> </sales_quote_save_before> </events> </frontend> <config> 创建我们Observer.php,在类中添加逻辑: class Alwayly_MaxOrderAmount_Model_Observer { private $_helper; public function __construct() { $this->_helper = Mage::helper('alwayly_maxorderamount'); } /** * No single order can be placed over the amount of X */ public function enforceSingleOrderLimit($observer) { if (!$this->_helper->isModuleEnabled()) { return; } $quote = $observer->getEvent()->getQuote(); if ((float)$quote->getGrandTotal() > (float)$this->_helper->getSingleOrderTopAmount()) { $formattedPrice = Mage::helper('core')->currency($this->_helper->getSingleOrderTopAmount(), true, false); Mage::getSingleton('checkout/session')->addError( $this->_helper->__($this->_helper->getSingleOrderTopAmountMsg(), $formattedPrice)); Mage::app()->getFrontController()->getResponse()->setRedirect(Mage::getUrl('checkout/cart')); Mage::app()->getResponse()->sendResponse(); exit; } } } 这个方法的实现在代码的“Mage::getSingleton(‘checkout/session’)->addError() …”这行。这里触发sales_quote_save_before事件,当新添加的商品超过最大订单金额时,Magento不更新购物车。 (责任编辑:好模板) |