Magento मल्टीपल कूपन कार्ट पर लागू होते हैं


9

मैं गाड़ी पर कई कूपन लगाने के लिए 2 दिनों से काम कर रहा हूं, मुझे पता है कि ऐसे मॉड्यूल हैं जो इसके लिए उपलब्ध हैं। लेकिन मैं इसका इस्तेमाल नहीं करना चाहता। मुझे कुछ कस्टम कोड चाहिए ताकि मैं सिंगल ऑर्डर में 1 से अधिक कूपन कोड लागू कर सकूं।

कृपया मदद कीजिए। मैं एक ही सामान पर काम करने के बाद बहुत थक गया हूं। यहां छवि विवरण दर्ज करें



Btw, आपका प्रश्न केवल मेरे द्वारा लिंक किए गए लिंक के समान है, जो कि 2013 से है।
टिम हॉलमैन

@ ~ मुझे नहीं लगता कि यह सबसे अच्छी विधि है, क्योंकि इसमें मैगेंटो के पारंपरिक तरीकों को दरकिनार करते हुए सीधे बिक्री तालिकाओं में कॉलम जोड़ना शामिल है। मैंने वास्तव में अब इसके साथ खेला, और 2 पुनर्लेखन और कोड की कुछ पंक्तियों के साथ, यह आसानी से प्राप्त किया जा सकता है। साथ ही उस लिंक में उत्तर केवल 2 कोड जोड़ने की अनुमति देता है। बीमार उत्तर में थोड़ा उत्तर दें
शौघन

@Shaughn pls अपना कोड पोस्ट करें।
ज़हीरबास

मुझे एक उदाहरण ज़िप दे सकते हैं, या अधिक विशिष्ट निर्देशिका कृपया धन्यवाद कर सकते हैं
अम्मालारा

जवाबों:


14

अपने कस्टम मॉड्यूल में, निम्नलिखित जोड़ें 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: जोड़ा कूपन परीक्षण 1

जोड़ा गया कूपन परीक्षण 2 जोड़ा कूपन परीक्षण 1

मैंने निश्चित राशि छूट के साथ परीक्षण किया है और यह उम्मीद के मुताबिक काम करता है।

और जैसा कि मैंने कहा, आपको अतिरिक्त जाँच जोड़ने की आवश्यकता हो सकती है, संभवतः डुप्लिकेट के लिए, लेकिन यह वह जगह है जहाँ आप शुरू करेंगे। सीमा के लिए, आप कुछ तर्क जोड़ सकते हैं जो कोड को विभाजित करते हैं, जो आप पसंद करते हैं या जैसा कि छोड़ते हैं।


उल्लेख करना भी भूल गए, आपको स्पष्ट रूप से अपने वास्तविक मॉड्यूल नाम, आदि के साथ नाम स्थान / मॉड्यूल को बदलने की आवश्यकता होगी
शौघन

संपादन के बाद इस जवाब अब यह ऊपर screenshot.now की तरह काम कर रहा है मैं कैसे कई कूपन लागू करने के बाद विशिष्ट कूपन रद्द कर सकते हैं।
ज़हीरब्बास

शुक्रिया शुगैन आपके उत्तर के लिए, इसने मेरे लिए मैगनेटो 1.9 पर काम किया, लेकिन मैं इसे 1.8 पर काम करने के लिए नहीं पा सका, यह ब्राउज़र में कुछ भी प्रदर्शित नहीं करता है और एपाचे एरर में मेमोरी साइज को समाप्त कर देता है। )
हरिस

हे सद्दाम, स्मृति समस्या शायद कई मुद्दों में से एक है, लेकिन आप क्या कर सकते हैं कोड को एक कोशिश में ब्लॉक में लपेटें और किसी भी त्रुटि को लॉग इन करें जो फसल हो जाती है। इसके अलावा php में अधिकतम मेमोरी सेटिंग की जांच करें और सुनिश्चित करें कि आपके पास पर्याप्त मेमोरी है उपलब्ध। लूप से ठीक पहले आप कूपन कोड गिन सकते हैं और जांच सकते हैं कि कितने हैं क्योंकि मुझे संदेह है कि कुछ मेमोरी में लोड हैं।
शौघन

1
समान कूपन कोड के एकाधिक उपयोग को आसानी से रोकने के लिए आप array_unique $ couponArray = array_unique (विस्फोट (',', $ कूपनकोड)) का उपयोग कर सकते हैं;
जूलियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.