문제

We have two modules which fire the same event checkout_submit_all_after.But i need to give a preference for this , i tried giving sequence in module b but it won't work.For ex Module A and Module B triggers the same event, but module B triggers first, my requirement is to trigger Module A and after Module B , is there any way i can do this. And what are the events triggers when order is placed through cron jobs, I have used checkout_submit_all_after, does this event fires if the order is placed through crons?.

Please give me any solution for to go forward. Thank You

도움이 되었습니까?

해결책

At first, question, you want to trigger Module A module observer then fire observer of Module B.

Then below is my solution is of this case.

Disable Module B using xml code.

Then Create around plugin the method ModuleA_ObserverClass::execute(\Magento\Framework\Event\Observer $observer) of Observer of module A.

And on that around Plugin PluginClass::aroundExecute() execute original ModuleA_ObserverClass::execute(\Magento\Framework\Event\Observer $observer) and using $proceed(\ModuleA_ObserverClass $subject,\Callable ,$observer) And after running of origina method , add new method to PluginClass.

And on this new method, copy all code of ModuleB: execute and run after $proceed($observer).

Step1: Disable Observer of Module B

<event name="checkout_submit_all_after">
    <observer name="{ModuleB_Observer_Classs}" instance="{observerClassNameOfModuleB}" />
</event>

Assume above one is observer declaration of ModuleB. First, we have to disable this observer.

Let's create An events.xml at your custom module and disable this by XML node disabled.

<?xml version="1.0"?>
<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">
    <!-- Note that observer name should be same  of Module B observer -->
        <observer name="{ModuleB_Observer_Classs}" disabled="true" />
    </event>
</config>

Step2: Create around plugin on ModuleA_ObserverClass::execute()

Create di.xml and declare the around plugin for ModuleA_ObserverClass::execute(\Magento\Framework\Event\Observer $observer).

<?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="ModuleA_ObserverClass">
        <plugin name="ModuleA_ObserverClass_My_plugin" sortOrder="10" type="{PluginClass}"/>
    </type>     
</config>

And Plugin code:

<?php

namespace {Namespace};


class {PluginClass} {

    public function aroundExecute(
      \ModuleA_Observer_Classs $subject,
       callable $proceed,
       \Magento\Framework\Event\Observer $observer    
   ){
        //This code run original Merthod
        $proceed($observer);
        $this->replicatedMethodExecuteofObseverOfModuleB($observer);
    }

    public function replicatedMethodExecuteofObseverOfModuleB($observer)
    {
        // Copy all code of `ModuleA_ObserverClass::execute(\Magento\Framework\Event\Observer $observer)`
        // and paste here
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 magento.stackexchange
scroll top