src/Eccube/Form/Type/Admin/ShippingType.php line 45

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\EntityRepository;
  14. use Eccube\Common\EccubeConfig;
  15. use Eccube\Entity\BaseInfo;
  16. use Eccube\Entity\Delivery;
  17. use Eccube\Entity\DeliveryTime;
  18. use Eccube\Entity\Shipping;
  19. use Eccube\Form\Type\AddressType;
  20. use Eccube\Form\Type\KanaType;
  21. use Eccube\Form\Type\NameType;
  22. use Eccube\Form\Type\PhoneNumberType;
  23. use Eccube\Form\Type\PostalType;
  24. use Eccube\Repository\BaseInfoRepository;
  25. use Eccube\Repository\DeliveryRepository;
  26. use Eccube\Repository\DeliveryTimeRepository;
  27. use Eccube\Util\StringUtil;
  28. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  29. use Symfony\Component\Form\AbstractType;
  30. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  31. use Symfony\Component\Form\Extension\Core\Type\CollectionType;
  32. use Symfony\Component\Form\Extension\Core\Type\DateType;
  33. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  34. use Symfony\Component\Form\Extension\Core\Type\TextType;
  35. use Symfony\Component\Form\FormBuilderInterface;
  36. use Symfony\Component\Form\FormError;
  37. use Symfony\Component\Form\FormEvent;
  38. use Symfony\Component\Form\FormEvents;
  39. use Symfony\Component\OptionsResolver\OptionsResolver;
  40. use Symfony\Component\Validator\Constraints as Assert;
  41. class ShippingType extends AbstractType
  42. {
  43.     /**
  44.      * @var EccubeConfig
  45.      */
  46.     protected $eccubeConfig;
  47.     /**
  48.      * @var DeliveryRepository
  49.      */
  50.     protected $deliveryRepository;
  51.     /**
  52.      * @var DeliveryTimeRepository
  53.      */
  54.     protected $deliveryTimeRepository;
  55.     /**
  56.      * @var BaseInfo
  57.      */
  58.     protected $BaseInfo;
  59.     /**
  60.      * ShippingType constructor.
  61.      *
  62.      * @param EccubeConfig $eccubeConfig
  63.      * @param DeliveryRepository $deliveryRepository
  64.      * @param DeliveryTimeRepository $deliveryTimeRepository
  65.      * @param BaseInfoRepository $baseInfoRepository
  66.      */
  67.     public function __construct(
  68.         EccubeConfig $eccubeConfig,
  69.         DeliveryRepository $deliveryRepository,
  70.         DeliveryTimeRepository $deliveryTimeRepository,
  71.         BaseInfoRepository $baseInfoRepository
  72.     ) {
  73.         $this->eccubeConfig $eccubeConfig;
  74.         $this->deliveryRepository $deliveryRepository;
  75.         $this->deliveryTimeRepository $deliveryTimeRepository;
  76.         $this->BaseInfo $baseInfoRepository->get();
  77.     }
  78.     /**
  79.      * {@inheritdoc}
  80.      */
  81.     public function buildForm(FormBuilderInterface $builder, array $options)
  82.     {
  83.         $builder
  84.             ->add('name'NameType::class, [
  85.                 'required' => false,
  86.                 'options' => [
  87.                     'constraints' => [
  88.                         new Assert\NotBlank(),
  89.                     ],
  90.                 ],
  91.             ])
  92.             ->add('kana'KanaType::class, [
  93.                 'required' => false,
  94.                 'options' => [
  95.                     'constraints' => [
  96.                         new Assert\NotBlank(),
  97.                     ],
  98.                 ],
  99.             ])
  100.             ->add('company_name'TextType::class, [
  101.                 'required' => false,
  102.                 'constraints' => [
  103.                     new Assert\Length([
  104.                         'max' => $this->eccubeConfig['eccube_stext_len'],
  105.                     ]),
  106.                 ],
  107.             ])
  108.             ->add('postal_code'PostalType::class, [
  109.                 'required' => true,
  110.             ])
  111.             ->add('address'AddressType::class, [
  112.                 'required' => false,
  113.                 'pref_options' => [
  114.                     'constraints' => [
  115.                         new Assert\NotBlank(),
  116.                     ],
  117.                     'attr' => ['class' => 'p-region-id'],
  118.                 ],
  119.                 'addr01_options' => [
  120.                     'constraints' => [
  121.                         new Assert\NotBlank(),
  122.                         new Assert\Length([
  123.                             'max' => $this->eccubeConfig['eccube_mtext_len'],
  124.                         ]),
  125.                     ],
  126.                     'attr' => [
  127.                         'class' => 'p-locality p-street-address',
  128.                         'placeholder' => 'admin.common.address_sample_01',
  129.                     ],
  130.                 ],
  131.                 'addr02_options' => [
  132.                     'required' => false,
  133.                     'constraints' => [
  134.                         new Assert\NotBlank(),
  135.                         new Assert\Length([
  136.                             'max' => $this->eccubeConfig['eccube_mtext_len'],
  137.                         ]),
  138.                     ],
  139.                     'attr' => [
  140.                         'class' => 'p-extended-address',
  141.                         'placeholder' => 'admin.common.address_sample_02',
  142.                     ],
  143.                 ],
  144.             ])
  145.             ->add('phone_number'PhoneNumberType::class, [
  146.                 'required' => false,
  147.                 'constraints' => [
  148.                     new Assert\NotBlank(),
  149.                 ],
  150.             ])
  151.             ->add('Delivery'EntityType::class, [
  152.                 'required' => false,
  153.                 'class' => 'Eccube\Entity\Delivery',
  154.                 'choice_label' => function (Delivery $Delivery) {
  155.                     return $Delivery->isVisible()
  156.                         ? $Delivery->getServiceName()
  157.                         : $Delivery->getServiceName().trans('admin.common.hidden_label');
  158.                 },
  159.                 'query_builder' => function ($er) {
  160.                     return $er->createQueryBuilder('d')
  161.                         ->orderBy('d.visible''DESC'// 非表示は下に配置
  162.                         ->addOrderBy('d.sort_no''ASC');
  163.                 },
  164.                 'placeholder' => false,
  165.                 'constraints' => [
  166.                     new Assert\NotBlank(),
  167.                 ],
  168.             ])
  169.             ->add('shipping_delivery_date'DateType::class, [
  170.                 'placeholder' => '',
  171.                 'required' => false,
  172.                 'input' => 'datetime',
  173.                 'widget' => 'single_text',
  174.             ])
  175.             ->add('tracking_number'TextType::class, [
  176.                 'required' => false,
  177.                 'constraints' => [
  178.                     new Assert\Length([
  179.                         'max' => $this->eccubeConfig['eccube_mtext_len'],
  180.                     ]),
  181.                     new Assert\Regex([
  182.                         'pattern' => '/^[0-9a-zA-Z-]+$/u',
  183.                         'message' => 'form_error.graph_and_hyphen_only',
  184.                     ]),
  185.                 ],
  186.             ])
  187.             ->add('note'TextareaType::class, [
  188.                 'required' => false,
  189.                 'constraints' => [
  190.                     new Assert\Length([
  191.                         'max' => $this->eccubeConfig['eccube_ltext_len'],
  192.                     ]),
  193.                 ],
  194.             ])
  195.             ->add('OrderItems'CollectionType::class, [
  196.                 'entry_type' => OrderItemType::class,
  197.                 'allow_add' => true,
  198.                 'allow_delete' => true,
  199.                 'prototype' => true,
  200.             ])
  201.             // 明細業のエラー表示用
  202.             ->add('OrderItemsErrors'TextType::class, [
  203.                 'mapped' => false,
  204.             ])
  205.             ->add('notify_email'CheckboxType::class, [
  206.                 'mapped' => false,
  207.                 'required' => false,
  208.                 'data' => true,
  209.             ])
  210.             ->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) {
  211.                 /** @var \Eccube\Entity\Shipping $data */
  212.                 $data $event->getData();
  213.                 /** @var \Symfony\Component\Form\Form $form */
  214.                 $form $event->getForm();
  215.                 if (!$data) {
  216.                     return;
  217.                 }
  218.                 $Delivery $data->getDelivery();
  219.                 $timeId $data->getTimeId();
  220.                 $DeliveryTime null;
  221.                 if ($timeId) {
  222.                     $DeliveryTime $this->deliveryTimeRepository->find($timeId);
  223.                 }
  224.                 // お届け時間を配送業者で絞り込み
  225.                 $form->add('DeliveryTime'EntityType::class, [
  226.                     'class' => 'Eccube\Entity\DeliveryTime',
  227.                     'choice_label' => function (DeliveryTime $DeliveryTime) {
  228.                         return $DeliveryTime->isVisible()
  229.                             ? $DeliveryTime->getDeliveryTime()
  230.                             : $DeliveryTime->getDeliveryTime().trans('admin.common.hidden_label');
  231.                     },
  232.                     'placeholder' => 'common.select__unspecified',
  233.                     'required' => false,
  234.                     'data' => $DeliveryTime,
  235.                     'query_builder' => function (EntityRepository $er) use ($Delivery) {
  236.                         $qb $er->createQueryBuilder('dt');
  237.                         $qb
  238.                             ->orderBy('dt.visible''DESC'// 非表示は下に配置
  239.                             ->addOrderBy('dt.sort_no''ASC');
  240.                         if ($Delivery) {
  241.                             $qb
  242.                                 ->where('dt.Delivery = :Delivery')
  243.                                 ->setParameter('Delivery'$Delivery);
  244.                         }
  245.                         return $qb;
  246.                     },
  247.                     'mapped' => false,
  248.                 ]);
  249.             })
  250.             ->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
  251.                 $data $event->getData();
  252.                 $form $event->getForm();
  253.                 if (!$data) {
  254.                     return;
  255.                 }
  256.                 $Delivery null;
  257.                 if (StringUtil::isNotBlank($data['Delivery'])) {
  258.                     $Delivery $this->deliveryRepository->find($data['Delivery']);
  259.                 }
  260.                 // お届け時間を配送業者で絞り込み
  261.                 $form->remove('DeliveryTime');
  262.                 $form->add('DeliveryTime'EntityType::class, [
  263.                     'class' => 'Eccube\Entity\DeliveryTime',
  264.                     'choice_label' => 'delivery_time',
  265.                     'placeholder' => 'common.select__unspecified',
  266.                     'required' => false,
  267.                     'query_builder' => function (EntityRepository $er) use ($Delivery) {
  268.                         $qb $er->createQueryBuilder('dt');
  269.                         if ($Delivery) {
  270.                             $qb
  271.                                 ->where('dt.Delivery = :Delivery')
  272.                                 ->setParameter('Delivery'$Delivery);
  273.                         }
  274.                         return $qb;
  275.                     },
  276.                     'mapped' => false,
  277.                 ]);
  278.             })
  279.             ->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
  280.                 $form $event->getForm();
  281.                 $Shipping $event->getData();
  282.                 $Delivery $Shipping->getDelivery();
  283.                 $Shipping->setShippingDeliveryName($Delivery $Delivery->getName() : null);
  284.                 $DeliveryTime $form['DeliveryTime']->getData();
  285.                 if ($DeliveryTime) {
  286.                     $Shipping->setShippingDeliveryTime($DeliveryTime->getDeliveryTime());
  287.                     $Shipping->setTimeId($DeliveryTime->getId());
  288.                 } else {
  289.                     $Shipping->setShippingDeliveryTime(null);
  290.                     $Shipping->setTimeId(null);
  291.                 }
  292.             })
  293.             ->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
  294.                 // 出荷編集画面のみバリデーションをする。
  295.                 if ($event->getForm()->getParent()->getName() != 'shippings') {
  296.                     return;
  297.                 }
  298.                 /** @var Shipping $Shipping */
  299.                 $Shipping $event->getData();
  300.                 $OrderItems $Shipping->getOrderItems();
  301.                 $count 0;
  302.                 foreach ($OrderItems as $OrderItem) {
  303.                     if ($OrderItem->isProduct()) {
  304.                         $count++;
  305.                     }
  306.                 }
  307.                 // 商品明細が1件もない場合はエラーとする.
  308.                 if ($count 1) {
  309.                     // 画面下部にエラーメッセージを表示させる
  310.                     $form $event->getForm();
  311.                     $form['OrderItemsErrors']->addError(new FormError(trans('admin.order.product_item_not_found')));
  312.                 }
  313.             });
  314.     }
  315.     /**
  316.      * {@inheritdoc}
  317.      */
  318.     public function configureOptions(OptionsResolver $resolver)
  319.     {
  320.         $resolver->setDefaults([
  321.             'data_class' => 'Eccube\Entity\Shipping',
  322.         ]);
  323.     }
  324.     /**
  325.      * {@inheritdoc}
  326.      */
  327.     public function getBlockPrefix()
  328.     {
  329.         return 'shipping';
  330.     }
  331. }