app/Plugin/ProductReview42/Controller/Admin/ProductReviewController.php line 178

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.ec-cube.co.jp/
  8.  *
  9.  * For the full copyright and license information, please view the LICENSE
  10.  * file that was distributed with this source code.
  11.  */
  12. namespace Plugin\ProductReview42\Controller\Admin;
  13. use Eccube\Controller\AbstractController;
  14. use Eccube\Repository\Master\PageMaxRepository;
  15. use Eccube\Service\CsvExportService;
  16. use Eccube\Util\FormUtil;
  17. use Knp\Component\Pager\PaginatorInterface;
  18. use Plugin\ProductReview42\Entity\ProductReview;
  19. use Plugin\ProductReview42\Entity\ProductReviewConfig;
  20. use Plugin\ProductReview42\Form\Type\Admin\ProductReviewSearchType;
  21. use Plugin\ProductReview42\Form\Type\Admin\ProductReviewType;
  22. use Plugin\ProductReview42\Repository\ProductReviewConfigRepository;
  23. use Plugin\ProductReview42\Repository\ProductReviewRepository;
  24. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  25. use Symfony\Component\HttpFoundation\RedirectResponse;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\HttpFoundation\StreamedResponse;
  28. use Symfony\Component\Routing\Annotation\Route;
  29. /**
  30.  * Class ProductReviewController admin.
  31.  */
  32. class ProductReviewController extends AbstractController
  33. {
  34.     /**
  35.      * @var PageMaxRepository
  36.      */
  37.     protected $pageMaxRepository;
  38.     /**
  39.      * @var ProductReviewRepository
  40.      */
  41.     protected $productReviewRepository;
  42.     /**
  43.      * @var ProductReviewConfigRepository
  44.      */
  45.     protected $productReviewConfigRepository;
  46.     /** @var CsvExportService */
  47.     protected $csvExportService;
  48.     /**
  49.      * ProductReviewController constructor.
  50.      *
  51.      * @param PageMaxRepository $pageMaxRepository
  52.      * @param ProductReviewRepository $productReviewRepository
  53.      * @param ProductReviewConfigRepository $productReviewConfigRepository
  54.      * @param CsvExportService $csvExportService
  55.      */
  56.     public function __construct(
  57.         PageMaxRepository $pageMaxRepository,
  58.         ProductReviewRepository $productReviewRepository,
  59.         ProductReviewConfigRepository $productReviewConfigRepository,
  60.         CsvExportService $csvExportService
  61.     ) {
  62.         $this->pageMaxRepository $pageMaxRepository;
  63.         $this->productReviewRepository $productReviewRepository;
  64.         $this->productReviewConfigRepository $productReviewConfigRepository;
  65.         $this->csvExportService $csvExportService;
  66.     }
  67.     /**
  68.      * Search function.
  69.      *
  70.      * @Route("/%eccube_admin_route%/product_review/", name="product_review_admin_product_review")
  71.      * @Route("/%eccube_admin_route%/product_review/page/{page_no}", requirements={"page_no" = "\d+"}, name="product_review_admin_product_review_page")
  72.      * @Template("@ProductReview42/admin/index.twig")
  73.      *
  74.      * @param Request $request
  75.      * @param null $page_no
  76.      *
  77.      * @return array
  78.      */
  79.     public function index(Request $requestPaginatorInterface $paginator$page_no null)
  80.     {
  81.         $CsvType $this->productReviewConfigRepository
  82.             ->get()
  83.             ->getCsvType();
  84.         $builder $this->formFactory->createBuilder(ProductReviewSearchType::class);
  85.         $searchForm $builder->getForm();
  86.         $pageMaxis $this->pageMaxRepository->findAll();
  87.         $pageCount $this->session->get(
  88.             'product_review.admin.product_review.search.page_count',
  89.             $this->eccubeConfig['eccube_default_page_count']
  90.         );
  91.         $pageCountParam $request->get('page_count');
  92.         if ($pageCountParam && is_numeric($pageCountParam)) {
  93.             foreach ($pageMaxis as $pageMax) {
  94.                 if ($pageCountParam == $pageMax->getName()) {
  95.                     $pageCount $pageMax->getName();
  96.                     $this->session->set('product_review.admin.product_review.search.page_count'$pageCount);
  97.                     break;
  98.                 }
  99.             }
  100.         }
  101.         if ('POST' === $request->getMethod()) {
  102.             $searchForm->handleRequest($request);
  103.             if ($searchForm->isValid()) {
  104.                 $searchData $searchForm->getData();
  105.                 $page_no 1;
  106.                 $this->session->set('product_review.admin.product_review.search'FormUtil::getViewData($searchForm));
  107.                 $this->session->set('product_review.admin.product_review.search.page_no'$page_no);
  108.             } else {
  109.                 return [
  110.                     'searchForm' => $searchForm->createView(),
  111.                     'pagination' => [],
  112.                     'pageMaxis' => $pageMaxis,
  113.                     'page_no' => $page_no,
  114.                     'page_count' => $pageCount,
  115.                     'CsvType' => $CsvType,
  116.                     'has_errors' => true,
  117.                 ];
  118.             }
  119.         } else {
  120.             if (null !== $page_no || $request->get('resume')) {
  121.                 if ($page_no) {
  122.                     $this->session->set('product_review.admin.product_review.search.page_no', (int) $page_no);
  123.                 } else {
  124.                     $page_no $this->session->get('product_review.admin.product_review.search.page_no'1);
  125.                 }
  126.                 $viewData $this->session->get('product_review.admin.product_review.search', []);
  127.             } else {
  128.                 $page_no 1;
  129.                 $viewData FormUtil::getViewData($searchForm);
  130.                 $this->session->set('product_review.admin.product_review.search'$viewData);
  131.                 $this->session->set('product_review.admin.product_review.search.page_no'$page_no);
  132.             }
  133.             $searchData FormUtil::submitAndGetData($searchForm$viewData);
  134.         }
  135.         $qb $this->productReviewRepository->getQueryBuilderBySearchData($searchData);
  136.         $pagination $paginator->paginate(
  137.             $qb,
  138.             $page_no,
  139.             $pageCount
  140.         );
  141.         return [
  142.             'searchForm' => $searchForm->createView(),
  143.             'pagination' => $pagination,
  144.             'pageMaxis' => $pageMaxis,
  145.             'page_no' => $page_no,
  146.             'page_count' => $pageCount,
  147.             'CsvType' => $CsvType,
  148.             'has_errors' => false,
  149.         ];
  150.     }
  151.     /**
  152.      * 編集.
  153.      *
  154.      * @Route("%eccube_admin_route%/product_review/{id}/edit", name="product_review_admin_product_review_edit")
  155.      * @Template("@ProductReview42/admin/edit.twig")
  156.      *
  157.      * @param Request $request
  158.      * @param $id
  159.      *
  160.      * @return array|RedirectResponse
  161.      */
  162.     public function edit(Request $requestProductReview $ProductReview)
  163.     {
  164.         $Product $ProductReview->getProduct();
  165.         if (!$Product) {
  166.             $this->addError('product_review.admin.product.not_found''admin');
  167.             return $this->redirectToRoute('product_review_admin_product_review', ['resume' => 1]);
  168.         }
  169.         $form $this->createForm(ProductReviewType::class, $ProductReview);
  170.         $form->handleRequest($request);
  171.         if ($form->isSubmitted() && $form->isValid()) {
  172.             $ProductReview $form->getData();
  173.             $this->entityManager->persist($ProductReview);
  174.             $this->entityManager->flush($ProductReview);
  175.             log_info('Product review edit');
  176.             $this->addSuccess('product_review.admin.save.complete''admin');
  177.             return $this->redirectToRoute(
  178.                 'product_review_admin_product_review_edit',
  179.                 ['id' => $ProductReview->getId()]
  180.             );
  181.         }
  182.         return [
  183.             'form' => $form->createView(),
  184.             'Product' => $Product,
  185.             'ProductReview' => $ProductReview,
  186.         ];
  187.     }
  188.     /**
  189.      * Product review delete function.
  190.      *
  191.      * @Route("%eccube_admin_route%/product_review/{id}/delete", name="product_review_admin_product_review_delete", methods={"DELETE"})
  192.      *
  193.      * @param Request $request
  194.      * @param int $id
  195.      *
  196.      * @return RedirectResponse
  197.      */
  198.     public function delete(ProductReview $ProductReview)
  199.     {
  200.         $this->isTokenValid();
  201.         $this->entityManager->remove($ProductReview);
  202.         $this->entityManager->flush($ProductReview);
  203.         $this->addSuccess('product_review.admin.delete.complete''admin');
  204.         log_info('Product review delete', ['id' => $ProductReview->getId()]);
  205.         return $this->redirect($this->generateUrl('product_review_admin_product_review_page', ['resume' => 1]));
  206.     }
  207.     /**
  208.      * 商品レビューCSVの出力.
  209.      *
  210.      * @Route("%eccube_admin_route%/product_review/download", name="product_review_admin_product_review_download")
  211.      *
  212.      * @param Request $request
  213.      *
  214.      * @return StreamedResponse
  215.      */
  216.     public function download(Request $request)
  217.     {
  218.         // タイムアウトを無効にする.
  219.         set_time_limit(0);
  220.         // sql loggerを無効にする.
  221.         $em $this->entityManager;
  222.         $em->getConfiguration()->setSQLLogger(null);
  223.         $response = new StreamedResponse();
  224.         $response->setCallback(function () use ($request) {
  225.             /** @var ProductReviewConfig $Config */
  226.             $Config $this->productReviewConfigRepository->get();
  227.             $csvType $Config->getCsvType();
  228.             /* @var $csvService CsvExportService */
  229.             $csvService $this->csvExportService;
  230.             /* @var $repo ProductReviewRepository */
  231.             $repo $this->productReviewRepository;
  232.             // CSV種別を元に初期化.
  233.             $csvService->initCsvType($csvType);
  234.             // ヘッダ行の出力.
  235.             $csvService->exportHeader();
  236.             $session $request->getSession();
  237.             $searchForm $this->createForm(ProductReviewSearchType::class);
  238.             $viewData $session->get('eccube.admin.product.search', []);
  239.             $searchData FormUtil::submitAndGetData($searchForm$viewData);
  240.             $qb $repo->getQueryBuilderBySearchData($searchData);
  241.             // データ行の出力.
  242.             $csvService->setExportQueryBuilder($qb);
  243.             $csvService->exportData(function ($entityCsvExportService $csvService) {
  244.                 $arrCsv $csvService->getCsvs();
  245.                 $row = [];
  246.                 // CSV出力項目と合致するデータを取得.
  247.                 foreach ($arrCsv as $csv) {
  248.                     // 受注データを検索.
  249.                     $data $csvService->getData($csv$entity);
  250.                     $row[] = $data;
  251.                 }
  252.                 // 出力.
  253.                 $csvService->fputcsv($row);
  254.             });
  255.         });
  256.         $now = new \DateTime();
  257.         $filename 'product_review_'.$now->format('YmdHis').'.csv';
  258.         $response->headers->set('Content-Type''application/octet-stream');
  259.         $response->headers->set('Content-Disposition''attachment; filename='.$filename);
  260.         log_info('商品レビューCSV出力ファイル名', [$filename]);
  261.         return $response;
  262.     }
  263. }