/**
  * @param ProductCategory $TargetProductCategory
  * @param $position
  * @return bool
  * @throws \Doctrine\DBAL\ConnectionException
  */
 public function moveRank(ProductCategory $TargetProductCategory, $position)
 {
     $repos = $this->_em->getRepository('\\Eccube\\Entity\\ProductCategory');
     $this->_em->getConnection()->beginTransaction();
     try {
         $oldRank = $TargetProductCategory->getRank();
         // 最大値取得
         $qb = $repos->createQueryBuilder('pc');
         $max = $qb->select($qb->expr()->max('pc.rank'))->where($qb->expr()->eq('pc.category_id', $TargetProductCategory->getCategoryId()))->getQuery()->getSingleScalarResult();
         $position = $max - ($position - 1);
         $position = max(1, $position);
         $TargetProductCategory->setRank($position);
         $status = true;
         if ($position != $oldRank) {
             // 他のItemのランクを調整する
             if ($position < $oldRank) {
                 // down
                 $this->_em->createQueryBuilder()->update('\\Eccube\\Entity\\ProductCategory', 'pc')->set('pc.rank', 'pc.rank + 1')->where('pc.rank <= :oldRank AND pc.rank >= :rank AND pc.category_id = :category_id AND pc.product_id != :product_id')->setParameter('oldRank', $oldRank)->setParameter('rank', $position)->setParameter('category_id', $TargetProductCategory->getCategoryId())->setParameter('product_id', $TargetProductCategory->getProductId())->getQuery()->execute();
             } else {
                 // up
                 $this->_em->createQueryBuilder()->update('\\Eccube\\Entity\\ProductCategory', 'pc')->set('pc.rank', 'pc.rank - 1')->where('pc.rank >= :oldRank AND pc.rank <= :rank AND pc.category_id = :category_id AND pc.product_id != :product_id')->setParameter('oldRank', $oldRank)->setParameter('rank', $position)->setParameter('category_id', $TargetProductCategory->getCategoryId())->setParameter('product_id', $TargetProductCategory->getProductId())->getQuery()->execute();
             }
             $this->_em->persist($TargetProductCategory);
             $this->_em->flush();
         }
         $this->_em->getConnection()->commit();
         return $status;
     } catch (\Exception $e) {
         $this->_em->getConnection()->rollback();
         $this->_em->close();
         $this->app->log($e);
     }
     return false;
 }
示例#2
0
 /**
  * 購入処理
  */
 public function confirm(Application $app, Request $request)
 {
     $cartService = $app['eccube.service.cart'];
     // カートチェック
     if (!$cartService->isLocked()) {
         // カートが存在しない、カートがロックされていない時はエラー
         return $app->redirect($app->url('cart'));
     }
     $Order = $app['eccube.service.shopping']->getOrder($app['config']['order_processing']);
     if (!$Order) {
         $app->addError('front.shopping.order.error');
         return $app->redirect($app->url('shopping_error'));
     }
     if ('POST' !== $request->getMethod()) {
         return $app->redirect($app->url('cart'));
     }
     // form作成
     $form = $app['eccube.service.shopping']->getShippingForm($Order);
     $form->handleRequest($request);
     if ($form->isSubmitted() && $form->isValid()) {
         $data = $form->getData();
         // トランザクション制御
         $em = $app['orm.em'];
         $em->getConnection()->beginTransaction();
         try {
             // 商品公開ステータスチェック、商品制限数チェック、在庫チェック
             $check = $app['eccube.service.shopping']->isOrderProduct($em, $Order);
             if (!$check) {
                 $em->getConnection()->rollback();
                 $app->addError('front.shopping.stock.error');
                 return $app->redirect($app->url('shopping_error'));
             }
             // 受注情報、配送情報を更新
             $app['eccube.service.shopping']->setOrderUpdate($Order, $data);
             // 在庫情報を更新
             $app['eccube.service.shopping']->setStockUpdate($em, $Order);
             if ($app->isGranted('ROLE_USER')) {
                 // 会員の場合、購入金額を更新
                 $app['eccube.service.shopping']->setCustomerUpdate($Order, $app->user());
             }
             $em->flush();
             $em->getConnection()->commit();
         } catch (\Exception $e) {
             $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();
         // メール送信
         $app['eccube.service.mail']->sendOrderMail($Order);
         // 受注IDをセッションにセット
         $app['session']->set($this->sessionOrderKey, $Order->getId());
         // 送信履歴を保存.
         $MailTemplate = $app['eccube.repository.mail_template']->find(1);
         $body = $app->renderView($MailTemplate->getFileName(), array('header' => $MailTemplate->getHeader(), 'footer' => $MailTemplate->getFooter(), 'Order' => $Order));
         $MailHistory = new MailHistory();
         $MailHistory->setSubject('[' . $app['eccube.repository.base_info']->get()->getShopName() . '] ' . $MailTemplate->getSubject())->setMailBody($body)->setMailTemplate($MailTemplate)->setSendDate(new \DateTime())->setOrder($Order);
         $app['orm.em']->persist($MailHistory);
         $app['orm.em']->flush($MailHistory);
         // 完了画面表示
         return $app->redirect($app->url('shopping_complete'));
     }
     return $app->render('Shopping/index.twig', array('form' => $form->createView(), 'Order' => $Order));
 }
示例#3
0
 /**
  * APIリクエスト処理
  *
  * @param Request $request
  * @param $authKey
  * @param string $url
  * @param Application $app
  * @return array
  */
 private function getRequestApi(Request $request, $authKey, $url, $app)
 {
     $curl = curl_init($url);
     $options = array(CURLOPT_HTTPHEADER => array('Authorization: ' . base64_encode($authKey), 'x-eccube-store-url: ' . base64_encode($request->getSchemeAndHttpHost() . $request->getBasePath()), 'x-eccube-store-version: ' . base64_encode(Constant::VERSION)), CURLOPT_HTTPGET => true, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_FAILONERROR => true, CURLOPT_CAINFO => \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath());
     curl_setopt_array($curl, $options);
     /// オプション値を設定
     $result = curl_exec($curl);
     $info = curl_getinfo($curl);
     $message = curl_error($curl);
     $info['message'] = $message;
     curl_close($curl);
     $app->log('http get_info', $info);
     return array($result, $info);
 }
示例#4
0
 /**
  * APIリクエスト処理
  *
  * @param Request $request
  * @param $authKey
  * @param string $url
  * @param Application $app
  * @return array
  */
 private function getRequestApi(Request $request, $authKey, $url, $app)
 {
     $curl = curl_init($url);
     $options = array(CURLOPT_HTTPHEADER => array('Authorization: ' . base64_encode($authKey), 'x-eccube-store-url: ' . base64_encode($request->getSchemeAndHttpHost() . $request->getBasePath()), 'x-eccube-store-version: ' . base64_encode(Constant::VERSION)), CURLOPT_HTTPGET => true, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_FAILONERROR => true);
     curl_setopt_array($curl, $options);
     /// オプション値を設定
     $certFile = $app['config']['root_dir'] . '/app/config/eccube/' . $this->certFileName;
     if (file_exists($certFile)) {
         // php5.6でサーバ上に適切な証明書がなければhttps通信エラーが発生するため、
         // http://curl.haxx.se/ca/cacert.pem を利用して通信する
         curl_setopt($curl, CURLOPT_CAINFO, $certFile);
     }
     $result = curl_exec($curl);
     $info = curl_getinfo($curl);
     $message = curl_error($curl);
     $info['message'] = $message;
     curl_close($curl);
     $app->log('http get_info', $info);
     return array($result, $info);
 }
 /**
  * お客様情報の変更(非会員)
  */
 public function customer(Application $app, Request $request)
 {
     if ($request->isXmlHttpRequest()) {
         try {
             $data = $request->request->all();
             $Order = $app['eccube.service.shopping']->getOrder($app['config']['order_processing']);
             $pref = $app['eccube.repository.master.pref']->findOneBy(array('name' => $data['customer_pref']));
             if (!$pref) {
                 $response = new Response(json_encode('NG'), 500);
                 $response->headers->set('Content-Type', 'application/json');
                 return $response;
             }
             $Order->setName01($data['customer_name01'])->setName02($data['customer_name02'])->setCompanyName($data['customer_company_name'])->setTel01($data['customer_tel01'])->setTel02($data['customer_tel02'])->setTel03($data['customer_tel03'])->setZip01($data['customer_zip01'])->setZip02($data['customer_zip02'])->setZipCode($data['customer_zip01'] . $data['customer_zip02'])->setPref($pref)->setAddr01($data['customer_addr01'])->setAddr02($data['customer_addr02'])->setEmail($data['customer_email']);
             // 配送先を更新
             $app['orm.em']->flush();
             // 受注関連情報を最新状態に更新
             $app['orm.em']->refresh($Order);
             $response = new Response(json_encode('OK'));
             $response->headers->set('Content-Type', 'application/json');
         } catch (\Exception $e) {
             $app->log($e);
             $response = new Response(json_encode('NG'), 500);
             $response->headers->set('Content-Type', 'application/json');
         }
         return $response;
     }
 }
示例#6
0
 /**
  * 購入処理
  */
 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));
 }
 /**
  * 購入処理
  */
 public function confirm(Application $app, Request $request)
 {
     $cartService = $app['eccube.service.cart'];
     // カートチェック
     if (!$cartService->isLocked()) {
         // カートが存在しない、カートがロックされていない時はエラー
         return $app->redirect($app->url('cart'));
     }
     $Order = $app['eccube.service.shopping']->getOrder($app['config']['order_processing']);
     if (!$Order) {
         $app->addError('front.shopping.order.error');
         return $app->redirect($app->url('shopping_error'));
     }
     // form作成
     $form = $app['eccube.service.shopping']->getShippingForm($Order);
     if ('POST' === $request->getMethod()) {
         $form->handleRequest($request);
         if ($form->isValid()) {
             $data = $form->getData();
             // トランザクション制御
             $em = $app['orm.em'];
             $em->getConnection()->beginTransaction();
             try {
                 // 商品公開ステータスチェック、商品制限数チェック、在庫チェック
                 $check = $app['eccube.service.shopping']->isOrderProduct($em, $Order);
                 if (!$check) {
                     $em->getConnection()->rollback();
                     $em->close();
                     $app->addError('front.shopping.stock.error');
                     return $app->redirect($app->url('shopping_error'));
                 }
                 // 受注情報、配送情報を更新
                 $app['eccube.service.shopping']->setOrderUpdate($Order, $data);
                 // 在庫情報を更新
                 $app['eccube.service.shopping']->setStockUpdate($em, $Order);
                 if ($app->isGranted('ROLE_USER')) {
                     // 会員の場合、購入金額を更新
                     $app['eccube.service.shopping']->setCustomerUpdate($Order, $app->user());
                 }
                 $em->getConnection()->commit();
                 $em->flush();
                 $em->close();
             } catch (\Exception $e) {
                 $em->getConnection()->rollback();
                 $em->close();
                 $app->log($e);
                 $app->addError('front.shopping.system.error');
                 return $app->redirect($app->url('shopping_error'));
             }
             // カート削除
             $app['eccube.service.cart']->clear()->save();
             // メール送信
             $app['eccube.service.mail']->sendOrderMail($Order);
             // 受注IDをセッションにセット
             $app['session']->set($this->sessionOrderKey, $Order->getId());
             // 完了画面表示
             return $app->redirect($app->url('shopping_complete'));
         } else {
             return $app->render('Shopping/index.twig', array('form' => $form->createView(), 'Order' => $Order));
         }
     }
     return $app->redirect($app->url('cart'));
 }