Связи текущей Модели не передаются в email темплейт [Решено]

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Связи текущей Модели не передаются в email темплейт [Решено]

Сообщение leonenco »

Привет всем. Появилась проблема и вопрос: В модели `Orders` создал метод информирования клиента через email. Во время создания email передаю в темплейт `user`, `company` и `order` модели. В темлейте от `user` модели спокойно получаю его профайл и имя соответсвенно. Также могу получить $order->id. Не могу понять почему при получении обьекта `order` не могу получить `orderItems` через `hasMany`? Приведу мой код:
UserOrders model relation UserOrdersItems

Код: Выделить всё

 /**
     * @return \yii\db\ActiveQuery
     */
    public function getUserOrdersItems()
    {
        return $this->hasMany(UserOrdersItems::className(), ['user_orders_id' => 'id']);
    }
передача обьекта `UserOrders` в методе на событии `afterSave()`

Код: Выделить всё

 /**
     * Sends confirmation email to user
     * @param string $title email title
     * @param string $message Text message
     * @param int $type Template ID
     * @return bool whether the email was sent
     */
    protected function sendUserEmail($title, $message = null, $type = UserOrdersStatus::STATUS_CREATED)
    {
        switch($type){
            ...
        }
        if(!(Yii::$app
            ->mailer
            ->compose(
                [
                    'html' => 'templates/orders/' . $templateHtml, 
                    'text' => 'templates/orders/' . $templateText,
                ],
                [
                    'order' => $this, //<--Сдесь я передаю текущую модель Ордера
                    'user' => $this->user,
                    'company' => $this->company,
                    'message' => $message,
                ]
            )
            ->setFrom([Yii::$app->params['appEmail'] => Yii::$app->name])
            ->setTo($this->user->email)
            ->setSubject($title) //$this->getOrderStatus()->name
            ->send())){
            throw new RuntimeException("Error send order update email to user.");
        } return true; 
    }
темплейт

Код: Выделить всё

<h1><?= $user->profile->first_name ?></h1> <!--Works-->
<?php 
if($order->userOrdersItems !== null){
    echo "Items exist";
} else {
    echo "No Items"; //<-- выводит что null
}
?>
<?php foreach($order->userOrdersItems as $item): ?>
	<p><?= $item->created_at ?></p> <!--Не показывается, Хотя точно известно что Ордер имеет релатед запись с позицией-->
<?php endforeach; ?>
Точно также вывожу Товары ордера на странице пользователя без каких либо проблем. Вчем может быть проблема или где можно посмотреть необходимый материал? Заранее спасибо.
Последний раз редактировалось leonenco 2019.08.09, 10:43, всего редактировалось 1 раз.
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: Связи текущей Модели не передаются в email темплейт

Сообщение leonenco »

Ок Update,, в моделе `Orders` после вызова метода нотификации клиента, не могу получить связь `$this->userOrdersItems` которая возвращает `hasMany`. Почему?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Связи текущей Модели не передаются в email темплейт

Сообщение ElisDN »

Значит sendUserEmail вызываете в afterSave, когда OrderItem ещё не сохранили.
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: Связи текущей Модели не передаются в email темплейт

Сообщение leonenco »

Да нет, я сохраняю продукты после того как создал модель ордера, т.к. привязываю их к `order_id` вот код экшена где создаю модель и под_модели:

Код: Выделить всё

/**
     * Complete action after payment processed
     */
    public function actionComplete($response, $paymentId = null, $token = null, $updateTime = null, $payment_method_id = null, $payment_method_name = null)
    {
        $this->checkUserCartItemsExist();
        if($response == $this::RESPONSE_APPROVED){
            //Payment has been processed, so we can erase the cart and create order item
            //also notify client and company with new order.
            //try to create order
            //begin transaction
            $transaction = \Yii::$app->db->beginTransaction();
            try
            {
                //get default shipping address
                $shipping_address = $this->findDefaultUserShippingAddress();
                //get user cart
                $cart = $this->findShoppingCart();
                $company = $this->getCompany();
                $user = $this->getUser();
                
                $order = new UserOrders();
                $order->user_id = $user->id;
                $order->company_id = $company->id;
                $order->shipping_first_name = $this->_user->profile->first_name;
                $order->shipping_last_name = $this->_user->profile->last_name;
                $order->shipping_address = $shipping_address->street_name;
                //$order->shipping_address_sub;
                $order->shipping_city = $shipping_address->city;
                $order->shipping_state = $shipping_address->state;
                $order->shipping_zip =(string) $shipping_address->zip;
                $order->shipping_country = $shipping_address->country;
                $order->payment_method_id = intval($payment_method_id);
                $order->payment_method_name = $payment_method_name;
                $order->payment_status = $response;
                $order->payment_remote_id = $paymentId;
                $order->payment_token = $token;
                $order->payment_timestamp = $this->formatDate($updateTime);
                $order->order_shipping_cost = $cart->shipping_cost;
                $order->order_tax_cost = $cart->tax_cost;
                $order->order_total_cost = $cart->total_cost;
                if($order->payment_method_id === PaymentMethods::INPERSON_METHOD)
                {
                    $order->order_status_id = UserOrdersStatus::STATUS_CREATED;
                } else 
                {
                    $order->order_status_id = UserOrdersStatus::STATUS_PAYED;
                }                
                if($order->save())
                {
                    //get all cart products
                    foreach($cart->shopCartItems as $item)
                    {
                        $order_item = new UserOrdersItems();
                        $order_item->user_orders_id = $order->getPrimaryKey();
                        $order_item->product_id = $item->product_id;
                        $order_item->amount = $item->amount;
                        $order_item->sub_total = $item->sub_cost;
                        if($order_item->save())
                        {
                            //product saved
                            foreach($item->cartItemOptions as $option)
                            {
                                $order_item_option = new UserOrdersItemsOption();
                                $order_item_option->user_orders_items_id = $order_item->getPrimaryKey();
                                $order_item_option->option_id = $option->option_id;
                                $order_item_option->option_type_value = $option->option_type_value;
                                $order_item_option->cost = $option->cost;
                                if(!$order_item_option->save())
                                {
                                    //we have an error at the time of saving Order Item specification
                                    //parse error array
                                    $error_message = $this->arrayToString($order_item_option->getErrors());
                                    $notification = new Notifications(
                                            $this->className(),
                                            Notifications::TYPE_ERROR,
                                            "An Error occurred while saving ORDER ITEM OPTION AND payment has been processed. Order# " . $order->getPrimaryKey(),
                                            'Error description: ' . $error_message
                                            );
                                    $notification->save();
                                    \Yii::error('An Error occurred while saving ORDER ITEM OPTION AND payment has been processed.'
                                            . 'This order HAS NOT BEEN SAVED.'
                                            . ' WITH PARAMS: user_orders_items_id: ' . $order_item->getPrimaryKey()
                                            . ', option_id: ' . $option->option_id
                                            . ', option_type_value: ' . $option->option_type_value
                                            . ', cost: ' . $option->cost . ';'
                                            . ' ERROR PRODUCED: ' . $error_message
                                            . '; ' . 'ORDER_ID: ' . $order->getPrimaryKey()
                                            . '; ' . 'USER_ID: ' . $user->id
                                            . '; ' . 'COMPANY_ID: ' . $company->id
                                            . '; ' . 'PAYMENT_METHOD: ' . $payment_method_name
                                            . '; ' . 'PAYMENT_DATE: ' . $this->formatDate($updateTime)
                                            . '; ' . 'PAYMENT_ID: ' . $paymentId, 
                                            'Checkout->DefaultController->actionComplete');
                                    throw new IntegrityException("An Error occurred while saving ORDER ITEM OPTION");
                                }
                            }//end foreach item option
                            
                            //Order Item saved, we do nothing at this point
                        } else {
                            //we have an error at the time of saving Order Item
                            //parse error array
                            $error_message = $this->arrayToString($order_item->getErrors());
                            $notification = new Notifications(
                                    $this->className(),
                                    Notifications::TYPE_ERROR,
                                    "An Error occurred while saving ORDER ITEM AND payment has been processed. Order# " . $order->getPrimaryKey(),
                                    'Error description: ' . $error_message
                                    );
                            $notification->save();
                            \Yii::error('An Error occurred while saving ORDER ITEM object AND payment has been processed.'
                                    . 'This order HAS NOT BEEN SAVED.'
                                    . ' WITH PARAMS: user_orders_id: ' . $order->getPrimaryKey()
                                    . ', product_id: ' . $item->product_id
                                    . ', amount: ' . $item->amount
                                    . ', sub_total: ' . $item->sub_cost 
                                    . ';' . ' ERROR PRODUCED: ' . $error_message
                                    . '; ' . 'ORDER_ID: ' . $order->getPrimaryKey()
                                    . '; ' . 'USER_ID: ' . $user->id
                                    . '; ' . 'COMPANY_ID: ' . $company->id
                                    . '; ' . 'PAYMENT_METHOD: ' . $payment_method_name
                                    . '; ' . 'PAYMENT_DATE: ' . $this->formatDate($updateTime)
                                    . '; ' . 'PAYMENT_ID: ' . $paymentId, 
                                    'Checkout->DefaultController->actionComplete');
                            throw new IntegrityException("An Error occurred while saving ORDER ITEM");
                        }
                    } //end foreach item
                    
                } else {
                    //parse error array
                    $error_message = $this->arrayToString($order->getErrors());
                    $notification = new Notifications(
                            $this->className(),
                            Notifications::TYPE_ERROR,
                            "An Error occurred while saving ORDER AND payment has been processed. Cart#: " . $cart->id,
                            'Error description: ' . $error_message
                            );
                    $notification->save();
                    \Yii::error('An Error occurred while saving ORDER object AND payment has been processed.'
                            . 'This order HAS NOT BEEN SAVED.'
                            . ' WITH PARAMS: user_cart_id: ' . $cart->id
                            . ' ERROR PRODUCED: ' . $error_message
                            . '; ' . 'USER_ID: ' . $user->id
                            . '; ' . 'COMPANY_ID: ' . $company->id
                            . '; ' . 'PAYMENT_METHOD: ' . $payment_method_name
                            . '; ' . 'PAYMENT_DATE: ' . $this->formatDate($updateTime)
                            . '; ' . 'PAYMENT_ID: ' . $paymentId, 
                            'Checkout->DefaultController->actionComplete');
                    throw new IntegrityException("An Error occurred while saving ORDER");
                }
                //Order saved
                //erase cart items
                if(!$this->cleanUpUserCart()){
                    //error to clean user cart from items
                    \Yii::error('Error removing items from the cart, WITH PARAMS: userId:' . $user->id . '; companyId: ' . $company->id, 'Checkout->DefaultController->actionComplete');
                }
                //commit transaction
                $transaction->commit();
                //set complete
                if($order->payment_method_id === PaymentMethods::INPERSON_METHOD)
                {
                    \Yii::$app->session->setFlash('success', 'Thank you for new order. '
                        . 'Allow us up to 12 hours to process. '
                        . 'We will wait for your payment.', false);
                } 
                else 
                {
                    \Yii::$app->session->setFlash('success', 'Thank you for new order. '
                        . 'Allow us up to 12 hours to process. '
                        . 'We will send an notification email when your order will be shipped.', false);
                }   

                //render complete view
                return $this->render('complete');

                
            } catch (\Exception $e) {
                $transaction->rollBack();
                \Yii::error('An EXEPTION occurred while saving ORDER object AND payment has been processed.'
                    . 'This order HAS NOT BEEN SAVED.'
                    . ' WITH PARAMS: user_cart_id: ' . $cart->id
                    . ' ERROR PRODUCED: ' . $e
                    . '; ' . 'USER_ID: ' . $user->id
                    . '; ' . 'COMPANY_ID: ' . $company->id
                    . '; ' . 'PAYMENT_METHOD: ' . $payment_method_name
                    . '; ' . 'PAYMENT_DATE: ' . $this->formatDate($updateTime)
                    . '; ' . 'PAYMENT_ID: ' . $paymentId, 
                    'Checkout->DefaultController->actionComplete');
                return $this->redirect(['/cart']);
            } catch (\Throwable $e) {
                $transaction->rollBack();
                \Yii::error('An Throwable EXEPTION occurred while saving ORDER object AND payment has been processed.'
                    . 'This order HAS NOT BEEN SAVED.'
                    . ' WITH PARAMS: user_cart_id: ' . $cart->id
                    . ' ERROR PRODUCED: ' . $e
                    . '; ' . 'USER_ID: ' . $user->id
                    . '; ' . 'COMPANY_ID: ' . $company->id
                    . '; ' . 'PAYMENT_METHOD: ' . $payment_method_name
                    . '; ' . 'PAYMENT_DATE: ' . $this->formatDate($updateTime)
                    . '; ' . 'PAYMENT_ID: ' . $paymentId, 
                    'Checkout->DefaultController->actionComplete');
                return $this->redirect(['/cart']);
            } catch (IntegrityException $e) {
                $transaction->rollBack();
                \Yii::error('An EXEPTION occurred while saving ORDER object AND payment has been processed.'
                    . 'This order HAS NOT BEEN SAVED.'
                    . ' WITH PARAMS: user_cart_id: ' . $cart->id
                    . ' ERROR PRODUCED: ' . $e
                    . '; ' . 'USER_ID: ' . $user->id
                    . '; ' . 'COMPANY_ID: ' . $company->id
                    . '; ' . 'PAYMENT_METHOD: ' . $payment_method_name
                    . '; ' . 'PAYMENT_DATE: ' . $this->formatDate($updateTime)
                    . '; ' . 'PAYMENT_ID: ' . $paymentId, 
                    'Checkout->DefaultController->actionComplete');
                return $this->redirect(['/cart']);
            }//end transaction
            //send emails from UserOrder model, has been inplemented
            
        } elseif($response == $this::RESPONSE_CANCELED){
            //payment has been canceled we keep them the same
            \Yii::$app->session->setFlash('warning', 'Your payment has been canceled.', false);
            return $this->redirect(['/cart']);
        }
    }
Дмитрий в чем здесь проблема? я также через связь вывожу все заказы клиента и продукты. Почему не хочет в мэйле дергать связь?
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: Связи текущей Модели не передаются в email темплейт

Сообщение leonenco »

OK, я проанализировав ваши слова, понял, Вы правы....буду думать. как решить.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Связи текущей Модели не передаются в email темплейт

Сообщение ElisDN »

Сделайте метод публичным и дёргайте $order->sendUserEmail() из контроллера после всех сохранений.
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Связи текущей Модели не передаются в email темплейт

Сообщение Alexum »

Внесу свои 5 копеек - у вас action получился достаточно перегруженным, с вызовом множества вспомогательных методов, сильной вложенностью и дублирующимся кодом. Не задумывались о рефакторинге с вынесением некоторых вещей из контроллера?
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: Связи текущей Модели не передаются в email темплейт

Сообщение leonenco »

Ok, решение изменить момент нотификации с `newRecord` на existing в методе `afterSave()`, в контроллере после `$transaction->commit()` вызываю `$order->update()` чтобы отправить имэйл пользователю. Спасибо Дмитрий за наводку.
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: Связи текущей Модели не передаются в email темплейт

Сообщение leonenco »

Alexum писал(а): 2019.08.09, 10:27 Внесу свои 5 копеек - у вас action получился достаточно перегруженным, с вызовом множества вспомогательных методов, сильной вложенностью и дублирующимся кодом. Не задумывались о рефакторинге с вынесением некоторых вещей из контроллера?
Я согласен с вами. Накатываю основную логику сейчас, потом буду переносить по возможности в модели. Очень понравилось как Дмитрий делает с валидацией и сохранением нескольких вложеных моделей в одной основной. Буду над этим работать. Спасибо за коммент.
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: Связи текущей Модели не передаются в email темплейт

Сообщение leonenco »

ElisDN писал(а): 2019.08.09, 10:14 Сделайте метод публичным и дёргайте $order->sendUserEmail() из контроллера после всех сохранений.
Хотелось чтоб это все было на автомате, у меня метод в модели который чекает статус заказа и в зависимости от него делает нотификацию юзеру или админу.
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: Связи текущей Модели не передаются в email темплейт

Сообщение leonenco »

ElisDN писал(а): 2019.08.09, 10:14 Сделайте метод публичным и дёргайте $order->sendUserEmail() из контроллера после всех сохранений.
Так и сделал, нет смысла Апдэйтить весь ордер когда нужно только отправить имэйл. Вы как всегда правы. И надежнее, все айтемы точно сохранены перед отправкой имэйла.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Связи текущей Модели не передаются в email темплейт

Сообщение yiiliveext »

leonenco писал(а): 2019.08.09, 11:00
ElisDN писал(а): 2019.08.09, 10:14 Сделайте метод публичным и дёргайте $order->sendUserEmail() из контроллера после всех сохранений.
Хотелось чтоб это все было на автомате, у меня метод в модели который чекает статус заказа и в зависимости от него делает нотификацию юзеру или админу.
Сделайте событие в модели EVENT_ORDER_STATUS_CHANGED, тригерите его при смене статуса и повесьте обработчик который будет рассылать извещения в зависимости от статуса.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Связи текущей Модели не передаются в email темплейт

Сообщение ElisDN »

yiiliveext писал(а): 2019.08.14, 09:29 Сделайте событие в модели EVENT_ORDER_STATUS_CHANGED, тригерите его при смене статуса и повесьте обработчик который будет рассылать извещения в зависимости от статуса.
С транзакциями это криво работает.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Связи текущей Модели не передаются в email темплейт

Сообщение yiiliveext »

ElisDN писал(а): 2019.08.14, 18:20
yiiliveext писал(а): 2019.08.14, 09:29 Сделайте событие в модели EVENT_ORDER_STATUS_CHANGED, тригерите его при смене статуса и повесьте обработчик который будет рассылать извещения в зависимости от статуса.
С транзакциями это криво работает.
Если триггерить в контроллере, после коммита, то почему будет криво работать.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Связи текущей Модели не передаются в email темплейт

Сообщение ElisDN »

yiiliveext писал(а): 2019.08.14, 18:26 Если триггерить в контроллере, после коммита, то почему будет криво работать.
В контроллере триггерить событие сущности?
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Связи текущей Модели не передаются в email темплейт

Сообщение yiiliveext »

ElisDN писал(а): 2019.08.14, 19:57
yiiliveext писал(а): 2019.08.14, 18:26 Если триггерить в контроллере, после коммита, то почему будет криво работать.
В контроллере триггерить событие сущности?
Если вас это смущает, можете создать это событие в контроллере.
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: Связи текущей Модели не передаются в email темплейт

Сообщение leonenco »

yiiliveext писал(а): 2019.08.14, 20:11
ElisDN писал(а): 2019.08.14, 19:57
yiiliveext писал(а): 2019.08.14, 18:26 Если триггерить в контроллере, после коммита, то почему будет криво работать.
В контроллере триггерить событие сущности?
Если вас это смущает, можете создать это событие в контроллере.
У меня возникнет проблема, так как на event created при условии что пэмент "лично в руки", я получу такую же проблему как было изначально. Позиции еще не сохранены а event уже сработал на ордере.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Связи текущей Модели не передаются в email темплейт

Сообщение yiiliveext »

leonenco писал(а): 2019.08.15, 06:06 У меня возникнет проблема, так как на event created при условии что пэмент "лично в руки", я получу такую же проблему как было изначально. Позиции еще не сохранены а event уже сработал на ордере.
Если вы после $transaction->commit() сделаете так:

Код: Выделить всё

$orderStatusEvent =  \Yii::createObject(['class' => OrderStatusEvent::class, 'status' => $order->order_status_id]);
$order->trigger($order::EVENT_ORDER_STATUS_CHANGED, $orderStatusEvent);
То в событие передастся уже объект с сохраненными связями. Для того, чтобы триггерить событие в сущности, вам нужно перенести сохранение связей в afterSave, предварительно записав их в конроллере в соответствующие свойства модели, либо используя populateRelation. В модели нужно включить транзакции:

Код: Выделить всё

public function transactions()
    {
        return [
            self::SCENARIO_DEFAULT => self::OP_ALL,
        ];
    }

Для сохранения связей можно также использовать готовое решение https://github.com/la-haute-societe/yii ... s-behavior
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Связи текущей Модели не передаются в email темплейт

Сообщение ElisDN »

yiiliveext писал(а): 2019.08.15, 11:18 Если вы после $transaction->commit() сделаете так:

Код: Выделить всё

$orderStatusEvent =  \Yii::createObject(['class' => OrderStatusEvent::class, 'status' => $order->order_status_id]);
$order->trigger($order::EVENT_ORDER_STATUS_CHANGED, $orderStatusEvent);
...
1. Для создания событий \Yii::createObject не нужен.

2. Из одного объекта триггерить события другого - костыль. Зря не сделали метод trigger с модификатором protected.

3. Оптимальный вариант агрегации с save-relations-behavior. Но всё равно есть нюанс с тем, что если $order->save() выполняется внутри ещё одной внешней транзакции, то OP_ALL с $this->trigger(...) в afterSave сущности тоже пролетает.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Связи текущей Модели не передаются в email темплейт

Сообщение yiiliveext »

ElisDN писал(а): 2019.08.15, 11:56 1. Для создания событий \Yii::createObject не нужен.
В данном случае ради краткости. Можно было в две строчки:

Код: Выделить всё

$orderStatusEvent = new OrderStatusEvent();
$orderStatusEvent->status = $order->order_status_id;
ElisDN писал(а): 2019.08.15, 11:56 2. Из одного объекта триггерить события другого - костыль. Зря не сделали метод trigger с модификатором protected.
Да, немного костыль. Но не во всех приложениях нужна идеальная архитектура.
ElisDN писал(а): 2019.08.15, 11:56 3. Оптимальный вариант агрегации с save-relations-behavior. Но всё равно есть нюанс с тем, что если $order->save() выполняется внутри ещё одной внешней транзакции, то OP_ALL с $this->trigger(...) в afterSave сущности тоже пролетает.
Да, этот момент не продуман с транзакциями в ActiveRecord. Но можно отнаследоваться и сделать что-то вроде

Код: Выделить всё

class MyActiveRecord extends \yii\db\ActiveRecord
{
    const EVENT_AFTER_COMMIT = 'afterCommit';

    public function insert($runValidation = true, $attributes = null)
    {
        $result = parent::insert($runValidation, $attributes);
        if ($result && $this->isTransactional(self::OP_INSERT)) {
            $this->afterCommit();
        }
    }

    public function afterCommit()
    {
        $this->trigger(self::EVENT_AFTER_COMMIT);
    }
}
Ну и дальше в модели в методе afterCommit уже триггерить событие EVENT_ORDER_STATUS_CHANGED
Ответить