Eccube\Controller\ShoppingController::confirm PHP Метод

confirm() публичный Метод

購入処理
public confirm ( Application $app, Request $request )
$app Eccube\Application
$request Symfony\Component\HttpFoundation\Request
    public function confirm(Application $app, Request $request)
    {
        $cartService = $app['eccube.service.cart'];
        // カートチェック
        if (!$cartService->isLocked()) {
            // カートが存在しない、カートがロックされていない時はエラー
            log_info('カートが存在しません');
            return $app->redirect($app->url('cart'));
        }
        $Order = $app['eccube.service.shopping']->getOrder($app['config']['order_processing']);
        if (!$Order) {
            log_info('購入処理中の受注情報がないため購入エラー');
            $app->addError('front.shopping.order.error');
            return $app->redirect($app->url('shopping_error'));
        }
        if ('POST' !== $request->getMethod()) {
            return $app->redirect($app->url('cart'));
        }
        // form作成
        $builder = $app['eccube.service.shopping']->getShippingFormBuilder($Order);
        $event = new EventArgs(array('builder' => $builder, 'Order' => $Order), $request);
        $app['eccube.event.dispatcher']->dispatch(EccubeEvents::FRONT_SHOPPING_CONFIRM_INITIALIZE, $event);
        $form = $builder->getForm();
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $data = $form->getData();
            log_info('購入処理開始', array($Order->getId()));
            // トランザクション制御
            $em = $app['orm.em'];
            $em->getConnection()->beginTransaction();
            try {
                // お問い合わせ、配送時間などのフォーム項目をセット
                $app['eccube.service.shopping']->setFormData($Order, $data);
                // 購入処理
                $app['eccube.service.shopping']->processPurchase($Order);
                $em->flush();
                $em->getConnection()->commit();
                log_info('購入処理完了', array($Order->getId()));
            } catch (ShoppingException $e) {
                log_error('購入エラー', array($e->getMessage()));
                $em->getConnection()->rollback();
                $app->log($e);
                $app->addError($e->getMessage());
                return $app->redirect($app->url('shopping_error'));
            } catch (\Exception $e) {
                log_error('予期しないエラー', array($e->getMessage()));
                $em->getConnection()->rollback();
                $app->log($e);
                $app->addError('front.shopping.system.error');
                return $app->redirect($app->url('shopping_error'));
            }
            // カート削除
            $app['eccube.service.cart']->clear()->save();
            $event = new EventArgs(array('form' => $form, 'Order' => $Order), $request);
            $app['eccube.event.dispatcher']->dispatch(EccubeEvents::FRONT_SHOPPING_CONFIRM_PROCESSING, $event);
            if ($event->getResponse() !== null) {
                log_info('イベントレスポンス返却', array($Order->getId()));
                return $event->getResponse();
            }
            // 受注IDをセッションにセット
            $app['session']->set($this->sessionOrderKey, $Order->getId());
            // メール送信
            $MailHistory = $app['eccube.service.shopping']->sendOrderMail($Order);
            $event = new EventArgs(array('form' => $form, 'Order' => $Order, 'MailHistory' => $MailHistory), $request);
            $app['eccube.event.dispatcher']->dispatch(EccubeEvents::FRONT_SHOPPING_CONFIRM_COMPLETE, $event);
            if ($event->getResponse() !== null) {
                log_info('イベントレスポンス返却', array($Order->getId()));
                return $event->getResponse();
            }
            // 完了画面表示
            return $app->redirect($app->url('shopping_complete'));
        }
        log_info('購入チェックエラー', array($Order->getId()));
        return $app->render('Shopping/index.twig', array('form' => $form->createView(), 'Order' => $Order));
    }