अपने कस्टम मॉड्यूल में, निम्नलिखित जोड़ें config.xml
:
<models>
<salesrule>
<rewrite>
<quote_discount>Namespace_Module_Rewrite_SalesRule_Model_Quote_Discount</quote_discount>
</rewrite>
</salesrule>
</models>
<frontend>
<routers>
<checkout>
<args>
<modules>
<Namespace_Module before="Mage_Checkout">Namespace_Module_Checkout</Namespace_Module>
</modules>
</args>
</checkout>
</routers>
</frontend>
पहले के Mage_SalesRule_Model_Quote_Discount
लिए फिर से लिखना हैNamespace_Module_Rewrite_SalesRule_Model_Quote_Discount
दूसरा अतिभारित नियंत्रक है Mage_Checkout_CartController
अगला निम्नलिखित फ़ाइल जोड़ें app/code/community/Namespace/Module/controllers/Checkout/CartController.php
और निम्न कोड डालें:
<?php
require_once 'Mage/Checkout/controllers/CartController.php';
class Namespace_Module_Checkout_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');
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();
}
}
आप देखेंगे कि मैंने "," द्वारा सीमांकित कूपन कोड को जोड़ने के लिए एक खंड जोड़ा है। यह स्पष्ट रूप से अधिक परिष्कृत हो सकता है और आप अतिरिक्त चेकिंग आदि जोड़ना चाह सकते हैं, लेकिन यह कोड बल्ले से सीधे काम करना चाहिए।
और अंत में हमें उस टुकड़े को जोड़ना होगा जो सभी जादू करता है। फ़ाइल जोड़ेंapp/code/community/Namespace/Module/Rewrite/SalesRule/Model/Quote/Discount.php
और सामग्री जोड़ें:
<?php
class Namespace_Module_Rewrite_SalesRule_Model_Quote_Discount extends Mage_SalesRule_Model_Quote_Discount
{
/**
* 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);
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;
}
}
मूल रूप से, यह क्या करता है कूपन स्टिंग को तोड़ता है, प्रत्येक कूपन कोड के माध्यम से लूप करता है, उद्धरण योगों की गणना और अपडेट करता है।
परीक्षण करने के लिए, मेरे पास 2 शॉपिंग कार्ट नियम हैं:
- परीक्षण 1 - 10% उत्पाद मूल्य छूट - आगे के नियम प्रसंस्करण बंद करो: नहीं
- परीक्षण 2 - 10% उत्पाद मूल्य छूट - आगे के नियमों को रोकें प्रसंस्करण: नहीं
कोई कूपन नहीं:
जोड़ा गया कूपन परीक्षण 1:
जोड़ा गया कूपन परीक्षण 2
मैंने निश्चित राशि छूट के साथ परीक्षण किया है और यह उम्मीद के मुताबिक काम करता है।
और जैसा कि मैंने कहा, आपको अतिरिक्त जाँच जोड़ने की आवश्यकता हो सकती है, संभवतः डुप्लिकेट के लिए, लेकिन यह वह जगह है जहाँ आप शुरू करेंगे। सीमा के लिए, आप कुछ तर्क जोड़ सकते हैं जो कोड को विभाजित करते हैं, जो आप पसंद करते हैं या जैसा कि छोड़ते हैं।