src/Eccube/Controller/Admin/Content/PageController.php line 71

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\Admin\Content;
  13. use Eccube\Controller\AbstractController;
  14. use Eccube\Entity\Page;
  15. use Eccube\Entity\PageLayout;
  16. use Eccube\Event\EccubeEvents;
  17. use Eccube\Event\EventArgs;
  18. use Eccube\Form\Type\Admin\MainEditType;
  19. use Eccube\Repository\Master\DeviceTypeRepository;
  20. use Eccube\Repository\PageLayoutRepository;
  21. use Eccube\Repository\PageRepository;
  22. use Eccube\Util\CacheUtil;
  23. use Eccube\Util\StringUtil;
  24. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  25. use Symfony\Component\Filesystem\Filesystem;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\Routing\Annotation\Route;
  28. use Symfony\Component\Routing\RouterInterface;
  29. use Twig\Environment;
  30. class PageController extends AbstractController
  31. {
  32.     /**
  33.      * @var PageRepository
  34.      */
  35.     protected $pageRepository;
  36.     /**
  37.      * @var PageLayoutRepository
  38.      */
  39.     protected $pageLayoutRepository;
  40.     /**
  41.      * @var DeviceTypeRepository
  42.      */
  43.     protected $deviceTypeRepository;
  44.     /**
  45.      * PageController constructor.
  46.      *
  47.      * @param PageRepository $pageRepository
  48.      * @param DeviceTypeRepository $deviceTypeRepository
  49.      */
  50.     public function __construct(
  51.         PageRepository $pageRepository,
  52.         PageLayoutRepository $pageLayoutRepository,
  53.         DeviceTypeRepository $deviceTypeRepository
  54.     ) {
  55.         $this->pageRepository $pageRepository;
  56.         $this->pageLayoutRepository $pageLayoutRepository;
  57.         $this->deviceTypeRepository $deviceTypeRepository;
  58.     }
  59.     /**
  60.      * @Route("/%eccube_admin_route%/content/page", name="admin_content_page")
  61.      * @Template("@admin/Content/page.twig")
  62.      */
  63.     public function index(Request $request)
  64.     {
  65.         $Pages $this->pageRepository->getPageList();
  66.         $event = new EventArgs(
  67.             [
  68.                 'Pages' => $Pages,
  69.             ],
  70.             $request
  71.         );
  72.         $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_CONTENT_PAGE_INDEX_COMPLETE$event);
  73.         return [
  74.             'Pages' => $Pages,
  75.         ];
  76.     }
  77.     /**
  78.      * @Route("/%eccube_admin_route%/content/page/new", name="admin_content_page_new")
  79.      * @Route("/%eccube_admin_route%/content/page/{id}/edit", requirements={"id" = "\d+"}, name="admin_content_page_edit")
  80.      * @Template("@admin/Content/page_edit.twig")
  81.      */
  82.     public function edit(Request $request$id nullEnvironment $twigRouterInterface $routerCacheUtil $cacheUtil)
  83.     {
  84.         if (null === $id) {
  85.             $Page $this->pageRepository->newPage();
  86.         } else {
  87.             $Page $this->pageRepository->find($id);
  88.         }
  89.         $isUserDataPage true;
  90.         $builder $this->formFactory
  91.             ->createBuilder(MainEditType::class, $Page);
  92.         $event = new EventArgs(
  93.             [
  94.                 'builder' => $builder,
  95.                 'Page' => $Page,
  96.             ],
  97.             $request
  98.         );
  99.         $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_CONTENT_PAGE_EDIT_INITIALIZE$event);
  100.         $form $builder->getForm();
  101.         // 更新時
  102.         $fileName null;
  103.         $namespace '@user_data/';
  104.         if ($id) {
  105.             // 編集不可ページはURL、ページ名、ファイル名を保持
  106.             if ($Page->getEditType() == Page::EDIT_TYPE_DEFAULT) {
  107.                 $isUserDataPage false;
  108.                 $namespace '';
  109.                 $PrevPage = clone $Page;
  110.             }
  111.             // テンプレートファイルの取得
  112.             $source $twig->getLoader()
  113.                 ->getSourceContext($namespace.$Page->getFileName().'.twig')
  114.                 ->getCode();
  115.             $form->get('tpl_data')->setData($source);
  116.             $fileName $Page->getFileName();
  117.         } elseif ($request->getMethod() === 'GET' && !$form->isSubmitted()) {
  118.             $source $twig->getLoader()
  119.                 ->getSourceContext('@admin/empty_page.twig')
  120.                 ->getCode();
  121.             $form->get('tpl_data')->setData($source);
  122.         }
  123.         $form->handleRequest($request);
  124.         if ($form->isSubmitted() && $form->isValid()) {
  125.             $Page $form->getData();
  126.             if (!$isUserDataPage) {
  127.                 $Page
  128.                     ->setUrl($PrevPage->getUrl())
  129.                     ->setFileName($PrevPage->getFileName())
  130.                     ->setName($Page->getName());
  131.             }
  132.             // DB登録
  133.             $this->entityManager->persist($Page);
  134.             $this->entityManager->flush();
  135.             // ファイル生成・更新
  136.             if ($isUserDataPage) {
  137.                 $templatePath $this->getParameter('eccube_theme_user_data_dir');
  138.             } else {
  139.                 $templatePath $this->getParameter('eccube_theme_front_dir');
  140.             }
  141.             $filePath $templatePath.'/'.$Page->getFileName().'.twig';
  142.             $fs = new Filesystem();
  143.             $pageData $form->get('tpl_data')->getData();
  144.             $pageData StringUtil::convertLineFeed($pageData);
  145.             $fs->dumpFile($filePath$pageData);
  146.             // 更新でファイル名を変更した場合、以前のファイルを削除
  147.             if ($Page->getFileName() != $fileName && !is_null($fileName)) {
  148.                 $oldFilePath $templatePath.'/'.$fileName.'.twig';
  149.                 if ($fs->exists($oldFilePath)) {
  150.                     $fs->remove($oldFilePath);
  151.                 }
  152.             }
  153.             foreach ($Page->getPageLayouts() as $PageLayout) {
  154.                 $Page->removePageLayout($PageLayout);
  155.                 $this->entityManager->remove($PageLayout);
  156.                 $this->entityManager->flush($PageLayout);
  157.             }
  158.             $Layout $form['PcLayout']->getData();
  159.             $LastPageLayout $this->pageLayoutRepository->findOneBy([], ['sort_no' => 'DESC']);
  160.             $sortNo $LastPageLayout->getSortNo();
  161.             if ($Layout) {
  162.                 $PageLayout = new PageLayout();
  163.                 $PageLayout->setLayoutId($Layout->getId());
  164.                 $PageLayout->setLayout($Layout);
  165.                 $PageLayout->setPageId($Page->getId());
  166.                 $PageLayout->setSortNo($sortNo++);
  167.                 $PageLayout->setPage($Page);
  168.                 $this->entityManager->persist($PageLayout);
  169.                 $this->entityManager->flush($PageLayout);
  170.             }
  171.             $Layout $form['SpLayout']->getData();
  172.             if ($Layout) {
  173.                 $PageLayout = new PageLayout();
  174.                 $PageLayout->setLayoutId($Layout->getId());
  175.                 $PageLayout->setLayout($Layout);
  176.                 $PageLayout->setPageId($Page->getId());
  177.                 $PageLayout->setSortNo($sortNo++);
  178.                 $PageLayout->setPage($Page);
  179.                 $this->entityManager->persist($PageLayout);
  180.                 $this->entityManager->flush($PageLayout);
  181.             }
  182.             $event = new EventArgs(
  183.                 [
  184.                     'form' => $form,
  185.                     'Page' => $Page,
  186.                     'templatePath' => $templatePath,
  187.                     'filePath' => $filePath,
  188.                 ],
  189.                 $request
  190.             );
  191.             $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_CONTENT_PAGE_EDIT_COMPLETE$event);
  192.             $this->addSuccess('admin.common.save_complete''admin');
  193.             // キャッシュの削除
  194.             $cacheUtil->clearTwigCache();
  195.             $cacheUtil->clearDoctrineCache();
  196.             return $this->redirectToRoute('admin_content_page_edit', ['id' => $Page->getId()]);
  197.         }
  198.         if ($isUserDataPage) {
  199.             $templatePath $this->getParameter('eccube_theme_user_data_dir');
  200.             $url '';
  201.         } else {
  202.             $templatePath $this->getParameter('eccube_theme_front_dir');
  203.             $url $router->getRouteCollection()->get($PrevPage->getUrl())->getPath();
  204.         }
  205.         $projectDir $this->getParameter('kernel.project_dir');
  206.         $templatePath str_replace($projectDir.'/'''$templatePath);
  207.         return [
  208.             'form' => $form->createView(),
  209.             'page_id' => $Page->getId(),
  210.             'is_user_data_page' => $isUserDataPage,
  211.             'template_path' => $templatePath,
  212.             'url' => $url,
  213.         ];
  214.     }
  215.     /**
  216.      * @Route("/%eccube_admin_route%/content/page/{id}/delete", requirements={"id" = "\d+"}, name="admin_content_page_delete", methods={"DELETE"})
  217.      */
  218.     public function delete(Request $request$id nullCacheUtil $cacheUtil)
  219.     {
  220.         $this->isTokenValid();
  221.         $Page $this->pageRepository
  222.             ->findOneBy([
  223.                 'id' => $id,
  224.             ]);
  225.         if (!$Page) {
  226.             $this->deleteMessage();
  227.             return $this->redirectToRoute('admin_content_page');
  228.         }
  229.         // ユーザーが作ったページのみ削除する
  230.         if ($Page->getEditType() == Page::EDIT_TYPE_USER) {
  231.             $templatePath $this->getParameter('eccube_theme_user_data_dir');
  232.             $file $templatePath.'/'.$Page->getFileName().'.twig';
  233.             $fs = new Filesystem();
  234.             if ($fs->exists($file)) {
  235.                 $fs->remove($file);
  236.             }
  237.             $this->entityManager->remove($Page);
  238.             $this->entityManager->flush();
  239.             $event = new EventArgs(
  240.                 [
  241.                     'Page' => $Page,
  242.                 ],
  243.                 $request
  244.             );
  245.             $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_CONTENT_PAGE_DELETE_COMPLETE$event);
  246.             $this->addSuccess('admin.common.delete_complete''admin');
  247.             // キャッシュの削除
  248.             $cacheUtil->clearTwigCache();
  249.             $cacheUtil->clearDoctrineCache();
  250.         }
  251.         return $this->redirectToRoute('admin_content_page');
  252.     }
  253. }