दुर्भाग्य से, पर्यवेक्षक केवल 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 का निर्माण किया गया है। अब, चेकआउट सिस्टम के पास पहुंचने पर तर्क का एक बड़ा हिस्सा क्लाइंट साइड और उससे भी अधिक कार्यान्वित किया जाता है।
चेकआउट सिस्टम से निपटने के दौरान हमेशा सावधान रहना याद रखें, चेकआउट पेज पर एक बग एक स्टोर को बहुत बुरी तरह से चोट पहुंचा सकता है।
नोट: उपरोक्त सभी कोड अप्रयुक्त है