Magento 2'de başarı emrinden sonra hangi gözlemci kullanılacak?


11

Bu Magento 2 uzantısı üzerinde çalışıyorum ve özelliklerin bir kısmı web hizmetleri kullanarak harici bir uygulamaya siparişler hakkında bilgi aktarmaktır. Kasada bir sipariş verildikten sonra bu bilgileri aktarmam gerekiyor.

Şu anda checkout_onepage_controller_success_actionharici uygulamada sipariş oluşturma yöntemini tetikleyen olayı kullanıyorum . Bu etkinliği içeri girdim /etc/frontend/events.xml.

Şimdiye kadar bu çalışıyor ama sipariş durumu ile ilgili bir sorun buldum. Bazen emirler hala durumdayken, pendingbazı zamanlarda emirler verilir processing. Bunun nedeni, ödeme yönteminin siparişleri önce beklemede olarak başlatması ve ödemenin onaylanmasından sonra siparişlerin işleme koyulmasıdır. Sadece processingemir vermek istiyorum . Bazen checkout_onepage_controller_success_actionödeme onaylanmadan önce etkinlik gerçekleşiyor ve bu durum sorunlara neden oluyor gibi görünüyor .

bunu nasıl çözeceğimize dair bir fikri olan? kodumu çalıştırmadan önce ödeme işleminin çalıştığından nasıl emin olabilirim checkout_onepage_controller_success_action?

Kodumu takiben:

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
    }
}

Yanıtlar:


7

Etkinliği deneyebilirsiniz

checkout_submit_all_after

Sipariş başarıyla gönderildikten sonra çalışır (ve bir sipariş oluşturduğunuzda arka uçta)

Örneğin, events.xml dosyasında

<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>

Ve gözlemcide

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

    // Do whatever you want here

    return $this;
}

Bu benim için çalışmıyor. Olay başlatılmadı. "Checkout_submit_all_after" ve "sales_order_place_after" ile denedim ama bir gözlemci ile yakalayabildiğim tek olay checkout_onepage_controller_success_action. Herhangi bir öneri?
Daniel Silva

@DanielSilva Ben olayları ateş değil aynı sorun vardı ama sonra ön uçtan küresel taşındı işe yaradı. Yani taşınmış olduğu etc/frontend/events.xmliçin etc/events.xml. Bu olmamalı, ancak içerik aynı olmasına rağmen olur.
clockworkgeek

Bu eski sayıya göre, Magento sales_order_ * olaylarını yakalayamıyor , çözüm "frontend" klasörünü "webapi_rest" olarak değiştirmektir.
clockworkgeek

3

Lütfen sales_order_place_after etkinliğini kullanın .

Bu olay çağrısı yalnızca bir kez ve aşağıdaki fonksiyonda dosya satıcısı / magento / module-sales / Model / Order.php dosyasından sipariş başarıyla verildiğinde çağrılır .

/**
     * 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_beforeEtkinliği kullanabilirsiniz . Siparişe erişim sağlar ve ödemenin işlenip işlenmediğini kontrol etmenizi sağlar. Ardından, ödeme işleme koyulduğunda, şirket adı oluşturmanıza olanak tanıyacak şekilde yeniden tetiklenir.

Genel olarak Magento 2, eklentiler lehine olaylardan uzaklaşıyor gibi görünüyor. Topluluktaki birçok kişi bu yaklaşımı kabul etmese de, kesinlikle burada akılda tutulması gereken bir şey.


Cevap için teşekkürler @tjons. Görünüşe göre Magento 2'de çok fazla etkinlik kalmadı.
Eduardo

Hey @tjons, sales_order_state_change_beforebunun yerine denedim checkout_onepage_controller_success_actionama işe yaramadı. Bu etkinliği nereye yerleştirmem gerektiğinden ve ödeme sırasında tetiklenip tetiklenmeyeceğinden emin değilim. Ben benim olay etc/frontend/events.xmlneden herhangi bir ipucu?
Eduardo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.