Magento Çoklu kupon arabaya uygulanır


9

Ben 2 gün boyunca çalışıyorum sepeti için birden fazla kupon uygulamak için bunun için kullanılabilir modüller olduğunu biliyorum. Ama kullanmak istemiyorum. Tek siparişte birden fazla kupon kodu uygulayabilmem için bazı özel kodlar istiyorum.

Lütfen yardım et. Aynı şeyler üzerinde çalıştıktan sonra çok yorgunum. resim açıklamasını buraya girin



Btw, sorunuz ürkütücü bir şekilde yukarıda bağladığım soruya benziyor, ki bu 2013'ten.
Tim Hallman

@Tim ~ ​​Bunun en iyi yöntem olduğunu düşünmüyorum, çünkü Magento'nun geleneksel yöntemlerini atlayarak doğrudan satış tablolarına sütun eklemeyi içeriyor. Aslında şimdi bununla oynadım ve 2 yeniden yazma ve birkaç kod satırı ile bu kolayca elde edilebilir. Ayrıca bu bağlantıdaki cevap yalnızca 2 kodun eklenmesine izin verir. Biraz cevap vereceğim
Shaughn

@ Shaughn pls kodunuzu gönderin.
Zaheerabbas

bana bir örnek zip verebilir, ya da daha spesifik dizinleri lütfen teşekkür 's
alexmalara

Yanıtlar:


14

Özel modülünüzde aşağıdakileri ekleyin 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>

Birinci bir yeniden yazma Mage_SalesRule_Model_Quote_DiscountiçinNamespace_Module_Rewrite_SalesRule_Model_Quote_Discount

İkincisi aşırı yüklenmiş kontrolör Mage_Checkout_CartController

Sonra aşağıdaki dosyayı app/code/community/Namespace/Module/controllers/Checkout/CartController.php ekleyin ve aşağıdaki kodu ekleyin:

<?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();
    }
}

"," İle ayrılmış kupon kodlarını birleştirmek için bir bölüm eklediğimi göreceksiniz. Bu açıkça daha rafine edilebilir ve ek kontrol vb eklemek isteyebilirsiniz, ancak bu kod yarasa kapalı çalışmalıdır.

Ve son olarak tüm büyüyü yapan parçayı eklememiz gerekiyor. Dosyayı ekleapp/code/community/Namespace/Module/Rewrite/SalesRule/Model/Quote/Discount.php

ve içeriği ekleyin:

<?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;
    }
}

Temel olarak, bunun yaptığı kupon sokmasını kırar, her kupon kodundan geçer, teklif toplamlarını hesaplar ve günceller.

Test etmek için 2 alışveriş sepeti kuralını ayarladım:

  • test 1-10% ürün fiyatı indirimi - Diğer Kuralları Durdur İşleme: Hayır
  • test 2 -% 10 ürün fiyat indirimi - Diğer Kuralları Durdur İşleme: Hayır

Kupon yok: kupon yok

Kupon testi 1 eklendi: eklenen kupon testi 1

Kupon testi 2 eklendi eklenen kupon testi 1

Sabit tutar indirimi ile test ettim ve bu da beklendiği gibi çalışıyor.

Ve dediğim gibi, muhtemelen kopyalar için ek kontrol eklemeniz gerekebilir, ancak bu nerede başlayacağınızdır. Ön uç için, tercih ettiğiniz veya olduğu gibi bıraktığınız kodları bölerek mantık ekleyebilirsiniz.


Ayrıca belirtmeyi unuttum, Açıkçası Namespace /
Module'u

Bu cevabı düzenledikten sonra şimdi yukarıdaki ekran görüntüsü gibi çalışıyor. birden fazla kupon uyguladıktan sonra belirli kuponu nasıl iptal edebilirim.
Zaheerabbas

Teşekkürler cevap için Shaughn, benim için magento 1.9 üzerinde çalıştı ama ver 1.8 üzerinde çalışmak için alamadım, tarayıcıda hiçbir şey görüntüler ve apache error.log bellek boyutu bitkin hata atmak (magento hatası / system.log değil) )
Haris

Hey Saddam, bellek sorunu muhtemelen birçok sorundan biridir, ancak yapabileceğiniz şey kodu bir try catch bloğuna sarın ve kırpılan herhangi bir hatayı günlüğe kaydetmek. mevcut. Döngüden hemen önce kupon kodlarını sayabilir ve belleğe yüklenen birkaç tane olduğundan şüphelenilen kaç tane olduğunu kontrol edebilirsiniz.
Shaughn

1
Aynı kupon kodlarının çoklu kullanımını kolayca önlemek için, array_unique $ couponArray = array_unique (explode (',', $ couponCode));
Julian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.