public function actionOrder() { $order = new Order(); /* @var $cart ShoppingCart */ $cart = \Yii::$app->cart; /* @var $products Product[] */ $products = $cart->getPositions(); $total = $cart->getCost(); if ($order->load(\Yii::$app->request->post()) && $order->validate()) { $transaction = $order->getDb()->beginTransaction(); $order->save(false); foreach ($products as $product) { $orderItem = new OrderItem(); $orderItem->order_id = $order->id; $orderItem->title = $product->title; $orderItem->price = $product->getPrice(); $orderItem->product_id = $product->id; $orderItem->quantity = $product->getQuantity(); if (!$orderItem->save(false)) { $transaction->rollBack(); \Yii::$app->session->addFlash('error', 'Cannot place your order. Please contact us.'); return $this->redirect('catalog/list'); } } $transaction->commit(); \Yii::$app->cart->removeAll(); \Yii::$app->session->addFlash('success', 'Thanks for your order. We\'ll contact you soon.'); $order->sendEmail(); return $this->redirect('catalog/list'); } return $this->render('order', ['order' => $order, 'products' => $products, 'total' => $total]); }