app/Plugin/CustomerReview42/Controller/ReviewPostController.php line 96

Open in your IDE?
  1. <?php
  2. namespace Plugin\CustomerReview42\Controller;
  3. use Plugin\CustomerReview42\Entity\CustomerReviewName;
  4. use Plugin\CustomerReview42\Entity\CustomerReviewList;
  5. use Plugin\CustomerReview42\Entity\CustomerReviewStatus;
  6. use Plugin\CustomerReview42\Repository\CustomerReviewConfigRepository;
  7. use Plugin\CustomerReview42\Repository\CustomerReviewNameRepository;
  8. use Plugin\CustomerReview42\Repository\CustomerReviewListRepository;
  9. use Plugin\CustomerReview42\Repository\CustomerReviewStatusRepository;
  10. use Plugin\CustomerReview42\Form\Type\ReviewPostType;
  11. use Eccube\Controller\AbstractController;
  12. use Eccube\Entity\Master\OrderStatus;
  13. use Eccube\Entity\Master\ProductStatus;
  14. use Eccube\Entity\Product;
  15. use Eccube\Repository\BaseInfoRepository;
  16. use Eccube\Repository\ProductRepository;
  17. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  18. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. class ReviewPostController extends AbstractController
  23. {
  24.     /**
  25.      * @var BaseInfo
  26.      */
  27.     protected $BaseInfo;
  28.     /**
  29.      * @var ProductRepository
  30.      */
  31.     protected $productRepository;
  32.     /**
  33.      * @var CustomerReviewConfigRepository
  34.      */
  35.     protected $customerReviewConfigRepository;
  36.     /**
  37.      * @var CustomerReviewNameRepository
  38.      */
  39.     protected $customerReviewNameRepository;
  40.     /**
  41.      * @var CustomerReviewListRepository
  42.      */
  43.     protected $customerReviewListRepository;
  44.     /**
  45.      * @var CustomerReviewStatusRepository
  46.      */
  47.     protected $customerReviewStatusRepository;
  48.     /**
  49.      * ReviewPostController constructor.
  50.      *
  51.      * @param BaseInfoRepository $baseInfoRepository
  52.      * @param ProductRepository $productRepository
  53.      * @param CustomerReviewConfigRepository $customerReviewConfigRepository
  54.      * @param CustomerReviewNameRepository $customerReviewNameRepository
  55.      * @param CustomerReviewListRepository $customerReviewListRepository
  56.      * @param CustomerReviewStatusRepository $customerReviewStatusRepository
  57.      */
  58.     public function __construct(
  59.         BaseInfoRepository $baseInfoRepository,
  60.         ProductRepository $productRepository,
  61.         CustomerReviewConfigRepository $customerReviewConfigRepository,
  62.         CustomerReviewNameRepository $customerReviewNameRepository,
  63.         CustomerReviewListRepository $customerReviewListRepository,
  64.         CustomerReviewStatusRepository $customerReviewStatusRepository
  65.     ) {
  66.         $this->BaseInfo $baseInfoRepository->get();
  67.         $this->productRepository $productRepository;
  68.         $this->customerReviewConfigRepository $customerReviewConfigRepository;
  69.         $this->customerReviewNameRepository $customerReviewNameRepository;
  70.         $this->customerReviewListRepository $customerReviewListRepository;
  71.         $this->customerReviewStatusRepository $customerReviewStatusRepository;
  72.     }
  73.     /**
  74.      * レビュー投稿画面.
  75.      *
  76.      * @Route("/review/post/{id}", name="review_post", requirements={"id" = "\d+"})
  77.      * @Template("@CustomerReview42/post.twig")
  78.      * @ParamConverter("Product", options={"repository_method" = "findWithSortedClassCategories"})
  79.      *
  80.      * @param Request $request
  81.      * @param Product $Product
  82.      *
  83.      * @return array
  84.      */
  85.     public function post(Request $requestProduct $Product)
  86.     {
  87.         $Customer $this->getUser();
  88.         $config $this->customerReviewConfigRepository->get();
  89.         if (!$this->checkVisibility($Product)) {
  90.             throw new NotFoundHttpException();
  91.         }
  92.         $review = new CustomerReviewList();
  93.         $review->setRecommendLevel(5);
  94.         if ( empty($request->get('reviewer_name')) )
  95.         {
  96.             if ( $Customer && 
  97.                     $reviewer_data $this->customerReviewNameRepository->get($Customer->getId()) )
  98.             {
  99.                 $reviewer_name $reviewer_data->getReviewerName();
  100.             } else {
  101.                 $reviewer_name $config->getDefaultReviewerName();
  102.             }
  103.             $review->setReviewerName($reviewer_name);
  104.         }
  105.         $form $this->createForm(ReviewPostType::class, $review);
  106.         $form->handleRequest($request);
  107.         if ($form->isSubmitted() && $form->isValid()) {
  108.             if (!$Customer && $config->isLoginOnly()) {
  109.                 return $this->redirectToRoute('homepage');
  110.             }
  111.             switch ($request->get('mode')) {
  112.                 case 'confirm':
  113.                     return $this->render('@CustomerReview42/confirm.twig', [
  114.                         'Product' => $Product,
  115.                         'form' => $form->createView(),
  116.                     ]);
  117.                 case 'complete':
  118.                     $review->setProduct($Product);
  119.                     if ( $Customer ) {
  120.                         $review->setCustomer($Customer);
  121.                     }
  122.                     $review->setStatus($this->customerReviewStatusRepository->find(CustomerReviewStatus::POST));
  123.                     $review->setPurchase($this->checkDelivered($Customer$Product));
  124.                     $this->entityManager->persist($review);
  125.                     $this->entityManager->flush($review);
  126.                     if ( $Customer ) {
  127.                         $reviewerName $this->customerReviewNameRepository->get($Customer->getId());
  128.                         if ( !$reviewerName ) {
  129.                             $reviewerName = new CustomerReviewName();
  130.                         }
  131.                         $reviewerName->setCustomer($Customer);
  132.                         $reviewerName->setReviewerName($review->getReviewerName());
  133.                         $this->entityManager->persist($reviewerName);
  134.                         $this->entityManager->flush($reviewerName);
  135.                     }
  136.                     return $this->redirect($this->generateUrl('review_complete', ['id' => $Product->getId()]));
  137.             }
  138.         }
  139.         // 既に投稿している場合には投稿完了画面へ
  140.         if ( $Customer )
  141.         {
  142.             $searchData = array(
  143.                 'product_id' => $Product->getId(),
  144.                 'customer_id' => $Customer->getId(),
  145.             );
  146.             $qb $this->customerReviewListRepository->getQueryBuilderBySearchDataForAdmin($searchData);
  147.             $res $qb
  148.                 ->getQuery()
  149.                 ->getResult();
  150.             if ( count($res) ) {
  151.                 return $this->redirect($this->generateUrl('review_posted', ['id' => $Product->getId()]));
  152.             }
  153.         }
  154.         return [
  155.             'Product' => $Product,
  156.             'form' => $form->createView(),
  157.             'review_config' => $config,
  158.         ];
  159.     }
  160.     /**
  161.      * @Route("review_confirm", name="review_confirm")
  162.      */
  163.     public function confirm(Request $request)
  164.     {
  165.         /**
  166.          * 管理ページのページ管理で編集させるためのダミー
  167.          * 基本遷移しないので、もし遷移したらTOPページへ
  168.          */
  169.         return $this->redirectToRoute('homepage');
  170.     }
  171.     /**
  172.      * レビュー完了画面.
  173.      *
  174.      * @Route("/review/complete/{id}", name="review_complete", methods={"GET"}, requirements={"id" = "\d+"})
  175.      * @Template("@CustomerReview42/complete.twig")
  176.      * @ParamConverter("Product", options={"repository_method" = "findWithSortedClassCategories"})
  177.      *
  178.      * @return array
  179.      */
  180.     public function complete(Product $Product)
  181.     {
  182.         return [
  183.             'Product' => $Product,
  184.         ];
  185.     }
  186.     /**
  187.      * レビュー投稿済み画面.
  188.      *
  189.      * @Route("/review/posted/{id}", name="review_posted", methods={"GET"}, requirements={"id" = "\d+"})
  190.      * @Template("@CustomerReview42/posted.twig")
  191.      * @ParamConverter("Product", options={"repository_method" = "findWithSortedClassCategories"})
  192.      *
  193.      * @return array
  194.      */
  195.     public function posted(Product $Product)
  196.     {
  197.         return [
  198.             'Product' => $Product,
  199.         ];
  200.     }
  201.     /**
  202.      * 購入済み商品のチェック
  203.      *
  204.      * @param Customer $Customer
  205.      * @param Product $Product
  206.      *
  207.      * @return boolean 購入済みの場合はtrue
  208.      */
  209.     private function checkDelivered($Customer$Product)
  210.     {
  211.         if ( !$Customer ) return false;
  212.         $qb $this->entityManager->createQueryBuilder()
  213.                 ->Select('count(o.id)')
  214.                 ->from('Eccube\\Entity\\Order''o')
  215.                 ->from('Eccube\\Entity\\OrderItem''oi')
  216.                 ->where'o.OrderStatus = :staus AND o.Customer = :customer AND o.id = oi.Order AND oi.Product = :product')
  217.                 ->setParameter('staus'OrderStatus::DELIVERED)
  218.                 ->setParameter('customer'$Customer->getId())
  219.                 ->setParameter('product'$Product->getId());
  220.         $count $qb
  221.             ->getQuery()
  222.             ->getSingleScalarResult();
  223.         return $count true false;
  224.     }
  225.     /**
  226.      * 閲覧可能な商品かどうかを判定
  227.      *
  228.      * @param Product $Product
  229.      *
  230.      * @return boolean 閲覧可能な場合はtrue
  231.      */
  232.     private function checkVisibility(Product $Product)
  233.     {
  234.         $is_admin $this->session->has('_security_admin');
  235.         // 管理ユーザの場合はステータスやオプションにかかわらず閲覧可能.
  236.         if (!$is_admin) {
  237.             // 在庫なし商品の非表示オプションが有効な場合.
  238.             if ($this->BaseInfo->isOptionNostockHidden()) {
  239.                 if (!$Product->getStockFind()) {
  240.                     return false;
  241.                 }
  242.             }
  243.             // 公開ステータスでない商品は表示しない.
  244.             if ($Product->getStatus()->getId() !== ProductStatus::DISPLAY_SHOW) {
  245.                 return false;
  246.             }
  247.         }
  248.         return true;
  249.     }
  250. }