Magento 2 पर सफलता के आदेश के बाद किस पर्यवेक्षक का उपयोग करना है?


11

मैं इस Magento 2 एक्सटेंशन पर काम कर रहा हूं और सुविधाओं का हिस्सा वेब सेवाओं का उपयोग करके बाहरी एप्लिकेशन को आदेशों के बारे में जानकारी को पुश करना है। चेकआउट में एक आदेश दिए जाने के बाद मुझे इस जानकारी को आगे बढ़ाने की आवश्यकता है।

फिलहाल मैं उस ईवेंट का उपयोग कर रहा हूं checkout_onepage_controller_success_actionजो बाहरी ऐप में ऑर्डर बनाने के लिए विधि को ट्रिगर करता है। मैंने इस घटना को अंदर रखा /etc/frontend/events.xml

अब तक यह काम कर रहा है, लेकिन मुझे ऑर्डर की स्थिति के साथ एक मुद्दा मिला। कभी-कभी आदेश अभी भी pendingस्थिति में होते हैं और कुछ अन्य समय के क्रम में होते हैं processing। इसका कारण यह है क्योंकि भुगतान विधि पहले लंबित आदेशों को आरंभ करती है और भुगतान स्वीकृत होने के बाद, आदेश प्रसंस्करण में बदल जाते हैं। मैं केवल processingआदेशों को आगे बढ़ाना चाहता हूं । ऐसा लगता है कि कभी-कभी checkout_onepage_controller_success_actionभुगतान अधिकृत होने से पहले घटना चलती है और यह मुद्दों का कारण बन रहा है।

कुछ पता है इसे कैसे हल करना है? अपने कोड को चलाने से पहले मैं यह कैसे सुनिश्चित कर सकता हूं कि भुगतान प्रक्रिया चलती है checkout_onepage_controller_success_action?

मेरे कोड का अनुसरण करना:

events.xml

<?xml version="1.0"?>
<!--
/**
 * Copyright © 2017 companyname.com
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="checkout_onepage_controller_success_action">
        <observer name="companyname_order_success" instance="Companyname\Shipping\Observer\CreateCompanynameOrderObserver" />
    </event>
</config>

CreateCompanynameOrderObserver.php

/**
 * Create an order in Companyname when order status match the statuses in the backend
 *
 * @param EventObserver $observer
 * @return void
 */
public function execute(EventObserver $observer){
    $order_ids  = $observer->getEvent()->getOrderIds();
    $order_id   = $order_ids[0];

    //Loading order details
    $orderModel         = $this->_orderFactory->create();
    $order              = $orderModel->load($order_id);
    $shipping_method    = $order->getShippingMethod();
    $order_status       = $order->getStatus();

    if($order_status == 'processing'){
        //Push to external app
    }
}

जवाबों:


7

आप घटना की कोशिश कर सकते हैं

checkout_submit_all_after

यह ऑर्डर सफलतापूर्वक समाप्त हो जाने के बाद चलता है (और जब आपने कोई ऑर्डर बनाया हो तो बैक-एंड में)

उदाहरण के लिए, घटनाओं में। xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">

    <event name="checkout_submit_all_after">
        <observer name="yourcompany_yourmodule_checkout_submit_all_after" instance="YourCompany\YourModule\Observer\ProcessOrder" />
    </event>

</config>

और प्रेक्षक में

public function execute(\Magento\Framework\Event\Observer $observer)
{
    $order = $observer->getOrder();
    $quote = $observer->getQuote();

    // Do whatever you want here

    return $this;
}

यह मेरे लिए काम नहीं कर रहा है। घटना को अंजाम नहीं दिया गया है। मैंने "checkout_submit_all_after" और "sales_order_place_after" के साथ भी प्रयास किया, लेकिन केवल एक घटना जो मैं एक पर्यवेक्षक के साथ कैप्चर करने में सक्षम हूं, checkout_onepage_controller_success_action है। कोई सुझाव?
डैनियल सिल्वा

@DanielSilva मुझे फायरिंग नहीं होने की घटनाओं के साथ एक ही समस्या थी लेकिन तब यह काम किया जब फ्रंटएंड से वैश्विक में स्थानांतरित हो गया। यह है, से स्थानांतरित कर etc/frontend/events.xmlदिया etc/events.xml। ऐसा नहीं होना चाहिए, लेकिन यह तब भी होता है जब सामग्री समान हो।
clockworkgeek

इस पुराने मुद्दे के अनुसार, Magento Sales_order_ * घटनाओं को कैप्चर नहीं कर सकता है , समाधान "फ्रंटएंड" फ़ोल्डर को "webapi_rest" में बदलना है।
clockworkgeek

3

कृपया sales_order_place_after घटना का उपयोग करें ।

यह ईवेंट केवल एक बार और जब ऑर्डर सफलतापूर्वक फ़ाइल विक्रेता / magento / मॉड्यूल-बिक्री / मॉडल / ऑर्डर . php से नीचे दिए गए फ़ंक्शन में रखा जाता है।

/**
     * Place order
     *
     * @return $this
     */
    public function place()
    {
        $this->_eventManager->dispatch('sales_order_place_before', ['order' => $this]);
        $this->_placePayment();
        $this->_eventManager->dispatch('sales_order_place_after', ['order' => $this]);
        return $this;
    }

2

आप sales_order_state_change_beforeईवेंट का उपयोग कर सकते हैं । यह ऑर्डर तक पहुंच प्रदान करता है और आपको यह जांचने की अनुमति देगा कि क्या भुगतान संसाधित किया गया था। फिर, जब भुगतान संसाधित हो जाता है, तो इसे फिर से निकाल दिया जाएगा, जो आपको कंपनी का नाम बनाने की अनुमति देगा।

सामान्य तौर पर, Magento 2 प्लगइन्स के पक्ष में घटनाओं से दूर जाता प्रतीत होता है। हालांकि समुदाय के कई लोग उस दृष्टिकोण से सहमत नहीं हो सकते हैं, लेकिन यह निश्चित रूप से यहाँ ध्यान में रखना है।


उत्तर @tjons के लिए धन्यवाद। ऐसा लगता है कि Magento 2 में बहुत अधिक घटनाएं नहीं बची हैं। मैं Sales_order_state_change_before का उपयोग करने की कोशिश करूंगा और आपको बताऊंगा कि यह कैसे चलता है।
एडुआर्डो

अरे @tjons, मैंने sales_order_state_change_beforeइसके बजाय कोशिश की checkout_onepage_controller_success_actionलेकिन यह काम नहीं कर रहा था। निश्चित नहीं है कि मुझे इस घटना को रखने की आवश्यकता है और अगर यह चेकआउट के दौरान चालू हो जाएगा। मैं etc/frontend/events.xmlकिसी भी सुराग में मेरी घटना है क्यों?
एडुआर्डो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.