Да нет, я сохраняю продукты после того как создал модель ордера, т.к. привязываю их к `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']);
}
}
Дмитрий в чем здесь проблема? я также через связь вывожу все заказы клиента и продукты. Почему не хочет в мэйле дергать связь?