কোন পর্যবেক্ষক ম্যাজেন্টো 2 এ সাফল্যের আদেশের পরে ব্যবহার করবেন?


11

আমি এই ম্যাজেন্টো 2 এক্সটেনশনে কাজ করছি এবং বৈশিষ্ট্যগুলির অংশটি হ'ল ওয়েব পরিষেবাদি ব্যবহার করে কোনও বাহ্যিক অ্যাপ্লিকেশনটিতে অর্ডার সম্পর্কিত তথ্য push চেকআউটে একটি অর্ডার দেওয়ার পরে আমার এই তথ্যটি ঠেকাতে হবে।

এই মুহুর্তে আমি ইভেন্টটি ব্যবহার করছি 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;
}

এটি আমার জন্য কাজ করছে না। অনুষ্ঠানটি বরখাস্ত করা হয়নি। আমি "চেকআউট_সুবমিট_সাল_ফেসার্ট" এবং "বিক্রয়_অর্ডার_প্লেস_ফেরিটার" দিয়েও চেষ্টা করেছি তবে আমি কেবল পর্যবেক্ষকের সাথে ক্যাপচার করতে পেরেছি এমন একমাত্র ইভেন্ট হ'ল চেকআউট_পৃষ্ঠা_কন্ট্রোলার_সেসেস_অ্যাকশন। কোন পরামর্শ?
ড্যানিয়েল সিলভা

@ ড্যানিয়েলসিলভা ঘটনাগুলি গুলি চালানো না করায় আমার একই সমস্যা ছিল কিন্তু তখন সামনের দিক থেকে বিশ্বব্যাপী স্থানান্তরিত হলে এটি কার্যকর হয়েছিল। যে থেকে সরানো হল etc/frontend/events.xmlথেকে etc/events.xml। এটি হওয়া উচিত নয় তবে সামগ্রীটি অভিন্ন হলেও এটি ঘটে।
ক্লকওয়ার্কজেক

এই পুরানো ইস্যু অনুসারে, ম্যাজেন্টো বিক্রয়_ অর্ডার_ * ইভেন্টগুলি ক্যাপচার করতে পারে না , সমাধানটি "ফ্রন্টএন্ড" ফোল্ডারটি "ওয়েবপিআইরেস্ট" এ পরিবর্তন করা to
ক্লকওয়ার্কজেক

2

আপনি sales_order_state_change_beforeইভেন্টটি ব্যবহার করতে পারেন । এটি অর্ডারটিতে অ্যাক্সেস সরবরাহ করে এবং আপনাকে অর্থপ্রদান প্রক্রিয়া করা হয়েছে কিনা তা যাচাই করার অনুমতি দেবে। তারপরে, অর্থপ্রদান প্রক্রিয়া করার পরে, এটি আবার বরখাস্ত করা হবে, যা আপনাকে সংস্থার নাম তৈরি করতে দেয়।

সাধারণভাবে, ম্যাজেন্টো 2 প্লাগইনগুলির পক্ষে ইভেন্ট থেকে দূরে চলেছে বলে মনে হচ্ছে। যদিও সম্প্রদায়ের অনেকেই এই পদ্ধতির সাথে একমত হতে পারে না, এটি অবশ্যই এখানে মনে রাখা উচিত।


উত্তরের জন্য ধন্যবাদ দেখে মনে হচ্ছে যে ম্যাজেন্টো ২ তে খুব বেশি ইভেন্ট নেই I আমি বিক্রয়_র্ডার_স্টেট_চেঞ্জ_র আগে ব্যবহার করার চেষ্টা করব এবং এটি কীভাবে হয় তা আপনাকে জানাতে চাই।
এডুয়ার্ডো

আরে @tjons, sales_order_state_change_beforeপরিবর্তে আমি চেষ্টা করেছি checkout_onepage_controller_success_actionকিন্তু এটি কাজ করছে না। আমার এই ইভেন্টটি কোথায় স্থাপন করতে হবে তা নিশ্চিত নয় এবং এটি যদি চেকআউট চলাকালীন ট্রিগার করা হবে। আমার ঘটনা আমার etc/frontend/events.xmlকোন ক্লুতে আছে কেন?
এডুয়ার্ডো

2

বিক্রয়_অর্ডার_প্লেস_পর ইভেন্টটি দয়া করে ব্যবহার করুন ।

এই ইভেন্টটি কেবল একবারই কল হয় এবং যখন নীচের ফাংশনটিতে অর্ডারটি সফলভাবে ফাইল বিক্রেতা / ম্যাজেন্টো / মডিউল-বিক্রয় / মডেল / অর্ডার.এফপি থেকে অর্ডার করা হয়।

/**
     * 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;
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.