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));
}