app/Plugin/ApexDeliveryArea/Event.php line 137

Open in your IDE?
  1. <?php
  2. namespace Plugin\ApexDeliveryArea;
  3. use Doctrine\Common\Collections\ArrayCollection;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Eccube\Entity\Delivery;
  6. use Eccube\Event\EccubeEvents;
  7. use Eccube\Event\EventArgs;
  8. use Eccube\Event\TemplateEvent;
  9. use Plugin\ApexDeliveryArea\Entity\DeliveryArea;
  10. use Plugin\ApexDeliveryArea\Form\Type\Admin\DeliveryAreaType;
  11. use Plugin\ApexDeliveryArea\Repository\DeliveryAreaRepository;
  12. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. use Symfony\Component\Form\Extension\Core\Type\CollectionType;
  15. class Event implements EventSubscriberInterface
  16. {
  17.     private $entityManager;
  18.     private $deliveryAreaRepository;
  19.     public function __construct(
  20.         EntityManagerInterface $entityManager,
  21.         DeliveryAreaRepository $deliveryAreaRepository,
  22.     )
  23.     {
  24.         $this->entityManager $entityManager;
  25.         $this->deliveryAreaRepository $deliveryAreaRepository;
  26.     }
  27.     public static function getSubscribedEvents()
  28.     {
  29.         return [
  30.             EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_EDIT_INITIALIZE => 'onAdminDeliveryEditInitialize',
  31.             EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_EDIT_COMPLETE => 'onAdminDeliveryEditComplete',
  32.             '@admin/Setting/Shop/delivery_edit.twig' => 'onRenderAdminDeliveryEdit',
  33.             EccubeEvents::ADMIN_PRODUCT_EDIT_INITIALIZE => 'onAdminProductEditInitialize',
  34.             EccubeEvents::ADMIN_PRODUCT_EDIT_COMPLETE => 'onAdminProductEditComplete',
  35.             '@admin/Product/product.twig' => 'onRenderAdminProductEdit',
  36.         ];
  37.     }
  38.     /**
  39.      * 配送方法設定画面に "エリア別送料" を追加
  40.      */
  41.     public function onAdminDeliveryEditInitialize(EventArgs $event)
  42.     {
  43.         $builder $event->getArgument('builder');
  44.         $builder->add('DeliveryAreas'CollectionType::class, [
  45.             'entry_type' => DeliveryAreaType::class,
  46.             'allow_add' => true,
  47.             'allow_delete' => true,
  48.             'by_reference' => false,
  49.             'prototype' => true,
  50.             'label' => 'エリア別送料',
  51.         ]);
  52.         $event->setArgument('builder'$builder);
  53.     }
  54.     /**
  55.      * 配送方法のデータを保存する際に "エリア別送料" を保存・更新
  56.      */
  57.     public function onAdminDeliveryEditComplete(EventArgs $event)
  58.     {
  59.         $form $event->getArgument('form');
  60.         $Delivery $event->getArgument('Delivery');
  61.         $DeliveryData $form->getData();
  62.         $originalDeliveryAreas $this->deliveryAreaRepository->findBy(['Delivery' => $Delivery]);
  63.         // エリアの削除
  64.         foreach ($originalDeliveryAreas as $DeliveryArea) {
  65.             if (false === $Delivery->getDeliveryAreas()->contains($DeliveryArea)) {
  66.                 $this->entityManager->remove($DeliveryArea);
  67.             }
  68.         }
  69.         // 新しいエリアを登録
  70.         if($DeliveryData['DeliveryAreas']){
  71.             foreach ($DeliveryData['DeliveryAreas'] as $deliveryArea) {
  72.                 if ($deliveryArea->getAreas() && $deliveryArea->getFee() !== null) {
  73.                     $deliveryArea->setDelivery($Delivery);
  74.                     $this->entityManager->persist($deliveryArea);
  75.                 }
  76.             }
  77.         }
  78.         $this->entityManager->flush();
  79.     }
  80.     /**
  81.      * @param TemplateEvent $event
  82.      */
  83.     public function onRenderAdminDeliveryEdit(TemplateEvent $event)
  84.     {
  85.         $event->addSnippet('@ApexDeliveryArea/admin/delivery_edit.twig');
  86.     }
  87.     // 商品編集フォームに配送方法を追加
  88.     public function onAdminProductEditInitialize(EventArgs $event)
  89.     {
  90.         $builder $event->getArgument('builder');
  91.         $Product $event->getArgument('Product');
  92.         $builder->add('Delivery'EntityType::class, [
  93.             'class' => Delivery::class,
  94.             'choice_label' => function(Delivery $delivery) {
  95.                 return $delivery->getName() . ' / ' $delivery->getServiceName();
  96.             },
  97.             'placeholder' => '選択してください',
  98.             'mapped' => false,
  99.             'data' => $Product->getDelivery(),
  100.         ]);
  101.     }
  102.     // フォーム送信時に配送方法を保存
  103.     public function onAdminProductEditComplete(EventArgs $event)
  104.     {
  105.         $form $event->getArgument('form');
  106.         $Product $event->getArgument('Product');
  107.         $delivery $form->get('Delivery')->getData();
  108.         $Product->setDelivery($delivery);
  109.         $this->entityManager->persist($Product);
  110.         $this->entityManager->flush();
  111.     }
  112.     /**
  113.      * @param TemplateEvent $event
  114.      */
  115.     public function onRenderAdminProductEdit(TemplateEvent $event)
  116.     {
  117.         $event->addSnippet('@ApexDeliveryArea/admin/product_edit.twig');
  118.     }
  119. }