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

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.                 'format' => 'yyyy-MM-dd',
  172.                 'required' => false,
  173.             ])
  174.             ->add('tracking_number'TextType::class, [
  175.                 'required' => false,
  176.                 'constraints' => [
  177.                     new Assert\Length([
  178.                         'max' => $this->eccubeConfig['eccube_mtext_len'],
  179.                     ]),
  180.                 ],
  181.             ])
  182.             ->add('note'TextareaType::class, [
  183.                 'required' => false,
  184.                 'constraints' => [
  185.                     new Assert\Length([
  186.                         'max' => $this->eccubeConfig['eccube_ltext_len'],
  187.                     ]),
  188.                 ],
  189.             ])
  190.             ->add('OrderItems'CollectionType::class, [
  191.                 'entry_type' => OrderItemType::class,
  192.                 'allow_add' => true,
  193.                 'allow_delete' => true,
  194.                 'prototype' => true,
  195.             ])
  196.             // 明細業のエラー表示用
  197.             ->add('OrderItemsErrors'TextType::class, [
  198.                 'mapped' => false,
  199.             ])
  200.             ->add('notify_email'CheckboxType::class, [
  201.                 'mapped' => false,
  202.                 'required' => false,
  203.                 'data' => true,
  204.             ])
  205.             ->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) {
  206.                 /** @var \Eccube\Entity\Shipping $data */
  207.                 $data $event->getData();
  208.                 /** @var \Symfony\Component\Form\Form $form */
  209.                 $form $event->getForm();
  210.                 if (!$data) {
  211.                     return;
  212.                 }
  213.                 $Delivery $data->getDelivery();
  214.                 $timeId $data->getTimeId();
  215.                 $DeliveryTime null;
  216.                 if ($timeId) {
  217.                     $DeliveryTime $this->deliveryTimeRepository->find($timeId);
  218.                 }
  219.                 // お届け時間を配送業者で絞り込み
  220.                 $form->add('DeliveryTime'EntityType::class, [
  221.                     'class' => 'Eccube\Entity\DeliveryTime',
  222.                     'choice_label' => function (DeliveryTime $DeliveryTime) {
  223.                         return $DeliveryTime->isVisible()
  224.                             ? $DeliveryTime->getDeliveryTime()
  225.                             : $DeliveryTime->getDeliveryTime().trans('admin.common.hidden_label');
  226.                     },
  227.                     'placeholder' => 'common.select__unspecified',
  228.                     'required' => false,
  229.                     'data' => $DeliveryTime,
  230.                     'query_builder' => function (EntityRepository $er) use ($Delivery) {
  231.                         $qb $er->createQueryBuilder('dt');
  232.                         $qb
  233.                             ->orderBy('dt.visible''DESC'// 非表示は下に配置
  234.                             ->addOrderBy('dt.sort_no''ASC');
  235.                         if ($Delivery) {
  236.                             $qb
  237.                                 ->where('dt.Delivery = :Delivery')
  238.                                 ->setParameter('Delivery'$Delivery);
  239.                         }
  240.                         return $qb;
  241.                     },
  242.                     'mapped' => false,
  243.                 ]);
  244.             })
  245.             ->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
  246.                 $data $event->getData();
  247.                 $form $event->getForm();
  248.                 if (!$data) {
  249.                     return;
  250.                 }
  251.                 $Delivery null;
  252.                 if (StringUtil::isNotBlank($data['Delivery'])) {
  253.                     $Delivery $this->deliveryRepository->find($data['Delivery']);
  254.                 }
  255.                 // お届け時間を配送業者で絞り込み
  256.                 $form->remove('DeliveryTime');
  257.                 $form->add('DeliveryTime'EntityType::class, [
  258.                     'class' => 'Eccube\Entity\DeliveryTime',
  259.                     'choice_label' => 'delivery_time',
  260.                     'placeholder' => 'common.select__unspecified',
  261.                     'required' => false,
  262.                     'query_builder' => function (EntityRepository $er) use ($Delivery) {
  263.                         $qb $er->createQueryBuilder('dt');
  264.                         if ($Delivery) {
  265.                             $qb
  266.                                 ->where('dt.Delivery = :Delivery')
  267.                                 ->setParameter('Delivery'$Delivery);
  268.                         }
  269.                         return $qb;
  270.                     },
  271.                     'mapped' => false,
  272.                 ]);
  273.             })
  274.             ->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
  275.                 $form $event->getForm();
  276.                 $Shipping $event->getData();
  277.                 $Delivery $Shipping->getDelivery();
  278.                 $Shipping->setShippingDeliveryName($Delivery $Delivery->getName() : null);
  279.                 $DeliveryTime $form['DeliveryTime']->getData();
  280.                 if ($DeliveryTime) {
  281.                     $Shipping->setShippingDeliveryTime($DeliveryTime->getDeliveryTime());
  282.                     $Shipping->setTimeId($DeliveryTime->getId());
  283.                 } else {
  284.                     $Shipping->setShippingDeliveryTime(null);
  285.                     $Shipping->setTimeId(null);
  286.                 }
  287.             })
  288.             ->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
  289.                 // 出荷編集画面のみバリデーションをする。
  290.                 if ($event->getForm()->getParent()->getName() != 'shippings') {
  291.                     return;
  292.                 }
  293.                 /** @var Shipping $Shipping */
  294.                 $Shipping $event->getData();
  295.                 $OrderItems $Shipping->getOrderItems();
  296.                 $count 0;
  297.                 foreach ($OrderItems as $OrderItem) {
  298.                     if ($OrderItem->isProduct()) {
  299.                         $count++;
  300.                     }
  301.                 }
  302.                 // 商品明細が1件もない場合はエラーとする.
  303.                 if ($count 1) {
  304.                     // 画面下部にエラーメッセージを表示させる
  305.                     $form $event->getForm();
  306.                     $form['OrderItemsErrors']->addError(new FormError(trans('admin.order.product_item_not_found')));
  307.                 }
  308.             });
  309.     }
  310.     /**
  311.      * {@inheritdoc}
  312.      */
  313.     public function configureOptions(OptionsResolver $resolver)
  314.     {
  315.         $resolver->setDefaults([
  316.             'data_class' => 'Eccube\Entity\Shipping',
  317.         ]);
  318.     }
  319.     /**
  320.      * {@inheritdoc}
  321.      */
  322.     public function getBlockPrefix()
  323.     {
  324.         return 'shipping';
  325.     }
  326. }