Kupon wielokrotny Magento obowiązuje na wózku

9

Pracuję od 2 dni nad zastosowaniem wielu kuponów do koszyka. Wiem, że są do tego dostępne moduły. Ale nie chcę tego używać. Chcę trochę niestandardowego kodu, aby móc zastosować więcej niż 1 kod kuponu w jednym zamówieniu.

Proszę pomóż. jestem bardzo zmęczony po pracy nad tymi samymi rzeczami. wprowadź opis zdjęcia tutaj

Zaheerabbas
źródło
Btw, twoje pytanie jest niesamowicie podobne do pytania, które właśnie podałem powyżej, które pochodzi z 2013 roku.
Tim Hallman
@ Tim ~ ​​Nie sądzę, że jest to najlepsza metoda, ponieważ wymaga dodania kolumn bezpośrednio do tabel sprzedaży, z pominięciem tradycyjnych metod Magento. Właściwie bawiłem się tym teraz, a dzięki 2 przepisywaniu i kilku wierszom kodu można to łatwo osiągnąć. Również odpowiedź w tym linku pozwala na dodanie tylko 2 kodów. Za chwilę
opublikuję
@Shaughn pls opublikuj swój kod.
Zaheerabbas
może dać mi przykładowy zip lub być bardziej szczegółowym katalogiem, proszę dziękuję
alexmalara,

Odpowiedzi:

14

W module niestandardowym dodaj następujące elementy do 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>

Pierwszy to przepisanie Mage_SalesRule_Model_Quote_DiscountnaNamespace_Module_Rewrite_SalesRule_Model_Quote_Discount

Drugi to przeciążony kontroler Mage_Checkout_CartController

Następnie dodaj następujący plik app/code/community/Namespace/Module/controllers/Checkout/CartController.php i wstaw następujący kod:

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

Zauważysz, że dodałem sekcję, aby połączyć kody kuponów ograniczone przez „,”. To oczywiście może być bardziej dopracowane i możesz chcieć dodać dodatkowe sprawdzanie itp., Ale ten kod powinien działać od razu.

I na koniec musimy dodać kawałek, który robi całą magię. Dodaj plikapp/code/community/Namespace/Module/Rewrite/SalesRule/Model/Quote/Discount.php

i dodaj treść:

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

Zasadniczo polega to na przełamaniu kuponu, przejściu przez każdy kod kuponu, obliczeniu i aktualizacji sumy wyceny.

Aby przetestować, skonfigurowałem 2 reguły koszyka:

  • test 1 - 10% rabatu na cenę produktu - Zatrzymaj Przetwarzanie dalszych zasad: Nie
  • test 2 - 10% rabatu na cenę produktu - Zatrzymaj Przetwarzanie dalszych zasad: Nie

Brak kuponu: bez kuponu

Dodano test kuponu 1: dodano test kuponu 1

Dodano test kuponu 2 dodano test kuponu 1

Testowałem ze stałą kwotą rabatu i działa to również zgodnie z oczekiwaniami.

I tak jak powiedziałem, może być konieczne dodanie dodatkowego sprawdzania, być może duplikatów, ale od tego możesz zacząć. W przypadku interfejsu możesz dodać logikę dzielącą kody w dowolny sposób lub pozostawić bez zmian.

Shaughn
źródło
Zapomniałem również wspomnieć, że oczywiście musisz zastąpić Przestrzeń nazw / Moduł rzeczywistą nazwą modułu itp.
Shaughn
po edycji tej odpowiedzi teraz działa jak na zrzucie ekranu. teraz jak mogę anulować określony kupon po zastosowaniu wielu kuponów.
Zaheerabbas
Dzięki Shaughn za odpowiedź, zadziałało dla mnie na Magento 1.9, ale nie mogłem zmusić go do pracy na wersji 1.8, nie wyświetla niczego w przeglądarce i wyrzuca błąd pamięci wyczerpany błąd w błędzie apache error.log (nie magento error / system.log )
Haris,
Hej Saddam, problem z pamięcią jest prawdopodobnie jednym z wielu problemów, ale co możesz zrobić, to owinąć kod blokiem próbnym i zarejestrować wszelkie pojawiające się błędy. Sprawdź także maksymalne ustawienie pamięci w php i upewnij się, że masz wystarczającą ilość pamięci dostępny. Tuż przed pętlą można było policzyć kody kuponów i sprawdzić, ile ich jest, ponieważ podejrzewam, że kilka jest załadowanych do pamięci.
Shaughn,
1
Aby łatwo zapobiec wielokrotnemu użyciu tych samych kodów kuponów, możesz po prostu użyć array_unique $ couponArray = array_unique (explode (',', $ couponCode));
Julian