Il coupon Magento Multiple si applica al carrello


9

Ho lavorato per 2 giorni per l'applicazione di coupon multipli sul carrello So che ci sono moduli disponibili per quello. Ma non voglio usarlo. Voglio un codice personalizzato in modo da poter applicare più di un codice coupon nel singolo ordine.

Per favore aiuto. sono molto stanco dopo aver lavorato sulle stesse cose. inserisci qui la descrizione dell'immagine



A proposito, la tua domanda è stranamente simile a quella che ho appena collegato sopra, che è del 2013.
Tim Hallman,

@Tim ~ ​​Non penso che sia il metodo migliore, dal momento che comporta l'aggiunta di colonne direttamente alle tabelle di vendita bypassando i metodi convenzionali di Magento. In realtà ci ho giocato ora, e con 2 riscritture e alcune righe di codice, questo può essere facilmente raggiunto. Inoltre, la risposta in quel link consente solo di aggiungere 2 codici. Invierò una risposta tra poco
Shaughn,

@Shaughn, inserisci il tuo codice.
Zaheerabbas,

potrei darmi un esempio zip, o essere directory più specifiche per favore grazie
alexmalara

Risposte:


14

Nel modulo personalizzato, aggiungi quanto segue a 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>

Il primo è una riscrittura Mage_SalesRule_Model_Quote_DiscountperNamespace_Module_Rewrite_SalesRule_Model_Quote_Discount

Il secondo è il controller sovraccarico Mage_Checkout_CartController

Quindi aggiungere il seguente file app/code/community/Namespace/Module/controllers/Checkout/CartController.php e inserire il seguente codice:

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

Noterai che ho aggiunto una sezione per combinare i codici coupon delimitati da ",". Questo può ovviamente essere più raffinato e potresti voler aggiungere ulteriori controlli, ecc., Ma questo codice dovrebbe funzionare immediatamente.

E infine dobbiamo aggiungere il pezzo che fa tutta la magia. Aggiungi il fileapp/code/community/Namespace/Module/Rewrite/SalesRule/Model/Quote/Discount.php

e aggiungi il contenuto:

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

Fondamentalmente, ciò che fa è spezzare la puntura del coupon, scorrere attraverso ogni codice coupon, calcola e aggiorna i totali del preventivo.

Per provare, ho impostato 2 regole del carrello:

  • test 1 - Sconto del 10% sul prezzo del prodotto - Termina l'elaborazione di ulteriori regole: No
  • test 2 - Sconto del 10% sul prezzo del prodotto - Termina l'elaborazione di ulteriori regole: No

Nessun coupon: nessun coupon

Aggiunto coupon test 1: test coupon aggiunto 1

Aggiunto coupon test 2 test coupon aggiunto 1

Ho provato con uno sconto sull'importo fisso e anche questo funziona come previsto.

E come ho detto, potrebbe essere necessario aggiungere ulteriori controlli, possibilmente per i duplicati, ma è qui che inizieresti. Per il frontend, potresti aggiungere un po 'di logica dividere i codici come preferisci o lasciare così com'è.


Ho anche dimenticato di menzionare, ovviamente dovrai sostituire Namespace / Module con il tuo nome attuale del modulo, ecc.
Shaughn,

dopo aver modificato questa risposta ora funziona come sopra screenshot. so come posso cancellare un coupon specifico dopo aver applicato più coupon.
Zaheerabbas,

Grazie Shaughn per la tua risposta, ha funzionato per me su Magento 1.9 ma non sono riuscito a farlo funzionare sulla versione 1.8, non mostra nulla nel browser e genera errori di dimensione della memoria esauriti in apache error.log (non magento error / system.log )
Haris,

Ehi Saddam, il problema con la memoria è probabilmente uno dei tanti problemi, ma quello che potresti fare è avvolgere il codice in un blocco try try e registrare tutti gli errori che si presentano. Controlla anche l'impostazione di memoria massima in php e assicurati di avere memoria sufficiente a disposizione. Poco prima del loop potresti contare i codici coupon e controllare quanti ce ne sono perché sospetto che ce ne siano alcuni che vengono caricati in memoria.
Shaughn,

1
Per impedire facilmente l'uso multiplo degli stessi codici coupon, puoi semplicemente usare array_unique $ couponArray = array_unique (explode (',', $ couponCode));
Giuliano
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.