Esempio n. 1
0
 /**
  * 訂單派送頁面,包含有購物車派送明細(可派送與不可派送的表單),清除購物車
  * 
  * ------------------------ 產生訂單流程 --------------------------
  *
  * ->建立發票
  * 
  * ->迭代商品
  *       建立訂單
  *
  * ---------------------------------------------------------------
  * 
  * @Route("/payment/generate", name="front_payment_generate", options={"expose"=true})
  * @Method("POST")
  */
 public function generateAction(Request $request)
 {
     if (!$this->get('security.csrf.token_manager')->isCsrfTokenValid('invoice', $request->request->get('avenue_token'))) {
         throw new AccessDeniedHttpException('Invalid CSRF token.');
     }
     $paymentHelper = new PaymentHelper();
     /**
      * 商品的索引陣列
      * 
      * @var array
      */
     $ids = json_decode($request->cookies->get('avenueCart'));
     if (empty($ids)) {
         return $this->redirect($this->get('router')->generate('front_payment_checkout'));
     }
     /**
      * Entity Manager
      */
     $em = $this->getDoctrine()->getManager();
     /**
      * 商品實體陣列
      * 
      * @var array{\Woojin\GoodsBundle\Entity\GoodsPassport}
      */
     $products = $em->getRepository('WoojinGoodsBundle:GoodsPassport')->findByIds($ids);
     if (empty($products)) {
         $this->redirect($this->get('router')->generate('front_payment_checkout'));
     }
     /**
      * 商品狀態不合法因此無法加入訂單的商品陣列
      * 
      * @var array{\Woojin\GoodsBundle\Entity\GoodsPassport}
      */
     $failedProducts = array();
     $paymentHelper->dropFail($products, $failedProducts);
     /**
      * Session
      * 
      * @var Session
      */
     $session = $this->get('session');
     /**
      * 客戶index
      * 
      * @var integer
      */
     $customId = $paymentHelper->getCustomIdFromSession($session);
     /**
      * Custom
      * 
      * @var \Woojin\OrderBundle\Entity\Custom
      */
     if (!($custom = $paymentHelper->getValidCustom($em, $request, $customId))) {
         return $this->redirect($this->get('router')->generate('front_payment_checkout'));
     }
     /**
      * 此元件將會自動處理整個販售流程
      * 
      * @var \Woojin\Utility\Que\Sell\Seller
      */
     $seller = $this->get('seller');
     /**
      * 發票
      * 
      * @var \Woojin\OrderBundle\Entity\Invoice
      */
     $invoice = !empty($products) ? $seller->sell($custom, $products, $request) : null;
     $creditInstallment = $request->request->get('creditInstallment', 0);
     if ($creditInstallment > 0) {
         $invoice->setCreditInstallment($creditInstallment);
     }
     $em->persist($invoice);
     $em->flush();
     $serializer = \JMS\Serializer\SerializerBuilder::create()->build();
     $session->set('custom', $serializer->serialize($custom, 'json'));
     // $session->set('avenue_token', $custom->getCsrf());
     // 這邊不直接使用 Template() 而改用 Response render是因為要使用 response 物件的 clear Cookie 方法。
     // generate.html.twig 其實只是一個中繼頁面,該頁面讀取完畢後會自動 submit form 前往 'front_payment_passAllpay   '
     $engine = $this->container->get('templating');
     $content = $engine->render('WoojinFrontBundle:Payment:generate.html.twig', array('invoice' => $invoice));
     /**
      * Response
      * 
      * @var Symfony\Component\HttpFoundation\Response
      */
     $response = new Response($content);
     $response->headers->clearCookie('avenueCart');
     return $response;
 }