src/Eccube/Form/Type/Admin/MainEditType.php line 177

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\Form\Type\Admin;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Doctrine\ORM\EntityRepository;
  15. use Eccube\Common\EccubeConfig;
  16. use Eccube\Entity\Layout;
  17. use Eccube\Entity\Master\DeviceType;
  18. use Eccube\Entity\Page;
  19. use Eccube\Form\Validator\TwigLint;
  20. use Eccube\Repository\Master\DeviceTypeRepository;
  21. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  22. use Symfony\Component\Form\AbstractType;
  23. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  24. use Symfony\Component\Form\Extension\Core\Type\TextType;
  25. use Symfony\Component\Form\FormBuilderInterface;
  26. use Symfony\Component\Form\FormError;
  27. use Symfony\Component\Form\FormEvent;
  28. use Symfony\Component\Form\FormEvents;
  29. use Symfony\Component\OptionsResolver\OptionsResolver;
  30. use Symfony\Component\Validator\Constraints as Assert;
  31. class MainEditType extends AbstractType
  32. {
  33.     /**
  34.      * @var EntityManagerInterface
  35.      */
  36.     protected $entityManager;
  37.     /**
  38.      * @var DeviceTypeRepository
  39.      */
  40.     protected $deviceTypeRepository;
  41.     /**
  42.      * @var EccubeConfig
  43.      */
  44.     protected $eccubeConfig;
  45.     /**
  46.      * MainEditType constructor.
  47.      *
  48.      * @param EntityManagerInterface $entityManager
  49.      * @param DeviceTypeRepository $deviceTypeRepository
  50.      * @param EccubeConfig $eccubeConfig
  51.      */
  52.     public function __construct(
  53.         EntityManagerInterface $entityManager,
  54.         DeviceTypeRepository $deviceTypeRepository,
  55.         EccubeConfig $eccubeConfig
  56.     ) {
  57.         $this->entityManager $entityManager;
  58.         $this->deviceTypeRepository $deviceTypeRepository;
  59.         $this->eccubeConfig $eccubeConfig;
  60.     }
  61.     /**
  62.      * {@inheritdoc}
  63.      */
  64.     public function buildForm(FormBuilderInterface $builder, array $options)
  65.     {
  66.         $builder
  67.             ->add('name'TextType::class, [
  68.                 'required' => true,
  69.                 'constraints' => [
  70.                     new Assert\NotBlank(),
  71.                     new Assert\Length([
  72.                         'max' => $this->eccubeConfig['eccube_stext_len'],
  73.                     ]),
  74.                 ],
  75.             ])
  76.             ->add('url'TextType::class, [
  77.                 'required' => true,
  78.                 'constraints' => [
  79.                     new Assert\NotBlank(),
  80.                     new Assert\Length([
  81.                         'max' => $this->eccubeConfig['eccube_stext_len'],
  82.                     ]),
  83.                     new Assert\Regex([
  84.                         'pattern' => '/^([0-9a-zA-Z_\-]+\/?)+(?<!\/)$/',
  85.                     ]),
  86.                 ],
  87.             ])
  88.             ->add('file_name'TextType::class, [
  89.                 'required' => true,
  90.                 'constraints' => [
  91.                     new Assert\NotBlank(),
  92.                     new Assert\Length([
  93.                         'max' => $this->eccubeConfig['eccube_stext_len'],
  94.                     ]),
  95.                     new Assert\Regex([
  96.                         'pattern' => '/^([0-9a-zA-Z_\-]+\/?)+$/',
  97.                     ]),
  98.                 ],
  99.             ])
  100.             ->add('tpl_data'TextareaType::class, [
  101.                 'label' => false,
  102.                 'mapped' => false,
  103.                 'required' => false,
  104.                 'constraints' => [
  105.                     new Assert\NotBlank(),
  106.                     new TwigLint(),
  107.                 ],
  108.             ])
  109.             ->add('author'TextType::class, [
  110.                 'required' => false,
  111.                 'constraints' => [
  112.                     new Assert\Length([
  113.                         'max' => $this->eccubeConfig['eccube_stext_len'],
  114.                     ]),
  115.                 ],
  116.             ])
  117.             ->add('description'TextType::class, [
  118.                 'required' => false,
  119.                 'constraints' => [
  120.                     new Assert\Length([
  121.                         'max' => $this->eccubeConfig['eccube_stext_len'],
  122.                     ]),
  123.                 ],
  124.             ])
  125.             ->add('keyword'TextType::class, [
  126.                 'required' => false,
  127.                 'constraints' => [
  128.                     new Assert\Length([
  129.                         'max' => $this->eccubeConfig['eccube_stext_len'],
  130.                     ]),
  131.                 ],
  132.             ])
  133.             ->add('meta_robots'TextType::class, [
  134.                 'required' => false,
  135.                 'constraints' => [
  136.                     new Assert\Length([
  137.                         'max' => $this->eccubeConfig['eccube_stext_len'],
  138.                     ]),
  139.                 ],
  140.             ])->add('meta_tags'TextAreaType::class, [
  141.                 'required' => false,
  142.                 'constraints' => [
  143.                     new Assert\Length([
  144.                         'max' => $this->eccubeConfig['eccube_ltext_len'],
  145.                     ]),
  146.                 ],
  147.             ])
  148.             ->add('PcLayout'EntityType::class, [
  149.                 'mapped' => false,
  150.                 'placeholder' => '---',
  151.                 'required' => false,
  152.                 'class' => Layout::class,
  153.                 'query_builder' => function (EntityRepository $er) {
  154.                     $DeviceType $this->deviceTypeRepository->find(DeviceType::DEVICE_TYPE_PC);
  155.                     return $er->createQueryBuilder('l')
  156.                         ->where('l.id != :DefaultLayoutPreviewPage')
  157.                         ->andWhere('l.DeviceType = :DeviceType')
  158.                         ->setParameter('DeviceType'$DeviceType)
  159.                         ->setParameter('DefaultLayoutPreviewPage'Layout::DEFAULT_LAYOUT_PREVIEW_PAGE)
  160.                         ->orderBy('l.id''DESC');
  161.                 },
  162.             ])
  163.             ->add('SpLayout'EntityType::class, [
  164.                 'mapped' => false,
  165.                 'placeholder' => '---',
  166.                 'required' => false,
  167.                 'class' => Layout::class,
  168.                 'query_builder' => function (EntityRepository $er) {
  169.                     $DeviceType $this->deviceTypeRepository->find(DeviceType::DEVICE_TYPE_MB);
  170.                     return $er->createQueryBuilder('l')
  171.                         ->where('l.id != :DefaultLayoutPreviewPage')
  172.                         ->andWhere('l.DeviceType = :DeviceType')
  173.                         ->setParameter('DeviceType'$DeviceType)
  174.                         ->setParameter('DefaultLayoutPreviewPage'Layout::DEFAULT_LAYOUT_PREVIEW_PAGE)
  175.                         ->orderBy('l.id''DESC');
  176.                 },
  177.             ])
  178.             ->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) {
  179.                 $Page $event->getData();
  180.                 if (is_null($Page->getId())) {
  181.                     return;
  182.                 }
  183.                 $form $event->getForm();
  184.                 $Layouts $Page->getLayouts();
  185.                 foreach ($Layouts as $Layout) {
  186.                     if ($Layout->getDeviceType()->getId() == DeviceType::DEVICE_TYPE_PC) {
  187.                         $form['PcLayout']->setData($Layout);
  188.                     }
  189.                     if ($Layout->getDeviceType()->getId() == DeviceType::DEVICE_TYPE_MB) {
  190.                         $form['SpLayout']->setData($Layout);
  191.                     }
  192.                 }
  193.             })
  194.             ->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
  195.                 $form $event->getForm();
  196.                 /** @var Page $Page */
  197.                 $Page $event->getData();
  198.                 // urlの重複チェック
  199.                 $qb $this->entityManager->createQueryBuilder();
  200.                 $qb->select('count(p)')
  201.                     ->from('Eccube\\Entity\\Page''p')
  202.                     ->where('p.url = :url')
  203.                     ->setParameter('url'$Page->getUrl());
  204.                 // 更新の場合は自身のデータを重複チェックから除外する
  205.                 if (!is_null($Page->getId())) {
  206.                     $qb
  207.                         ->andWhere('p.id <> :page_id')
  208.                         ->setParameter('page_id'$Page->getId());
  209.                 }
  210.                 // 確認ページの編集ページ存在している場合
  211.                 if ($Page->getEditType() == Page::EDIT_TYPE_DEFAULT_CONFIRM && $Page->getMasterPage()) {
  212.                     $qb
  213.                         ->andWhere('p.id <> :master_page_id')
  214.                         ->setParameter('master_page_id'$Page->getMasterPage()->getId());
  215.                 }
  216.                 $count $qb->getQuery()->getSingleScalarResult();
  217.                 if ($count 0) {
  218.                     $form['url']->addError(new FormError(trans('admin.content.page_url_exists')));
  219.                 }
  220.                 // Page::EDIT_TYPE_USER ファイルの重複チェック
  221.                 $qb $this->entityManager->createQueryBuilder();
  222.                 $qb->select('count(p)')
  223.                     ->from('Eccube\\Entity\\Page''p')
  224.                     ->where('p.file_name = :file_name')
  225.                     ->andWhere('p.edit_type = :edit_type')
  226.                     ->setParameter('file_name'$Page->getFileName())
  227.                     ->setParameter('edit_type'Page::EDIT_TYPE_USER);
  228.                 // 更新の場合は自身のデータを重複チェックから除外する
  229.                 if (!is_null($Page->getId())) {
  230.                     $qb
  231.                         ->andWhere('p.id <> :page_id')
  232.                         ->setParameter('page_id'$Page->getId());
  233.                 }
  234.                 $count $qb->getQuery()->getSingleScalarResult();
  235.                 if ($count 0) {
  236.                     $form['file_name']->addError(new FormError(trans('admin.content.page_file_name_exists')));
  237.                 }
  238.                 // Page::EDIT_TYPE_USER を修正した場合は、 Page::EDIT_TYPE_DEFAULT とファイルの重複チェック
  239.                 if (Page::EDIT_TYPE_USER === $Page->getEditType()) {
  240.                     $qb $this->entityManager->createQueryBuilder();
  241.                     $qb->select('count(p)')
  242.                         ->from('Eccube\\Entity\\Page''p')
  243.                         ->where('p.file_name = :file_name')
  244.                         ->andWhere('p.edit_type >= :edit_type')
  245.                         ->setParameter('file_name'$Page->getFileName())
  246.                         ->setParameter('edit_type'Page::EDIT_TYPE_DEFAULT);
  247.                     // 更新の場合は自身のデータを重複チェックから除外する
  248.                     if (!is_null($Page->getId())) {
  249.                         $qb
  250.                             ->andWhere('p.id <> :page_id')
  251.                             ->setParameter('page_id'$Page->getId());
  252.                     }
  253.                     $count $qb->getQuery()->getSingleScalarResult();
  254.                     if ($count 0) {
  255.                         $form['file_name']->addError(new FormError(trans('admin.content.page_file_name_exists')));
  256.                     }
  257.                 }
  258.             });
  259.     }
  260.     /**
  261.      * {@inheritdoc}
  262.      */
  263.     public function configureOptions(OptionsResolver $resolver)
  264.     {
  265.         $resolver->setDefaults([
  266.             'data_class' => Page::class,
  267.         ]);
  268.     }
  269.     /**
  270.      * {@inheritdoc}
  271.      */
  272.     public function getBlockPrefix()
  273.     {
  274.         return 'main_edit';
  275.     }
  276. }