Magento Nhiều phiếu giảm giá áp dụng trên giỏ hàng


9

Tôi đã làm việc được 2 ngày để áp dụng nhiều phiếu giảm giá vào giỏ hàng Tôi biết có những mô-đun có sẵn cho việc đó. Nhưng tôi không muốn sử dụng nó. Tôi muốn một số mã tùy chỉnh để tôi có thể áp dụng nhiều hơn 1 mã phiếu giảm giá trong một đơn hàng.

Hãy giúp tôi. tôi rất mệt mỏi sau khi làm việc trên cùng một thứ. nhập mô tả hình ảnh ở đây


1
Tại đây, bạn truy cập stackoverflow.com/questions/15138237/ từ
Tim Hallman

Btw, câu hỏi của bạn rất giống với câu hỏi tôi vừa liên kết ở trên, đó là từ năm 2013.
Tim Hallman

@Tim ~ ​​Tôi không nghĩ đó là phương pháp tốt nhất, vì nó liên quan đến việc thêm các cột trực tiếp vào các bảng bán hàng bỏ qua các phương thức thông thường của Magento. Tôi thực sự đã chơi xung quanh với điều này bây giờ, và với 2 lần viết lại và một vài dòng mã, điều này có thể dễ dàng đạt được. Ngoài ra, câu trả lời trong liên kết đó chỉ cho phép thêm 2 mã. Ill gửi một câu trả lời trong một chút
Shaughn

@Shaughn xin vui lòng gửi mã của bạn.
Zaheerabbas

có thể cho tôi một ví dụ zip, hoặc các thư mục cụ thể hơn xin vui lòng cảm ơn
alexmalara

Câu trả lời:


14

Trong mô-đun tùy chỉnh của bạn, thêm phần sau vào 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>

Đầu tiên là một viết lại của Mage_SalesRule_Model_Quote_DiscountđểNamespace_Module_Rewrite_SalesRule_Model_Quote_Discount

Thứ hai là bộ điều khiển quá tải Mage_Checkout_CartController

Tiếp theo thêm tệp sau app/code/community/Namespace/Module/controllers/Checkout/CartController.php và chèn mã sau:

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

Bạn sẽ nhận thấy tôi đã thêm một phần để kết hợp mã phiếu giảm giá được phân định bởi ",". Điều này rõ ràng có thể được tinh chỉnh hơn và bạn có thể muốn thêm kiểm tra bổ sung, nhưng mã này sẽ hoạt động ngay lập tức.

Và cuối cùng chúng ta cần thêm mảnh làm tất cả phép thuật. Thêm tập tinapp/code/community/Namespace/Module/Rewrite/SalesRule/Model/Quote/Discount.php

và thêm nội dung:

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

Về cơ bản, những gì nó làm là phá vỡ các phiếu giảm giá, các vòng lặp thông qua mỗi mã phiếu giảm giá, tính toán và cập nhật tổng số báo giá.

Để kiểm tra, tôi đã thiết lập 2 quy tắc giỏ hàng:

  • kiểm tra giảm giá 1 - 10% giá sản phẩm - Dừng xử lý thêm quy tắc: Không
  • kiểm tra 2 - giảm giá 10% giá sản phẩm - Dừng xử lý thêm quy tắc: Không

Không có phiếu giảm giá: không có phiếu giảm giá

Đã thêm kiểm tra phiếu giảm giá 1: thêm phiếu kiểm tra 1

Đã thêm phiếu kiểm tra 2 thêm phiếu kiểm tra 1

Tôi đã thử nghiệm với chiết khấu số tiền cố định và điều này cũng hoạt động như mong đợi.

Và như tôi đã nói, bạn có thể cần thêm kiểm tra bổ sung, có thể cho các bản sao, nhưng đây là nơi bạn sẽ bắt đầu. Đối với frontend, bạn có thể thêm một số logic phân chia mã theo cách bạn muốn hoặc để nguyên.


Cũng quên đề cập, rõ ràng bạn sẽ cần thay thế Namespace / Module bằng tên mô-đun thực tế của mình, v.v.
Shaughn

sau khi chỉnh sửa câu trả lời này, nó hoạt động như trên ảnh chụp màn hình. Bây giờ tôi có thể hủy phiếu giảm giá cụ thể như thế nào sau khi áp dụng nhiều phiếu giảm giá.
Zaheerabbas

Cảm ơn Shaughn đã trả lời cho bạn, nó hoạt động với tôi trên magento 1.9 nhưng tôi không thể làm cho nó hoạt động được trên phiên bản 1.8, nó không hiển thị gì trong trình duyệt và ném hết kích thước bộ nhớ trong lỗi apache.log (không phải lỗi magento / system.log )
Haris

Này Saddam, vấn đề bộ nhớ có thể là một trong nhiều vấn đề, nhưng những gì bạn có thể làm là bọc mã trong một khối bắt thử và ghi lại bất kỳ lỗi nào xảy ra. Ngoài ra, hãy kiểm tra cài đặt bộ nhớ tối đa trong php và đảm bảo bạn có đủ bộ nhớ có sẵn. Ngay trước vòng lặp, bạn có thể đếm mã phiếu giảm giá và kiểm tra xem có bao nhiêu mã vì tôi nghi ngờ có một số được nạp vào bộ nhớ.
Shaughn

1
Để dễ dàng ngăn chặn việc sử dụng nhiều mã phiếu giảm giá giống nhau, bạn chỉ cần sử dụng mảng_unique $ couponArray = Array_unique (explode (',', $ couponCode));
Julian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.