app/Customize/Controller/NewsController.php line 127

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 Customize\Controller;
  13. use Eccube\Controller\AbstractController;
  14. use Eccube\Entity\Layout;
  15. use Eccube\Repository\LayoutRepository;
  16. use Eccube\Repository\NewsRepository;
  17. use Knp\Component\Pager\PaginatorInterface;
  18. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  19. use Symfony\Component\HttpFoundation\JsonResponse;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  23. use Symfony\Component\Routing\Annotation\Route;
  24. class NewsController extends AbstractController
  25. {
  26.     /**
  27.      * @var NewsRepository
  28.      */
  29.     protected $newsRepository;
  30.     /**
  31.      * @var LayoutRepository
  32.      */
  33.     protected $layoutRepository;
  34.     /**
  35.      * NewsController constructor.
  36.      *
  37.      * @param NewsRepository $newsRepository
  38.      * @param LayoutRepository $layoutRepository
  39.      */
  40.     public function __construct(NewsRepository $newsRepositoryLayoutRepository $layoutRepository)
  41.     {
  42.         $this->newsRepository $newsRepository;
  43.         $this->layoutRepository $layoutRepository;
  44.     }
  45.     /**
  46.      * 公開中のお知らせ有無を返す API(mypage 用)
  47.      *
  48.      * @Route("/api/news", name="api_news", methods={"GET", "OPTIONS"})
  49.      */
  50.     public function apiList(Request $request): Response
  51.     {
  52.         if ($request->getMethod() === 'OPTIONS') {
  53.             $response = new Response(''Response::HTTP_NO_CONTENT);
  54.             $this->applyCorsHeaders($response);
  55.             return $response;
  56.         }
  57.         $news $this->newsRepository->getList();
  58.         $count count($news);
  59.         $response = new JsonResponse([
  60.             'hasNews' => $count 0,
  61.             'count' => $count,
  62.         ]);
  63.         $this->applyCorsHeaders($response);
  64.         return $response;
  65.     }
  66.     /**
  67.      * お知らせ一覧画面
  68.      *
  69.      * @Route("/news", name="news_list", methods={"GET"})
  70.      * @Route("/news/page/{pageno}", requirements={"pageno" = "\d+"}, name="news_list_page", methods={"GET"})
  71.      * @Template("News/index.twig")
  72.      *
  73.      * @param Request $request
  74.      * @param PaginatorInterface $paginator
  75.      * @param int $pageno
  76.      *
  77.      * @return array
  78.      */
  79.     public function index(Request $requestPaginatorInterface $paginator$pageno 1)
  80.     {
  81.         // Load default layout for underlayer pages (ID = 2)
  82.         $Layout $this->layoutRepository->get(Layout::DEFAULT_LAYOUT_UNDERLAYER_PAGE);
  83.         $qb $this->newsRepository->getQueryBuilderAll();
  84.         // 公開されているお知らせのみ取得
  85.         $qb->andWhere('n.visible = :visible')
  86.            ->setParameter('visible'true)
  87.            ->andWhere('n.publish_date <= :now')
  88.            ->setParameter('now', new \DateTime());
  89.         $pagination $paginator->paginate(
  90.             $qb,
  91.             $pageno,
  92.             10 // 1ページあたり10件
  93.         );
  94.         return [
  95.             'Layout' => $Layout,
  96.             'pagination' => $pagination,
  97.         ];
  98.     }
  99.     /**
  100.      * お知らせ詳細画面
  101.      *
  102.      * @Route("/news/{id}", name="news_detail", requirements={"id" = "\d+"}, methods={"GET"})
  103.      * @Template("News/detail.twig")
  104.      *
  105.      * @param Request $request
  106.      * @param int $id
  107.      *
  108.      * @return array
  109.      */
  110.     public function detail(Request $request$id)
  111.     {
  112.         // Load default layout for underlayer pages (ID = 2)
  113.         $Layout $this->layoutRepository->get(Layout::DEFAULT_LAYOUT_UNDERLAYER_PAGE);
  114.         $News $this->newsRepository->find($id);
  115.         if (!$News || !$News->isVisible()) {
  116.             throw new NotFoundHttpException();
  117.         }
  118.         // 公開日時をチェック
  119.         $now = new \DateTime();
  120.         if ($News->getPublishDate() > $now) {
  121.             throw new NotFoundHttpException();
  122.         }
  123.         return [
  124.             'Layout' => $Layout,
  125.             'News' => $News,
  126.         ];
  127.     }
  128.     private function applyCorsHeaders(Response $response): void
  129.     {
  130.         $response->headers->set('Access-Control-Allow-Origin''*');
  131.         $response->headers->set('Access-Control-Allow-Methods''GET, OPTIONS');
  132.         $response->headers->set('Access-Control-Allow-Headers''Content-Type');
  133.     }
  134. }