src/Eccube/Controller/SitemapController.php line 87

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 Eccube\Controller;
  13. use Eccube\Entity\BaseInfo;
  14. use Eccube\Entity\Page;
  15. use Eccube\Repository\BaseInfoRepository;
  16. use Eccube\Repository\CategoryRepository;
  17. use Eccube\Repository\Master\ProductListOrderByRepository;
  18. use Eccube\Repository\PageRepository;
  19. use Eccube\Repository\ProductRepository;
  20. use Knp\Bundle\PaginatorBundle\Pagination\SlidingPagination;
  21. use Knp\Component\Pager\PaginatorInterface;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. use Symfony\Component\Routing\RouterInterface;
  27. class SitemapController extends AbstractController
  28. {
  29. /**
  30. * @var CategoryRepository
  31. */
  32. private $categoryRepository;
  33. /**
  34. * @var PageRepository
  35. */
  36. private $pageRepository;
  37. /**
  38. * @var ProductListOrderByRepository
  39. */
  40. private $productListOrderByRepository;
  41. /**
  42. * @var ProductRepository
  43. */
  44. private $productRepository;
  45. /**
  46. * @var RouterInterface
  47. */
  48. private $router;
  49. /**
  50. * @var BaseInfo
  51. */
  52. protected $BaseInfo;
  53. /**
  54. * SitemapController constructor.
  55. */
  56. public function __construct(
  57. CategoryRepository $categoryRepository,
  58. PageRepository $pageRepository,
  59. ProductListOrderByRepository $productListOrderByRepository,
  60. ProductRepository $productRepository,
  61. RouterInterface $router,
  62. BaseInfoRepository $baseInfoRepository
  63. ) {
  64. $this->categoryRepository = $categoryRepository;
  65. $this->pageRepository = $pageRepository;
  66. $this->productListOrderByRepository = $productListOrderByRepository;
  67. $this->productRepository = $productRepository;
  68. $this->router = $router;
  69. $this->BaseInfo = $baseInfoRepository->get();
  70. }
  71. /**
  72. * Output sitemap index
  73. *
  74. * @Route("/sitemap.xml", name="sitemap_xml", methods={"GET"})
  75. */
  76. public function index(PaginatorInterface $paginator)
  77. {
  78. $pageQueryBuilder = $this->pageRepository->createQueryBuilder('p');
  79. $Page = $pageQueryBuilder->select('p')
  80. ->where("((p.meta_robots not like '%noindex%' and p.meta_robots not like '%none%') or p.meta_robots IS NULL)")
  81. ->andWhere('p.id <> 0')
  82. ->andWhere('p.MasterPage is null')
  83. ->orderBy('p.update_date', 'DESC')
  84. ->setMaxResults(1)
  85. ->getQuery()
  86. ->getSingleResult();
  87. $Product = $this->productRepository->findOneBy(['Status' => 1], ['update_date' => 'DESC']);
  88. // フロントの商品一覧の条件で商品情報を取得
  89. $ProductListOrder = $this->productListOrderByRepository->find($this->eccubeConfig['eccube_product_order_newer']);
  90. $productQueryBuilder = $this->productRepository->getQueryBuilderBySearchData(['orderby' => $ProductListOrder]);
  91. /** @var SlidingPagination $pagination */
  92. $pagination = $paginator->paginate(
  93. $productQueryBuilder,
  94. 1,
  95. $this->eccubeConfig['eccube_sitemap_products_per_page']
  96. );
  97. $paginationData = $pagination->getPaginationData();
  98. $Category = $this->categoryRepository->findOneBy([], ['update_date' => 'DESC']);
  99. return $this->outputXml(
  100. [
  101. 'Category' => $Category,
  102. 'Product' => $Product,
  103. 'productPageCount' => $paginationData['pageCount'],
  104. 'Page' => $Page,
  105. ],
  106. 'sitemap_index.xml.twig'
  107. );
  108. }
  109. /**
  110. * Output sitemap of product categories
  111. *
  112. * @Route("/sitemap_category.xml", name="sitemap_category_xml", methods={"GET"})
  113. */
  114. public function category()
  115. {
  116. $Categories = $this->categoryRepository->getList(null, true);
  117. return $this->outputXml(['Categories' => $Categories]);
  118. }
  119. /**
  120. * Output sitemap of products
  121. *
  122. * Output sitemap of products as status is 1
  123. *
  124. * @Route("/sitemap_product_{page}.xml", name="sitemap_product_xml", requirements={"page" = "\d+"}, methods={"GET"})
  125. *
  126. * @return Response
  127. */
  128. public function product(Request $request, PaginatorInterface $paginator)
  129. {
  130. // Doctrine SQLFilter
  131. if ($this->BaseInfo->isOptionNostockHidden()) {
  132. $this->entityManager->getFilters()->enable('option_nostock_hidden');
  133. }
  134. // フロントの商品一覧の条件で商品情報を取得
  135. $ProductListOrder = $this->productListOrderByRepository->find($this->eccubeConfig['eccube_product_order_newer']);
  136. $productQueryBuilder = $this->productRepository->getQueryBuilderBySearchData(['orderby' => $ProductListOrder]);
  137. /** @var SlidingPagination $pagination */
  138. $pagination = $paginator->paginate(
  139. $productQueryBuilder,
  140. $request->get('page'),
  141. $this->eccubeConfig['eccube_sitemap_products_per_page']
  142. );
  143. $paginationData = $pagination->getPaginationData();
  144. if ($paginationData['currentItemCount'] === 0) {
  145. throw new NotFoundHttpException();
  146. }
  147. return $this->outputXml(['Products' => $pagination]);
  148. }
  149. /**
  150. * Output sitemap of pages
  151. *
  152. * Output sitemap of pages without 'noindex' in meta robots.
  153. *
  154. * @Route("/sitemap_page.xml", name="sitemap_page_xml", methods={"GET"})
  155. */
  156. public function page()
  157. {
  158. $Pages = $this->pageRepository->getPageList("((p.meta_robots not like '%noindex%' and p.meta_robots not like '%none%') or p.meta_robots IS NULL)");
  159. // URL に変数が含まれる場合は URL の生成ができないためここで除外する
  160. $DefaultPages = array_filter($Pages, function (Page $Page) {
  161. // 管理画面から作成されたページは除外
  162. if ($Page->getEditType() === Page::EDIT_TYPE_USER) {
  163. return false;
  164. }
  165. $route = $this->router->getRouteCollection()->get($Page->getUrl());
  166. if (is_null($route)) {
  167. return false;
  168. }
  169. return count($route->compile()->getPathVariables()) < 1;
  170. });
  171. // 管理画面から作成されたページ
  172. $UserPages = array_filter($Pages, function (Page $Page) {
  173. return $Page->getEditType() === Page::EDIT_TYPE_USER;
  174. });
  175. return $this->outputXml([
  176. 'DefaultPages' => $DefaultPages,
  177. 'UserPages' => $UserPages,
  178. ]);
  179. }
  180. /**
  181. * Output XML response by data.
  182. *
  183. * @param array $data
  184. * @param string $template_name
  185. *
  186. * @return Response
  187. */
  188. private function outputXml(array $data, $template_name = 'sitemap.xml.twig')
  189. {
  190. $response = new Response();
  191. $response->headers->set('Content-Type', 'application/xml'); // Content-Typeを設定
  192. return $this->render(
  193. $template_name,
  194. $data,
  195. $response
  196. );
  197. }
  198. }