前台下单,使用多个coupon。
需要修改三个地方的代码
D:\www\lollicupStore2\app\code\local\Lollicupstore\Multiplecoupon\controllers\CartController.php
1.重新购物车控制器里面的方法、
<?php
/**
* Created by PhpStorm.
* User: lollicup
* Date: 2019/7/18
* Time: 15:05
*/
require_once 'Mage/Checkout/controllers/CartController.php';
class Lollicupstore_Multiplecoupon_CartController extends Mage_Checkout_CartController
{
/**
* Initialize coupon
*/
public function couponPostAction()
{
/**
* No reason continue with empty shopping cart
*/
if (!$this->_getCart()->getQuote()->getItemsCount()) {
$this->_goBack();
return;
}
$couponCode = (string) $this->getRequest()->getParam('coupon_code');
$couponArray= array_unique(explode(',',$couponCode));
if(in_array('TOSFREE',$couponArray)){
$this->_getSession()->addError(
$this->__('Coupon code "%s" is not valid.', Mage::helper('core')->escapeHtml($couponCode))
);
$this->_goBack();
return;
}
$couponCode = implode('',$couponCodeArray);
if ($this->getRequest()->getParam('remove') == 1) {
$couponCode = '';
}
$oldCouponCode = $this->_getQuote()->getCouponCode();
if (!strlen($couponCode) && !strlen($oldCouponCode)) {
$this->_goBack();
return;
}
try {
$codeLength = strlen($couponCode);
$isCodeLengthValid = $codeLength && $codeLength <= Mage_Checkout_Helper_Cart::COUPON_CODE_MAX_LENGTH;
// Combine multiple coupons
$couponFlag = true;
if ($isCodeLengthValid) {
$del = ',';
if ($oldCouponCode) {
if ($oldCouponCode == $couponCode) {
$couponCode = $oldCouponCode;
} else {
$couponCode = $oldCouponCode . $del . $couponCode;
}
}
} else {
$couponCode = '';
}
$this->_getQuote()->getShippingAddress()->setCollectShippingRates(true);
$this->_getQuote()->setCouponCode($couponCode)
->collectTotals()
->save();
if ($codeLength) {
if ($isCodeLengthValid && $couponFlag) {
$this->_getSession()->addSuccess(
$this->__('Coupon code "%s" was applied.', Mage::helper('core')->escapeHtml($couponCode))
);
} else {
$this->_getSession()->addError(
$this->__('Coupon code "%s" is not valid.', Mage::helper('core')->escapeHtml($couponCode))
);
}
} else {
$this->_getSession()->addSuccess($this->__('Coupon code was canceled.'));
}
} catch (Mage_Core_Exception $e) {
$this->_getSession()->addError($e->getMessage());
} catch (Exception $e) {
$this->_getSession()->addError($this->__('Cannot apply the coupon code.'));
Mage::logException($e);
}
$this->_goBack();
}
}
2. 重新下单的控制器(重写控制器的方法)
D:\www\lollicupStore2\app\code\local\Amasty\Scheckout\controllers\OnepageController.php
<?php
/**
* @author Amasty Team
* @copyright Copyright (c) 2019 Amasty (https://www.amasty.com)
* @package Amasty_Scheckout
*/
require_once 'Mage/Checkout/controllers/OnepageController.php';
class Amasty_Scheckout_OnepageController extends Mage_Checkout_OnepageController
{
const MESSAGE_TYPE_SUCCESS = 'success';
const MESSAGE_TYPE_ERROR = 'error';
public function couponPostAction(){
$response = array(
"html" => array(
"coupon" => array(
"message" => NULL,
"output" => NULL
)
)
);
$message = '';
$messageType = self::MESSAGE_TYPE_SUCCESS;
$output = &$response["html"]["coupon"]["output"];
$messagesBlock = $this->getLayout()->getMessagesBlock();
$couponCode = (string) $this->getRequest()->getParam('coupon_code');
$couponArray= array_unique(explode(',',$couponCode));
if(in_array('TOSFREE',$couponArray)){
$messageType = self::MESSAGE_TYPE_ERROR;
$message = $this->__('Coupon code "%s" is not valid.', Mage::helper('core')->escapeHtml($couponCode));
}else {
if ($this->getRequest()->getParam('remove') == 1) {
$couponCode = '';
}
$oldCouponCode = $this->getOnepage()->getQuote()->getCouponCode();
if (!strlen($couponCode) && !strlen($oldCouponCode)) {
} else {
$this->_reloadRequest();
try {
$codeLength = strlen($couponCode);
$isCodeLengthValid = $codeLength && $codeLength <= 255;
$this->getOnepage()->getQuote()->getShippingAddress()->setCollectShippingRates(true);
$this->getOnepage()->getQuote()->setCouponCode($isCodeLengthValid ? $couponCode : '')
->collectTotals()
->save();
if ($codeLength) {
if ($isCodeLengthValid && $couponCode == $this->getOnepage()->getQuote()->getCouponCode()) {
$message = $this->__('Coupon code "%s" was applied.', Mage::helper('core')->escapeHtml($couponCode));
} else {
$messageType = self::MESSAGE_TYPE_ERROR;
$message = $this->__('Coupon code "%s" is not valid.', Mage::helper('core')->escapeHtml($couponCode));
}
} else {
$message = $this->__('Coupon code was canceled.');
}
$output = $this->_getCouponHtml();
$this->getOnepage()->getQuote()->setTotalsCollectedFlag(false);
$this->getOnepage()->getQuote()->collectTotals();
$this->getOnepage()->getQuote()->save();
$response["html"]["review"] = $this->_getReviewHtml();
$response["html"]["shipping_method"] = $this->_getShippingMethodsHtml();
$response["html"]["payment_method"] = $this->_getPaymentMethodsHtml();
$response["html"]["base_grand_total_updated"] = $this->getQuoteBaseGrandTotal();
$response["html"]["is_ampromo_active"] = $this->isAmpromoEnable();
} catch (Mage_Core_Exception $e) {
$message = $e->getMessage();
$messageType = self::MESSAGE_TYPE_ERROR;
} catch (Exception $e) {
$message = $this->__('Cannot apply the coupon code.');
$messageType = self::MESSAGE_TYPE_ERROR;
Mage::logException($e);
}
}
}
if ($this->isAmpromoEnable()) {
Mage::getSingleton('core/session')->{'add' . ucfirst($messageType)}($message);
}
$messagesBlock->{'add' . ucfirst($messageType)}($message);
$response["html"]["coupon"]["message"] = $messagesBlock->toHtml();
$this->getResponse()->setBody(Mage::helper('core')->jsonEncode($response));
}
?>
3.最后是计算coupon的总价。直接重写model
D:\www\lollicupStore2\app\code\local\Mage\SalesRule\Model\Quote\Discount.php
<?php
/**
* Magento
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@magento.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade Magento to newer
* versions in the future. If you wish to customize Magento for your
* needs please refer to http://www.magento.com for more information.
*
* @category Mage
* @package Mage_SalesRule
* @copyright Copyright (c) 2006-2018 Magento, Inc. (http://www.magento.com)
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
*/
/**
* Discount calculation model
*
* @category Mage
* @package Mage_SalesRule
* @author Magento Core Team <core@magentocommerce.com>
*/
class Mage_SalesRule_Model_Quote_Discount extends Mage_Sales_Model_Quote_Address_Total_Abstract
{
/**
* Discount calculation object
*
* @var Mage_SalesRule_Model_Validator
*/
protected $_calculator;
/**
* Initialize discount collector
*/
public function __construct()
{
$this->setCode('discount');
$this->_calculator = Mage::getSingleton('salesrule/validator');
}
/**
* Collect address discount amount
*
* @param Mage_Sales_Model_Quote_Address $address
* @return Mage_SalesRule_Model_Quote_Discount
*/
public function collect(Mage_Sales_Model_Quote_Address $address)
{
Mage_Sales_Model_Quote_Address_Total_Abstract::collect($address);
$quote = $address->getQuote();
$store = Mage::app()->getStore($quote->getStoreId());
$this->_calculator->reset($address);
$items = $this->_getAddressItems($address);
if (!count($items)) {
return $this;
}
$couponCode = $quote->getCouponCode();
$couponArray = explode(',', $couponCode);
$couponArray = array_unique($couponArray);
foreach ($couponArray as $couponCode) {
$this->_calculator->init($store->getWebsiteId(), $quote->getCustomerGroupId(), $couponCode);
$this->_calculator->initTotals($items, $address);
$eventArgs = array(
'website_id' => $store->getWebsiteId(),
'customer_group_id' => $quote->getCustomerGroupId(),
'coupon_code' => $couponCode,
);
$address->setDiscountDescription(array());
$items = $this->_calculator->sortItemsByPriority($items);
foreach ($items as $item) {
if ($item->getNoDiscount()) {
$item->setDiscountAmount(0);
$item->setBaseDiscountAmount(0);
} else {
/**
* Child item discount we calculate for parent
*/
if ($item->getParentItemId()) {
continue;
}
$eventArgs['item'] = $item;
Mage::dispatchEvent('sales_quote_address_discount_item', $eventArgs);
if ($item->getHasChildren() && $item->isChildrenCalculated()) {
foreach ($item->getChildren() as $child) {
$this->_calculator->process($child);
$eventArgs['item'] = $child;
Mage::dispatchEvent('sales_quote_address_discount_item', $eventArgs);
$this->_aggregateItemDiscount($child);
}
} else {
$this->_calculator->process($item);
$this->_aggregateItemDiscount($item);
}
}
}
/**
* process weee amount
*/
if (Mage::helper('weee')->isEnabled() && Mage::helper('weee')->isDiscounted($store)) {
$this->_calculator->processWeeeAmount($address, $items);
}
/**
* Process shipping amount discount
*/
$address->setShippingDiscountAmount(0);
$address->setBaseShippingDiscountAmount(0);
if ($address->getShippingAmount()) {
$this->_calculator->processShippingAmount($address);
$this->_addAmount(-$address->getShippingDiscountAmount());
$this->_addBaseAmount(-$address->getBaseShippingDiscountAmount());
}
$this->_calculator->prepareDescription($address);
}
return $this;
}
/**
* Aggregate item discount information to address data and related properties
*
* @param Mage_Sales_Model_Quote_Item_Abstract $item
* @return Mage_SalesRule_Model_Quote_Discount
*/
protected function _aggregateItemDiscount($item)
{
$this->_addAmount(-$item->getDiscountAmount());
$this->_addBaseAmount(-$item->getBaseDiscountAmount());
return $this;
}
/**
* Add discount total information to address
*
* @param Mage_Sales_Model_Quote_Address $address
* @return Mage_SalesRule_Model_Quote_Discount
*/
public function fetch(Mage_Sales_Model_Quote_Address $address)
{
$amount = $address->getDiscountAmount();
if ($amount != 0) {
$description = $address->getDiscountDescription();
if (strlen($description)) {
$title = Mage::helper('sales')->__('Discount (%s)', $description);
} else {
$title = Mage::helper('sales')->__('Discount');
}
$address->addTotal(array(
'code' => $this->getCode(),
'title' => $title,
'value' => $amount
));
}
return $this;
}
}
4. 添加config.xml配置文件
<?xml version="1.0"?>
<config>
<modules>
<Lollicupstore_Multiplecoupon>
<version>0.1.0</version>
</Lollicupstore_Multiplecoupon>
</modules>
<frontend>
<routers>
<checkout>
<args>
<modules>
<Lollicupstore_Multiplecoupon before="Mage_Checkout">Lollicupstore_Multiplecoupon</Lollicupstore_Multiplecoupon>
</modules>
</args>
</checkout>
</routers>
</frontend>
</config>
5. 添加模块配置文件
D:\www\lollicupStore2\app\etc\modules\Lollicupstore_Multipelcoupon.xml
<?xml version="1.0" encoding="UTF-8" ?>
<config>
<modules>
<Lollicupstore_Multiplecoupon>
<active>true</active>
<codePool>local</codePool>
</Lollicupstore_Multiplecoupon>
</modules>
</config>