Magento 2の注文後にどのオブザーバーを使用しますか?


11

私はこのMagento 2拡張機能に取り組んでおり、一部の機能は、注文に関する情報をWebサービスを使用して外部アプリケーションにプッシュすることです。チェックアウトで注文した後、この情報をプッシュする必要があります。

現時点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
    }
}

回答:


6

イベントを試すことができます

checkout_submit_all_after

注文が正常に送信された後に実行されます(注文を作成したときのバックエンドでも実行されます)

たとえば、events.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です。助言がありますか?
Daniel Silva、

@DanielSilvaイベントが発生しないという同じ問題がありましたが、フロントエンドからグローバルに移動したときに機能しました。つまり、からetc/frontend/events.xmlに移動しましたetc/events.xml。これは起こらないはずですが、内容が同じであっても起こります。
clockworkgeek

この古い問題によると、Magentoはsales_order_ *イベントをキャプチャできません。解決策は、「frontend」フォルダーを「webapi_rest」に変更することです。
clockworkgeek

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何か手掛かりになっているのはなぜですか?
エドゥアルド

1

sales_order_place_afterイベントを使用してください。

このイベントは1回だけ呼び出され、次の関数のファイルvendor / magento / module-sales / Model / Order.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;
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.