Magento Mehrere Gutscheine gelten für den Warenkorb

9

Ich habe 2 Tage lang daran gearbeitet, mehrere Gutscheine auf den Warenkorb zu legen. Ich weiß, dass dafür Module verfügbar sind. Aber ich will es nicht benutzen. Ich möchte einen benutzerdefinierten Code, damit ich mehr als einen Gutscheincode in einer einzigen Bestellung anwenden kann.

Bitte helfen Sie. Ich bin sehr müde, nachdem ich an den gleichen Sachen gearbeitet habe. Geben Sie hier die Bildbeschreibung ein

Zaheerabbas
quelle
1
Hier gehen Sie stackoverflow.com/questions/15138237/…
Tim Hallman
Übrigens, Ihre Frage ähnelt unheimlich der oben verlinkten Frage aus dem Jahr 2013.
Tim Hallman
@Tim ~ ​​Ich denke nicht, dass dies die beste Methode ist, da Spalten direkt zu den Verkaufstabellen hinzugefügt werden müssen, wobei die herkömmlichen Methoden von Magento umgangen werden. Ich habe jetzt tatsächlich damit herumgespielt, und mit 2 Umschreibungen und ein paar Codezeilen kann dies leicht erreicht werden. Die Antwort in diesem Link erlaubt auch nur das Hinzufügen von 2 Codes. Ich werde gleich eine Antwort
schreiben
@Shaughn pls posten Sie Ihren Code.
Zaheerabbas
könnte mir ein Beispiel zip geben, oder spezifischere Verzeichnisse bitte danke
alexmalara

Antworten:

14

Fügen Sie in Ihrem benutzerdefinierten Modul Folgendes hinzu 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>

Das erste ist ein Umschreiben von Mage_SalesRule_Model_Quote_DiscounttoNamespace_Module_Rewrite_SalesRule_Model_Quote_Discount

Der zweite ist der überlastete Controller Mage_Checkout_CartController

Fügen Sie als Nächstes die folgende Datei hinzu app/code/community/Namespace/Module/controllers/Checkout/CartController.php und fügen Sie den folgenden Code ein:

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

Sie werden feststellen, dass ich einen Abschnitt hinzugefügt habe, um Gutscheincodes zu kombinieren, die durch "," getrennt sind. Dies kann natürlich verfeinert werden und Sie möchten möglicherweise zusätzliche Überprüfungen usw. hinzufügen, aber dieser Code sollte sofort funktionieren.

Und schließlich müssen wir das Stück hinzufügen, das die ganze Magie bewirkt. Fügen Sie die Datei hinzuapp/code/community/Namespace/Module/Rewrite/SalesRule/Model/Quote/Discount.php

und fügen Sie den Inhalt hinzu:

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

Im Grunde genommen bricht dies den Coupon-Stich auf, durchläuft jeden Gutscheincode, berechnet und aktualisiert die Angebotssummen.

Zum Testen habe ich 2 Warenkorbregeln eingerichtet:

  • Test 1 - 10% Produktpreisrabatt - Weitere Regeln stoppen Verarbeitung: Nein
  • Test 2 - 10% Produktpreisrabatt - Weitere Regeln beenden Verarbeitung: Nein

Kein Gutschein: kein Gutschein

Gutschein Test 1 hinzugefügt: Gutscheintest hinzugefügt 1

Coupon Test 2 hinzugefügt Gutscheintest hinzugefügt 1

Ich habe mit festem Mengenrabatt getestet und dies funktioniert auch wie erwartet.

Und wie gesagt, Sie müssen möglicherweise zusätzliche Überprüfungen hinzufügen, möglicherweise auf Duplikate, aber hier würden Sie beginnen. Für das Frontend können Sie eine Logik hinzufügen, die die Codes nach Belieben aufteilt oder unverändert lässt.

Shaughn
quelle
Auch vergessen zu erwähnen, müssten Sie natürlich Namespace / Modul durch Ihren tatsächlichen
Modulnamen
Nachdem Sie diese Antwort jetzt bearbeitet haben, funktioniert sie wie im obigen Screenshot. Wie kann ich einen bestimmten Gutschein stornieren, nachdem ich mehrere Gutscheine angewendet habe?
Zaheerabbas
Danke Shaughn für deine Antwort, es hat bei Magento 1.9 funktioniert, aber ich konnte es nicht bei Version 1.8 zum Laufen bringen. Es zeigt nichts im Browser an und wirft einen erschöpften Speicherfehler in apache error.log (nicht magento error / system.log) )
Haris
Hey Saddam, das Speicherproblem ist wahrscheinlich eines von vielen Problemen, aber Sie können den Code in einen Try-Catch-Block einschließen und alle auftretenden Fehler protokollieren. Überprüfen Sie auch die maximale Speichereinstellung in PHP und stellen Sie sicher, dass Sie über ausreichend Speicher verfügen verfügbar. Kurz vor der Schleife können Sie die Gutscheincodes zählen und überprüfen, wie viele es gibt, da ich vermute, dass einige in den Speicher geladen sind.
Shaughn
1
Um die mehrfache Verwendung derselben Gutscheincodes zu verhindern, können Sie einfach array_unique $ couponArray = array_unique (explode (',', $ couponCode)) verwenden.
Julian