Magento 2: इवेंट ऑब्जर्वर भुगतान विधि चयन के लिए


13

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

क्या कोई मुझे बता सकता है कि मुझे किस घटना पर्यवेक्षक का उपयोग करना चाहिए? मुझे एक कस्टम फ़ंक्शन को कॉल करने और कार्ट सबटोटल में शुल्क जोड़ने की आवश्यकता है।

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

जवाबों:


10

दुर्भाग्य से, पर्यवेक्षक केवल php फ़ंक्शन के भीतर ही उपयोगी हैं। इसका मतलब यह है कि किसी घटना को ट्रिगर करने के लिए, इसे शुरू में dispatch()या तो एक देशी या कस्टम इवेंट डिस्पैचर द्वारा भेजा जाना होगा। इस विशेष मामले में, की गई कार्रवाई एक भुगतान विधि बटन पर क्लिक है। यह क्लिक किसी भी php कोड निष्पादन को ट्रिगर नहीं करता है, केवल जावास्क्रिप्ट कोड निष्पादित होता है।

चूंकि Magento 2 में चेकआउट प्रक्रिया ज्यादातर नॉकआउट JS के आसपास बनाई गई है, इसलिए अधिकांश कार्रवाई सर्वर साइड php के बजाय जावास्क्रिप्ट का उपयोग करने वाले फ्रंटएंड पर होती है।

नॉकआउट जेएस बहुत लचीला है और घटनाओं को बांधना और चर का निरीक्षण करना संभव है। दूसरी तरफ, इसे एक मजबूत सीखने की अवस्था की आवश्यकता हो सकती है।

अपनी परियोजना को देखने के लिए एक अच्छा कोण एक पर्यवेक्षक के बजाय एक नियंत्रक का उपयोग करना होगा:

1. चलो एक मॉड्यूल बनाकर शुरू करते हैं ...

2. एक नियंत्रक बनाएं जो ट्रिगर होने पर आपका तर्क करता है

नियंत्रक संरचना: http://www.example.com/route/controller_folder/action

2.1 नियंत्रक Actionवर्ग बनाएँ :

एप्लिकेशन / कोड / namespace / मॉड्यूल / नियंत्रक / टेस्ट / Action.php

namespace NameSpace\Module\Controller\Test;

class Action extends \Magento\Framework\App\Action\Action
{
    public function execute()
    {
        $request = $this->getRequest();
        //EXECUTE YOUR LOGIC HERE
    }
}

2.2 अपने नियंत्रकों के लिए एक मार्ग पंजीकृत करें

एप्लिकेशन / कोड / namespace / मॉड्यूल / etc / adminhtml / routes.xml

<?xml version="1.0"?>

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

2.3 चूँकि यह चेकआउट पर उपयोग किया जाएगा, इसलिए अपने मार्ग को सुरक्षित URL सूची में जोड़ें [EDIT]

एप्लिकेशन / कोड / namespace / मॉड्यूल / 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">
    <type name="Magento\Framework\Url\SecurityInfo">
        <arguments>
            <argument name="secureUrlList" xsi:type="array">
                <item name="route" xsi:type="string">/route/</item>
            </argument>
        </arguments>
    </type>
</config>

3. निम्नलिखित लेआउट फ़ाइल का उपयोग करके चेकआउट पृष्ठ पर एक जावास्क्रिप्ट फ़ाइल जोड़ें:

एप्लिकेशन / कोड / namespace / मॉड्यूल / देखें / दृश्यपटल / लेआउट / checkout_index_index.xml

<?xml version="1.0"?>

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
    <head>
       <link src="NameSpace_Module::js/payment-method-trigger.js"/>
    </head>
</page>

4. इस स्क्रिप्ट में आप हर बार एक अजाक्स पोस्ट अनुरोध भेजने के लिए एक फ़ंक्शन जोड़ सकते हैं जब भी भुगतान विधि टैब पर क्लिक किया गया हो।


सर्वश्रेष्ठ विधि - नॉकआउट: अवलोकन योग्य है

कोर फ़ाइल को एक्सटेंड / ओवरराइड किए बिना या मूल क्लिक फ़ंक्शन को प्रभावित किए बिना क्लिक इवेंट को ट्रिगर करने का सबसे अच्छा तरीका नॉकआउट की मदद से एक अवलोकन की सदस्यता लेना होगा।

विधि 2 - जेएस वर्ग बढ़ाएँ [EDIT]

प्रारंभिक जेएस वर्ग का विस्तार करने का एक तरीका भी होना चाहिए

define([
    'NameSpace_Module/path/to/original/file', //JS FILE TO EXTEND
], function (originalFile) { //PASS AS A PARAMETER
    'use strict';

    return originalFile.extend({ //EXTEND
        //FUNCTIONS ADDED HERE WILL OVERRIDE FUNCTIONS
        //FROM ORIGINAL CLASS IF ALREADY EXISTS
        someFunction: {
            someLogic();
        },


    });
});

विधि 3 - चयन-भुगतान-विधि को ओवरराइड करना। js

नॉकआउट जेएस के साथ खेलना कभी-कभी नाजुक हो सकता है और इस उत्तर के उद्देश्य के लिए हम केवल उद्धरण पद्धति में भुगतान पद्धति को पंजीकृत करने के लिए जिम्मेदार फ़ंक्शन को ओवरराइड करेंगे, जो कि चयनपेमेंटमेथोड फ़ंक्शन द्वारा ट्रिगर किया गया है। 100% नॉकआउट जेएस का उपयोग करने की तुलना में यह सबसे सुरुचिपूर्ण समाधान नहीं हो सकता है, लेकिन यह किसी भी कार्यशीलता को प्रभावित किए बिना तब तक काम करना चाहिए जब तक कि भविष्य के मैगेंटो अपडेट मूल फ़ंक्शन को संशोधित करके हस्तक्षेप न करें।

बेहतर समझने के लिए आप selectPaymentMethodइस फाइल की लाइन 139 पर फ़ंक्शन पा सकते हैं :

Magento_Checkout / js / देखें / भुगतान / default.js

1. अब हमें अपने फंक्शन को ओवरराइड घोषित करना होगा:

एप्लिकेशन / कोड / namespace / मॉड्यूल / देखें / दृश्यपटल / requirejs-config.js

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

2. अंत में, हम अपने ajax कॉल करने के लिए थोड़े से जोड़ के साथ भुगतान विधि का चयन करने के लिए जिम्मेदार फ़ंक्शन का पुन: उपयोग करते हैं!

एप्लिकेशन / कोड / namespace / मॉड्यूल / देखें / दृश्यपटल / वेब / js / कार्रवाई / भुगतान / चयन भुगतान न-method.js

define(
    [
    'jquery',
    'uiComponent',
    'ko',
    'Magento_Checkout/js/model/quote',
    ], function ($, uiComponent, ko, quote) {
        'use strict';

        function () {
            $.ajax({
                showLoader: true,
                url: 'http://www.example.com/route/controller_folder/action',
                data: { action : 1, param : 2},
                type: "POST",
                dataType: 'json'
            }).done(function (data) {
                alert('Request Sent');
            });
        };

        return function (paymentMethod) {
            quote.paymentMethod(paymentMethod);
        }
});

जब भी कोई ग्राहक भुगतान विधि टैब पर क्लिक करेगा, आपकी जावास्क्रिप्ट विधि आपके नियंत्रक को पोस्ट ajax अनुरोध भेज देगी जो आपके तर्क के साथ php कोड निष्पादित करेगा।

यह कई अलग-अलग Magento 2 पहलुओं को छूता है। यद्यपि मैं आपके प्रश्न का त्वरित और आसान समाधान प्रदान करना चाहूंगा, बस उसी तरह से Magento 2 का निर्माण किया गया है। अब, चेकआउट सिस्टम के पास पहुंचने पर तर्क का एक बड़ा हिस्सा क्लाइंट साइड और उससे भी अधिक कार्यान्वित किया जाता है।

चेकआउट सिस्टम से निपटने के दौरान हमेशा सावधान रहना याद रखें, चेकआउट पेज पर एक बग एक स्टोर को बहुत बुरी तरह से चोट पहुंचा सकता है।

नोट: उपरोक्त सभी कोड अप्रयुक्त है


वास्तव में अच्छी जानकारी
पांडुरंग

5

की आवश्यकता होती है

'Magento_Checkout/js/model/quote'

और निरीक्षण करें

quote.paymentMethod.subscribe(function(){console.log('yay')}, null, 'change');

वहाँ देखने के लिए बहुत सारे हैं

var billingAddress = ko.observable(null);
var shippingAddress = ko.observable(null);
var shippingMethod = ko.observable(null);
var paymentMethod = ko.observable(null);
var totals = ko.observable(totalsData);
var collectedTotals = ko.observable({})

1
धन्यवाद! बहुत अच्छा काम करता है! इसके अतिरिक्त, यदि आप किसी फ़ंक्शन के अंदर भुगतान विधि की जांच करना चाहते हैं, तो आप पहले तर्क का उपयोग कर सकते हैं , जैसे: quote.paymentMethod.subscribe(function(method){console.log(method);}, null, 'change');
Siarhey Uchukhlebau

0

ये 2 आप अपने अनुसार आजमा सकते हैं

app/code/Magento/Payment/Model/Method/Adapter.php 
    payment_method_is_active
    $this->eventManager->dispatch(
        'payment_method_is_active',
        [
    'result' => $checkResult,
    'method_instance' => $this,
    'quote' => $quote
        ]);

Or 
    app/code/Magento/Payment/Model/Method/Adapter.php 
    payment_method_assign_data_
    $this->eventManager->dispatch(
        'payment_method_assign_data_' . $this->getCode(),
        [
    'method' => $this,
    'data' => $data
        ]);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.