Как справиться с конфликтом при переопределении Magento \ Sales \ Model \ Order \ Email \ Sender \ OrderSender в Magento 2 - PullRequest
0 голосов
/ 02 июля 2018

У меня возникла проблема с переопределением модели OrderSender в Magento 2 в результате создания пользовательского платежного модуля.

Прежде всего, я не смог предотвратить отправку электронной почты после того, как заказ сделан (успешный или неуспешный), что было проблемой, поэтому я решил создать поток, который переопределяет OrderSender с использованием рекомендованного процесса. указав файл настроек в модуле, т.е.

class OrderSender extends \Magento\Sales\Model\Order\Email\Sender\OrderSender{

/**
 * Sends order email to the customer.
 *
 * Email will be sent immediately in two cases:
 *
 * - if asynchronous email sending is disabled in global settings
 * - if $forceSyncMode parameter is set to TRUE
 *
 * Otherwise, email will be sent later during running of
 * corresponding cron job.
 *
 * @param Order $order
 * @param bool $forceSyncMode
 * @return bool
 */
public function send(Order $order, $forceSyncMode = false)
{
    $payment = $order->getPayment()->getMethodInstance()->getCode();

    //allow other module or payment to proceed should in case it is not my payment module is calling for order sender.
    if($payment == 'afronijapay' && !$forceSyncMode){
        return false;
    }

    $order->setSendEmail(true);

    if (!$this->globalConfig->getValue('sales_email/general/async_sending') || $forceSyncMode) {
        if ($this->checkAndSend($order)) {
            $order->setEmailSent(true);
            $this->orderResource->saveAttribute($order, ['send_email', 'email_sent']);
            return true;
        }
    }

    $this->orderResource->saveAttribute($order, 'send_email');

    return false;
}}

, как показано выше, поэтому все работало нормально, и я должен был отправить электронное письмо после завершения процесса, а затем, после успешного платежа, позвонил следующим.

//send new order email
            $this->_checkout_session->setForceOrderMailSentOnSuccess(true);
            $this->_orderSender->send($order, true);

Опять же, я нашел это как некое предлагаемое решение из нескольких источников, включая stackoverflow / stackexchange и все.

Однако, насколько это работает, возникает другая проблема, а именно: что, если кто-то уже переопределяет этот класс из другого модуля, а Magento 2 использует этот переопределяемый класс без моего, тогда проблема может возникнуть снова.

Я построил еще один платежный модуль (просто копию оригинала), используя другое пространство имен и имя поставщика, и у меня возник страх, когда Magento 2 игнорирует один из классов, переопределяющих класс OrderSender, и использует другой, тем самым создавая проблему для начать заново.

Буду признателен за любые предложения по решению этой проблемы. Спасибо.

1 Ответ

0 голосов
/ 13 июля 2018

После стольких испытаний я наконец-то придумала этот план

создать событие в вашем

<Vendor>/<ModuleName>/etc.xml

<?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="sales_order_place_after"> <observer name="<vendor>_<modulename>_event_email_stopper" instance="<Vendor>\<ModuleName>\Event\EmailStopper\Order\Email" /> </event> </config>

Затем создайте класс с именем Email.php в каталоге \\ Event \ EmailStopper \ Order \ со следующим содержимым

 namespace <Vendor>\<ModuleName>\Event\EmailStopper\Order;
class Email implements \Magento\Framework\Event\ObserverInterface
{
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $this->objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    try{
        $order = $observer->getEvent()->getOrder();
        $this->_current_order = $order;

        $payment = $order->getPayment()->getMethodInstance()->getCode();

        if($payment == 'chukplcspredirect' || $payment == 'chukplcspdirect'){
            $this->stopNewOrderEmail($order);
        }
    }
    catch (\ErrorException $ee){

    }
    catch (\Exception $ex)
    {

    }
    catch (\Error $error){

    }

}

public function stopNewOrderEmail(\Magento\Sales\Model\Order $order){
    $order->setCanSendNewEmailFlag(false);
    $order->setSendEmail(false);
    try{
        $order->save();
    }
    catch (\ErrorException $ee){

    }
    catch (\Exception $ex)
    {

    }
    catch (\Error $error){

    }
}
} 

и когда вы закончите, вы можете легко отправить электронное письмо для заказа, используя код ниже

$order->setCanSendNewEmailFlag(true);
$order->save();
$this->_checkout_session->setForceOrderMailSentOnSuccess(true);
$this->_orderSender->send($order, true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...