Magento 2 - ส่วนลดขึ้นอยู่กับวิธีการชำระเงินไม่ทำงาน


13

ฉันไปที่ Magento 2 ผู้ดูแลระบบ> การตลาด> โปรโมชั่น> กฎราคารถเข็นและสร้างกฎใหม่: การชำระเงินด้วยการโอนเงินผ่านธนาคาร:

ข้อมูลกฎของแท็บ:

  • ชื่อกฎ: การโอนเงินผ่านธนาคาร
  • สถานะ: ใช้งานอยู่
  • เว็บไซต์: เว็บไซต์หลัก
  • กลุ่มลูกค้า: เลือกทั้งหมด
  • คูปอง: ไม่มีคูปอง
  • ใช้ต่อลูกค้า: 0
  • จาก: ว่าง
  • ถึง: blank
  • ระดับความสำคัญ: 0
  • สาธารณะในฟีด RSS: ไม่

แท็บเงื่อนไข:

  • หากเงื่อนไขเหล่านี้ทั้งหมดเป็นจริง:
    • วิธีการชำระเงินคือการชำระเงินโอนเงินผ่านธนาคาร

แท็บการกระทำ:

  • ใช้: ร้อยละของส่วนลดราคาสินค้า
  • จำนวนส่วนลด: 2
  • ส่วนลดปริมาณสูงสุดถูกนำไปใช้กับ: 0
  • ส่วนลดจำนวนขั้นตอน (ซื้อ X): 0
  • นำไปใช้กับการจัดส่งสินค้าจำนวน: ไม่มี
  • ยกเลิกกฎที่ตามมา: ไม่
  • จัดส่งฟรี: ไม่มี
  • ใช้กฎนี้เฉพาะกับรถเข็นสินค้าที่ตรงตามเงื่อนไขต่อไปนี้ (เว้นว่างไว้สำหรับรายการทั้งหมด): ไม่มีอะไร

จากนั้นฉันจะเปิดใช้งานวิธีการชำระเงินโดยการโอนเงินผ่านธนาคารไปที่หน้าชำระเงินคลิกที่การชำระเงินโดยการโอนเงินผ่านธนาคาร แต่ราคาเปอร์เซ็นต์ส่วนลดไม่แสดงในสรุปการสั่งซื้อ

ป้อนคำอธิบายรูปภาพที่นี่

โปรดให้คำแนะนำแก่ฉัน วิธีทำส่วนลดในวิธีการชำระเงินใน Magento 2 สำหรับ Magento 1 นั้นดีมาก

ขอบคุณมาก ๆ


คุณสามารถโพสต์กฎของคุณที่นี่?
Khoa TruongDinh

ฉันโพสต์กฎของฉัน คุณช่วยตรวจสอบฉันได้ไหม
NguyễnHồng Quang

ลองเพิ่มวันที่เปิดใช้งานของกฎหรือไม่
Khoa TruongDinh

ฉันพยายามที่จะเพิ่มวันที่เริ่มต้นของกฎ แต่ก็ยังไม่มีอะไรเกิดขึ้นในสรุปคำสั่งซื้อเมื่อคลิกที่ตัวเลือกการชำระเงินโดยการโอนเงินผ่านธนาคาร
NguyễnHồng Quang

1
ขอบคุณ ฉันโพสต์ปัญหาที่นี่: github.com/magento/magento2/issues/5937
NguyễnHồng Quang

คำตอบ:


11

กฎนี้ใช้ไม่ได้เนื่องจาก Magento 2 ไม่ได้บันทึกวิธีการชำระเงินไว้เพื่อเสนอราคาเมื่อคุณเลือก และจะไม่โหลดซ้ำทั้งหมดเมื่อเลือกวิธีการชำระเงิน และน่าเสียดายที่คุณต้องเขียนโมดูลที่กำหนดเองเพื่อแก้ไขปัญหา

โมดูลใหม่ต้องการเพียง 4 ไฟล์ที่จะสร้าง:

  1. app / รหัส / Namespace / ModuleName / etc / ส่วนหน้า / routes.xml

    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
        <router id="standard">
            <route id="namespace_modulename" frontName="namespace_modulename">
                <module name="Namespace_ModuleName"/>
            </route>
        </router>
    </config>
    

    สิ่งนี้จะกำหนดตัวควบคุมใหม่สำหรับโมดูลของเรา

  2. app / รหัส / Namespace / ModuleName / ควบคุม / ชำระเงิน / ApplyPaymentMethod.php

    <?php
    
    namespace Namespace\ModuleName\Controller\Checkout;
    
    class ApplyPaymentMethod extends \Magento\Framework\App\Action\Action
    {
        /**
         * @var \Magento\Framework\Controller\Result\ForwardFactory
         */
        protected $resultForwardFactory;
    
        /**
         * @var \Magento\Framework\View\LayoutFactory
         */
        protected $layoutFactory;
    
        /**
         * @var \Magento\Checkout\Model\Cart
         */
        protected $cart;
    
        /**
         * @param \Magento\Framework\App\Action\Context $context
         * @param \Magento\Framework\View\LayoutFactory $layoutFactory
         * @param \Magento\Framework\Controller\Result\ForwardFactory $resultForwardFactory
         */
        public function __construct(
            \Magento\Framework\App\Action\Context $context,
            \Magento\Framework\Controller\Result\ForwardFactory $resultForwardFactory,
            \Magento\Framework\View\LayoutFactory $layoutFactory,
            \Magento\Checkout\Model\Cart $cart
        ) {
            $this->resultForwardFactory = $resultForwardFactory;
            $this->layoutFactory = $layoutFactory;
            $this->cart = $cart;
    
            parent::__construct($context);
        }
    
        /**
         * @return \Magento\Framework\Controller\ResultInterface
         */
        public function execute()
        {
            $pMethod = $this->getRequest()->getParam('payment_method');
    
            $quote = $this->cart->getQuote();
    
            $quote->getPayment()->setMethod($pMethod['method']);
    
            $quote->setTotalsCollectedFlag(false);
            $quote->collectTotals();
            $quote->save();
        }
    }
    

    ไฟล์นี้จะสร้างการกระทำของตัวควบคุมเพื่อบันทึกวิธีการชำระเงินที่เลือกเพื่อเสนอราคา

  3. app / รหัส / Namespace / ModuleName / view / ส่วนหน้า / requirejs-config.js

    var config = {
        map: {
            '*': {
                'Magento_Checkout/js/action/select-payment-method':
                    'Namespace_ModuleName/js/action/select-payment-method'
            }
        }
    };
    

    ไฟล์นี้อนุญาตให้แทนที่Magento_Checkout/js/action/select-payment-methodไฟล์

  4. app / รหัส / Namespace / ModuleName / view / ส่วนหน้า / เว็บ / js / การกระทำ / เลือกการชำระเงิน-method.js

    define(
        [
            'Magento_Checkout/js/model/quote',
            'Magento_Checkout/js/model/full-screen-loader',
            'jquery',
            'Magento_Checkout/js/action/get-totals',
        ],
        function (quote, fullScreenLoader, jQuery, getTotalsAction) {
            'use strict';
            return function (paymentMethod) {
                quote.paymentMethod(paymentMethod);
    
                fullScreenLoader.startLoader();
    
                jQuery.ajax('/namespace_modulename/checkout/applyPaymentMethod', {
                    data: {payment_method: paymentMethod},
                    complete: function () {
                        getTotalsAction([]);
                        fullScreenLoader.stopLoader();
                    }
                });
    
            }
        }
    );
    

    ส่งคำขอ ajax เพื่อบันทึกวิธีการชำระเงินและโหลดยอดรวมของรถเข็น

PSบางส่วนของรหัสถูกนำมาจากส่วนขยายค่าธรรมเนียมการชำระเงินสำหรับ Magento 2


1
ขอบคุณ MagestyApps มากฉันสร้างโมดูลใหม่ตามคำแนะนำของคุณ อย่างไรก็ตามในตอนท้ายฉันได้รับปัญหานี้ jquery.js 192.168.41.59/phoenix_checkout/checkout/applyPaymentMethod 404 (ไม่พบ) คุณเคยได้รับข้อผิดพลาดนี้มาก่อนหรือไม่
NguyễnHồng Quang

1
มันใช้งานได้ดีจริงๆ ขอบคุณ MagestyApps อย่างมาก โซลูชั่นนี้สมบูรณ์แบบ
NguyễnHồng Quang

มันทำงานได้คุณประหยัดเวลาของฉัน ขอบคุณ :)
Sameer Bhayani

สิ่งที่น่ากลัวขอบคุณ กฎราคารถเข็นสำหรับวิธีการชำระเงินถูกลบ btw ( github.com/magento/magento2/commit/ ...... ) ฉันเพิ่มบรรทัด "'payment_method' => __ ('วิธีการชำระเงิน')," อีกครั้งตอนนี้ฉันสามารถสร้างกฎราคารถเข็นสำหรับวิธีการชำระเงิน
DaFunkyAlex

สิ่งนี้ช่วยได้มาก ขอบคุณ +1 :)
Shoaib Munir

3

ใน Magento 2.2 ฉันไม่สามารถรับคำตอบให้กับ MagestyApps ฉันต้องการเพิ่มไฟล์เพิ่มเติม เพราะ:

  • กฎราคารถเข็นสำหรับวิธีการชำระเงินถูกลบออกจากผู้ดูแลระบบ (ดังที่ DaFunkyAlex ระบุไว้);
  • ใน Magento 2.2 ส่วนลดไม่ได้ถูกนำไปใช้กับใบเสนอราคาเนื่องจากวิธีการ\Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address\PaymentMethod::generateFilterText(จริง ๆ แล้วมันกลับไปที่\Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address::generateFilterText) ได้รับการคาดหวังว่าข้อมูลpayment_methodที่จะตั้งอยู่บนที่อยู่อ้าง;
  • แม้จะมีการเปลี่ยนแปลงตัวควบคุมจากคำตอบ MagestyApps เพื่อชุดpayment_methodข้อมูลเกี่ยวกับที่อยู่คำพูดที่ไม่ได้ทำงานเมื่ออ้างเป็นคำสั่งเพราะมันไม่ได้ยังคงมีอยู่payment_method;

โมดูลต่อไปนี้ได้ผลสำหรับฉัน (ขอบคุณ MagestyApps คำตอบมันขึ้นอยู่กับสิ่งนั้น):

registration.php

<?php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Vendor_SalesRulesPaymentMethod',
    __DIR__
);

etc / module.xml

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Vendor_SalesRulesPaymentMethod" setup_version="1.0.0">
        <sequence>
            <module name="Magento_AdvancedSalesRule"/>
            <module name="Magento_Checkout"/>
            <module name="Magento_SalesRules"/>
            <module name="Magento_Quote"/>
        </sequence>
    </module>
</config>

etc / di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address\PaymentMethod"
                type="Vendor\SalesRulesPaymentMethod\Model\Rule\Condition\FilterTextGenerator\Address\PaymentMethod"/>
    <type name="Magento\SalesRule\Model\Rule\Condition\Address">
        <plugin name="addPaymentMethodOptionBack" type="Vendor\SalesRulesPaymentMethod\Plugin\AddPaymentMethodOptionBack" />
    </type>
</config>

etc / ส่วนหน้า / routes.xml

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="standard">
        <route id="salesrulespaymentmethod" frontName="salesrulespaymentmethod">
            <module name="Vendor_SalesRulesPaymentMethod"/>
        </route>
    </router>
</config>

ควบคุม / ชำระเงิน / ApplyPaymentMethod.php

<?php

namespace Vendor\SalesRulesPaymentMethod\Controller\Checkout;

use Magento\Checkout\Model\Cart;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\App\ResponseInterface;
use Magento\Framework\Controller\Result\ForwardFactory;
use Magento\Framework\Controller\ResultInterface;
use Magento\Framework\View\LayoutFactory;
use Magento\Quote\Model\Quote;

class ApplyPaymentMethod extends Action
{
    /**
     * @var ForwardFactory
     */
    protected $resultForwardFactory;

    /**
     * @var LayoutFactory
     */
    protected $layoutFactory;

    /**
     * @var Cart
     */
    protected $cart;

    /**
     * @param Context $context
     * @param LayoutFactory $layoutFactory
     * @param ForwardFactory $resultForwardFactory
     */
    public function __construct(
        Context $context,
        ForwardFactory $resultForwardFactory,
        LayoutFactory $layoutFactory,
        Cart $cart
    ) {
        $this->resultForwardFactory = $resultForwardFactory;
        $this->layoutFactory = $layoutFactory;
        $this->cart = $cart;

        parent::__construct($context);
    }

    /**
     * @return ResponseInterface|ResultInterface|void
     * @throws \Exception
     */
    public function execute()
    {
        $pMethod = $this->getRequest()->getParam('payment_method');

        /** @var Quote $quote */
        $quote = $this->cart->getQuote();

        $quote->getPayment()->setMethod($pMethod['method']);

        $quote->setTotalsCollectedFlag(false);
        $quote->collectTotals();

        $quote->save();
    }
}

รุ่น / กฎ / สภาพ / FilterTextGenerator / ที่อยู่ / PaymentMethod.php

<?php

namespace Vendor\SalesRulesPaymentMethod\Model\Rule\Condition\FilterTextGenerator\Address;

use Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address\PaymentMethod as BasePaymentMethod;

class PaymentMethod extends BasePaymentMethod
{
    /**
     * @param \Magento\Framework\DataObject $quoteAddress
     * @return string[]
     */
    public function generateFilterText(\Magento\Framework\DataObject $quoteAddress)
    {
        $filterText = [];
        if ($quoteAddress instanceof \Magento\Quote\Model\Quote\Address) {
            $value = $quoteAddress->getQuote()->getPayment()->getMethod();
            if (is_scalar($value)) {
                $filterText[] = $this->getFilterTextPrefix() . $this->attribute . ':' . $value;
            }
        }

        return $filterText;
    }
}

ปลั๊กอิน / AddPaymentMethodOptionBack.php

<?php

namespace Vendor\SalesRulesPaymentMethod\Plugin;

use Magento\SalesRule\Model\Rule\Condition\Address;

class AddPaymentMethodOptionBack
{
    /**
     * @param Address $subject
     * @param $result
     * @return Address
     */
    public function afterLoadAttributeOptions(Address $subject, $result)
    {
        $attributeOption = $subject->getAttributeOption();
        $attributeOption['payment_method'] = __('Payment Method');

        $subject->setAttributeOption($attributeOption);

        return $subject;
    }
}

มุมมอง / ส่วนหน้า / requirejs-config.js

var config = {
    map: {
        '*': {
            'Magento_Checkout/js/action/select-payment-method':
                'Vendor_SalesRulesPaymentMethod/js/action/select-payment-method'
        }
    }
};

มุมมอง / ส่วนหน้า / เว็บ / js / การกระทำ / เลือกการชำระเงิน-method.js

define(
    [
        'Magento_Checkout/js/model/quote',
        'Magento_Checkout/js/model/full-screen-loader',
        'jquery',
        'Magento_Checkout/js/action/get-totals',
    ],
    function (quote, fullScreenLoader, jQuery, getTotalsAction) {
        'use strict';
        return function (paymentMethod) {
            quote.paymentMethod(paymentMethod);

            fullScreenLoader.startLoader();

            jQuery.ajax('/salesrulespaymentmethod/checkout/applyPaymentMethod', {
                data: {payment_method: paymentMethod},
                complete: function () {
                    getTotalsAction([]);
                    fullScreenLoader.stopLoader();
                }
            });

        }
    }
);

ฉันได้สิ่งนี้เมื่อพยายามคอมไพล์: Fatal error: Class 'Magento\AdvancedSalesRule\Model\Rule\Condition\Address\PaymentMethod' not found in Vendor/SalesRulesPaymentMethod/Model/Rule/Condition/FilterTextGenerator/Address/PaymentMethod.php on line 7. ฉันยังพยายามเปลี่ยน AdvancedSalesRule เป็น SalesRule เพราะฉันเห็นว่าไม่มีรุ่น AdvancedSalesRule ใน Magento 2.2.2
Alexandros

สำหรับ magento 2.1.9 เราควรละเว้นส่วน AdvancedSalesRule หรือไม่
Doni Wibowo

การรับข้อผิดพลาดเมื่อคอมไพล์: ข้อผิดพลาดร้ายแรง: คลาส 'Magento \ AdvancedSalesRule \ Model \ Rule \ Condition \ Address \ PaymentMethod' ไม่พบในผู้ขาย / SalesRulesPayment วิธี / โมเดล / กฎ / เงื่อนไข / FilterTextGenerator / ที่อยู่ / PaymentMethod.php ในบรรทัดที่ 7
Magecode

AdvancedSalesRule ไม่พร้อมใช้งานใน Magento 2.1.5
Magecode

2

เราเพิ่งตรวจสอบกฎเดียวกันและพบว่ามันไม่ทำงาน การใช้เงื่อนไขเดียวกันจะไม่มีการส่งข้อมูลเกี่ยวกับวิธีที่เลือกและจะไม่ถูกบันทึกไว้จนกว่าจะมีการสั่งซื้อและกฎอาจไม่ทำงาน

ป้อนคำอธิบายรูปภาพที่นี่

ที่อยู่ไม่มีวิธีการชำระเงินจนกว่าจะตรวจสอบความถูกต้องและได้รับวิธีการชำระเงินจากใบเสนอราคาการชำระเงินที่ไม่มีอยู่เนื่องจากไม่มีการส่งข้อมูล ( $model->getQuote()->getPayment()->getMethod()ส่งคืนnull)

ป้อนคำอธิบายรูปภาพที่นี่

เราคิดว่านี่เป็นข้อผิดพลาดของวีโอไอพี เมื่อคุณเลือกวิธีการชำระเงินข้อมูลจะถูกส่งล่วงหน้า


2
คำตอบจาก MagestyApps เป็นที่ยอมรับ ขอบคุณ
NguyễnHồng Quang

1

การแก้ปัญหาด้วยโมดูลที่กำหนดเองกำลังทำงาน

ฉันแค่คิดว่ามันจะเป็นข้อมูลที่มีประโยชน์สำหรับผู้เริ่มต้น Magento ที่จะรู้ว่าคุณยังต้องเพิ่มไฟล์เหล่านี้เพื่อให้สามารถเพิ่มและเปิดใช้งานโมดูลนี้:

(คัดลอกจากโมดูลอื่นและเปลี่ยนไฟล์ตามชื่อโมดูลและเนมสเปซของคุณ)

app/code/Namespace/ModuleName/composer.js
app/code/Namespace/ModuleName/registration.php
app/code/Namespace/ModuleName/etc/module.xml

จากนั้นคุณจะสามารถเรียกใช้ bin/magento setup:upgrade


0

ฉันสร้างไฟล์และแทนที่ Namespaces และ modulename แต่ฉันคิดว่าไฟล์ของฉันจะไม่ถูกดำเนินการ

อาจมีข้อผิดพลาดในไฟล์ของฉัน?

registration.php

<?php

use Magento\Framework\Component\ComponentRegistrar;
ComponentRegistrar::register(
ComponentRegistrar::MODULE,
'Jacor_Checkoutpayment',
__DIR__
);

composer.json

{
"name": "jacor/checkoutpayment",
"autoload": {
    "psr-4": {
        "Jacor\\Checkoutpayment\\": ""
    },
    "files": [
        "registration.php"
    ]
}

}

module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Jacor_Checkoutpayment" setup_version="1.0.0" />
</config>

0

อันที่จริงการเอาชนะไฟล์หลักของวีโอไอพีไม่ใช่ความคิดที่ดี แทนที่จะแทนที่Magento_Checkout/js/action/select-payment-methodดีกว่าสร้างมิกซ์อินสำหรับมัน และคุณสามารถเลื่อนมันได้โดยไม่ต้องสร้างคอนโทรลเลอร์ใหม่ ดูด้านล่าง (นอกเหนือจากคำตอบ @magestyapps)

  1. app / รหัส / Namespace / ModuleName / view / ส่วนหน้า / requirejs-config.js

        var config = {
            config: {
                mixins: {
                    'Magento_Checkout/js/action/select-payment-method': {
                        'Namespace_ModuleName/js/checkout/action/select-payment-method-mixin': true
                    },
                }
            }
        };
    
  2. app / รหัส / Namespace / ModuleName / view / ส่วนหน้า / js / ชำระเงิน / การกระทำ / เลือกการชำระเงิน-วิธี-mixin.js

        define([
        'jquery',
        'mage/utils/wrapper',
        'mage/storage',
        'Magento_Checkout/js/action/get-totals',
        'Magento_Checkout/js/model/full-screen-loader',
        'Magento_Checkout/js/model/quote',
        'Magento_Checkout/js/model/url-builder',
        'Magento_Customer/js/model/customer',
    ], function ($, wrapper, storage, getTotalsAction, fullScreenLoader, quote, urlBuilder, customer) {
        'use strict';
        return function (selectPaymentMethod) {
            return wrapper.wrap(selectPaymentMethod, function (originalAction, paymentMethod) {
                var serviceUrl, payload;
    
                originalAction(paymentMethod);
    
                payload = {
                    method: paymentMethod
                };
                if (customer.isLoggedIn()) {
                    serviceUrl = urlBuilder.createUrl('/carts/mine/selected-payment-method', {});
                } else {
                    serviceUrl = urlBuilder.createUrl('/guest-carts/:cartId/selected-payment-method', {
                        cartId: quote.getQuoteId()
                    });
                }
                fullScreenLoader.startLoader();
                storage.put(
                    serviceUrl,
                    JSON.stringify(payload)
                ).success(function () {
                    getTotalsAction([]);
                    fullScreenLoader.stopLoader();
                });
            });
        };
    });
    

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.