Magento 2 - डिस्काउंट भुगतान विधि पर निर्भर करता है काम नहीं करता है


13

मैं Magento 2 व्यवस्थापक> विपणन> प्रचार> कार्ट मूल्य नियमों पर जाता हूं और एक नया नियम बनाता हूं : बैंक स्थानांतरण भुगतान:

टैब नियम जानकारी:

  • नियम का नाम: बैंक स्थानांतरण भुगतान
  • स्थिति: सक्रिय
  • वेबसाइट: मुख्य वेबसाइट
  • ग्राहक समूह: सभी का चयन करें
  • कूपन: कोई कूपन नहीं
  • प्रति ग्राहक उपयोग: 0
  • प्रेषक: रिक्त
  • को: कोरा
  • प्राथमिकता: ०
  • RSS फ़ीड में सार्वजनिक: नहीं

शर्तें टैब:

  • यदि ये सभी स्थितियाँ सत्य हैं:
    • भुगतान विधि बैंक हस्तांतरण भुगतान है

क्रियाएँ टैब:

  • लागू करें: उत्पाद मूल्य छूट का प्रतिशत
  • छूट राशि: २
  • अधिकतम मात्रा छूट लागू है: 0
  • डिस्काउंट मात्रा कदम (एक्स खरीदें): 0
  • शिपिंग राशि पर लागू करें: नहीं
  • बाद के नियमों को त्यागें: नहीं
  • मुफ़्त शिपिंग: नहीं
  • निम्नलिखित शर्तों से मेल खाते केवल कार्ट आइटम पर नियम लागू करें (सभी आइटमों के लिए खाली छोड़ दें): कुछ भी नहीं

फिर मैं बैंक ट्रांसफर भुगतान विधि को सक्षम करता हूं, चेकआउट पृष्ठ पर जाता हूं, बैंक ट्रांसफर भुगतान पर क्लिक करता हूं लेकिन डिस्काउंट प्रतिशत मूल्य ऑर्डर सारांश में नहीं दिखता है।

यहाँ छवि विवरण दर्ज करें

कृपया मुझे एक सलाह दें। कैसे Magento 2 पर भुगतान विधि पर छूट कर सकते हैं। Magento 1 के लिए, यह अच्छी तरह से wroks।

बहुत बहुत धन्यवाद


आप यहाँ अपना नियम पोस्ट कर सकते हैं?
खोआ TruongDinh

मैंने अपना नियम पोस्ट किया। क्या आप मेरे लिए जाँच कर सकते हैं?
गुयेन ह्नंग क्वांग

नियम की सक्रिय तिथि जोड़ने का प्रयास करें?
खोआ TruongDinh

मैं नियम की शुरुआत की तारीख को जोड़ने की कोशिश करता हूं, लेकिन फिर भी ऑर्डर ट्रांसफर में कुछ भी नहीं होता है जब बैंक ट्रांसफर भुगतान विकल्प पर क्लिक करें
Nguyồn Hễng Quang

1
धन्यवाद। मैंने इस मुद्दे को यहाँ पोस्ट किया: github.com/magento/magento2/issues/5937
Quang

जवाबों:


11

यह नियम काम नहीं करता है क्योंकि जब आप एक का चयन करते हैं तो Magento 2 भुगतान विधि को सहेजने के लिए नहीं बचाता है। और यह भी भुगतान विधि का चयन करते समय योग को पुनः लोड नहीं करता है। और दुर्भाग्य से, आपको समस्या को हल करने के लिए एक कस्टम मॉड्यूल लिखना होगा।

नए मॉड्यूल को बनाने के लिए केवल 4 फ़ाइलों की आवश्यकता है:

  1. एप्लिकेशन / कोड / नाम स्थान / 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. एप्लिकेशन / कोड / नाम स्थान / 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. एप्लिकेशन / कोड / नाम स्थान / ModuleName / देखें / दृश्यपटल / 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. एप्लिकेशन / कोड / नाम स्थान / ModuleName / देखें / दृश्यपटल / वेब / 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 (नहीं मिली) मिली। क्या आपको यह बग पहले मिला था?
गुयेन हेंग क्वांग

1
यह वास्तव में अच्छी तरह से काम करता है। धन्यवाद MagestyApps बहुत बहुत। यह समाधान एकदम सही है।
गुयेन ह्नंग क्वांग

यह काम करता है, आपने मेरा समय बचाया। धन्यवाद :)
समीर भयानी

बहुत बढ़िया सामान, thx। भुगतान विधियों के लिए कार्ट मूल्य नियम btw ( github.com/magento/magento2/commit/… ) को हटा दिया गया था । मैंने "" payment_method '=> __ (' भुगतान विधि ') लाइन को फिर से जोड़ा, "अब मैं भुगतान विधियों के लिए कार्ट मूल्य नियम बना सकता हूं।
DaFunkyAlex

इससे काफी मदद मिली। धन्यवाद। +1 :)
शोएब मुनीर

3

Magento 2.2 पर मैं काम करने के लिए MagestyApps जवाब नहीं दे सका। मुझे कुछ अतिरिक्त फाइलें जोड़ने की जरूरत थी। इसलिये:

  • भुगतान विधि के लिए कार्ट मूल्य नियम को व्यवस्थापक से हटा दिया गया था (जैसा कि DaFunkyAlex द्वारा बताया गया है);
  • मैगेंटो 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:। मैंने एडवांस्डलेससैल को बदलने की भी कोशिश की, क्योंकि मैं देख सकता हूं कि मैगेंटो 2.2.2 में कोई एडवांसलेस मॉडल नहीं है
एलेक्जेंड्रोस

Magento 2.1.9 के लिए, क्या हमें AdvancedSalesRule भागों को छोड़ना चाहिए?
डोनी वाइबोवो

संकलन करते समय त्रुटि प्राप्त करना: घातक त्रुटि: कक्षा 'Magento \ AdvancedSalesRule \ Model \ Rule \ Condition \ Address \ PaymentMethod' विक्रेता / SalesRulesPaymentMethod / मॉडल / नियम / शर्त / FilterTextGenerator / पता / PaymentMethod.php पर पंक्ति 7 में नहीं
मिली

AdvancedSalesRule Magento 2.1.5 में उपलब्ध नहीं है
Magecode

2

हमने बस एक ही नियम की जाँच की और पाया कि यह काम नहीं करता है। समान शर्तों का उपयोग करते हुए, चयनित चुनी गई विधि के बारे में कोई जानकारी नहीं भेजी जाती है और इसे तब तक कहीं भी दर्ज नहीं किया जाता है जब तक कि आदेश नहीं दिया जाता है और नियम काम नहीं कर सकता है।

यहाँ छवि विवरण दर्ज करें

पते में सत्यापन तक कोई भुगतान विधि नहीं है और यह भुगतान पद्धति से भुगतान विधि प्राप्त करता है जो मौजूद नहीं है क्योंकि कोई जानकारी नहीं भेजी गई है ( $model->getQuote()->getPayment()->getMethod()रिटर्न null)।

यहाँ छवि विवरण दर्ज करें

हमें लगता है, कि यह Magento बग है। जब आप भुगतान विधि चुनते हैं तो सूचना पहले से भेजी जानी चाहिए।


2
MagestyApps से उत्तर स्वीकार किया जाता है। धन्यवाद।
गुयेन हुंग क्वांग

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

मैं फ़ाइलों को बनाया और नाम स्थान और 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. एप्लिकेशन / कोड / नाम स्थान / ModuleName / देखें / दृश्यपटल / 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. एप्लिकेशन / कोड / नाम स्थान / ModuleName / देखें / दृश्यपटल / 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();
                });
            });
        };
    });

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.