<?php
namespace Plugin\ApexDeliveryArea;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\EntityManagerInterface;
use Eccube\Entity\Delivery;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Eccube\Event\TemplateEvent;
use Plugin\ApexDeliveryArea\Entity\DeliveryArea;
use Plugin\ApexDeliveryArea\Form\Type\Admin\DeliveryAreaType;
use Plugin\ApexDeliveryArea\Repository\DeliveryAreaRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
class Event implements EventSubscriberInterface
{
private $entityManager;
private $deliveryAreaRepository;
public function __construct(
EntityManagerInterface $entityManager,
DeliveryAreaRepository $deliveryAreaRepository,
)
{
$this->entityManager = $entityManager;
$this->deliveryAreaRepository = $deliveryAreaRepository;
}
public static function getSubscribedEvents()
{
return [
EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_EDIT_INITIALIZE => 'onAdminDeliveryEditInitialize',
EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_EDIT_COMPLETE => 'onAdminDeliveryEditComplete',
'@admin/Setting/Shop/delivery_edit.twig' => 'onRenderAdminDeliveryEdit',
EccubeEvents::ADMIN_PRODUCT_EDIT_INITIALIZE => 'onAdminProductEditInitialize',
EccubeEvents::ADMIN_PRODUCT_EDIT_COMPLETE => 'onAdminProductEditComplete',
'@admin/Product/product.twig' => 'onRenderAdminProductEdit',
];
}
/**
* 配送方法設定画面に "エリア別送料" を追加
*/
public function onAdminDeliveryEditInitialize(EventArgs $event)
{
$builder = $event->getArgument('builder');
$builder->add('DeliveryAreas', CollectionType::class, [
'entry_type' => DeliveryAreaType::class,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'prototype' => true,
'label' => 'エリア別送料',
]);
$event->setArgument('builder', $builder);
}
/**
* 配送方法のデータを保存する際に "エリア別送料" を保存・更新
*/
public function onAdminDeliveryEditComplete(EventArgs $event)
{
$form = $event->getArgument('form');
$Delivery = $event->getArgument('Delivery');
$DeliveryData = $form->getData();
$originalDeliveryAreas = $this->deliveryAreaRepository->findBy(['Delivery' => $Delivery]);
// エリアの削除
foreach ($originalDeliveryAreas as $DeliveryArea) {
if (false === $Delivery->getDeliveryAreas()->contains($DeliveryArea)) {
$this->entityManager->remove($DeliveryArea);
}
}
// 新しいエリアを登録
if($DeliveryData['DeliveryAreas']){
foreach ($DeliveryData['DeliveryAreas'] as $deliveryArea) {
if ($deliveryArea->getAreas() && $deliveryArea->getFee() !== null) {
$deliveryArea->setDelivery($Delivery);
$this->entityManager->persist($deliveryArea);
}
}
}
$this->entityManager->flush();
}
/**
* @param TemplateEvent $event
*/
public function onRenderAdminDeliveryEdit(TemplateEvent $event)
{
$event->addSnippet('@ApexDeliveryArea/admin/delivery_edit.twig');
}
// 商品編集フォームに配送方法を追加
public function onAdminProductEditInitialize(EventArgs $event)
{
$builder = $event->getArgument('builder');
$Product = $event->getArgument('Product');
$builder->add('Delivery', EntityType::class, [
'class' => Delivery::class,
'choice_label' => function(Delivery $delivery) {
return $delivery->getName() . ' / ' . $delivery->getServiceName();
},
'placeholder' => '選択してください',
'mapped' => false,
'data' => $Product->getDelivery(),
]);
}
// フォーム送信時に配送方法を保存
public function onAdminProductEditComplete(EventArgs $event)
{
$form = $event->getArgument('form');
$Product = $event->getArgument('Product');
$delivery = $form->get('Delivery')->getData();
$Product->setDelivery($delivery);
$this->entityManager->persist($Product);
$this->entityManager->flush();
}
/**
* @param TemplateEvent $event
*/
public function onRenderAdminProductEdit(TemplateEvent $event)
{
$event->addSnippet('@ApexDeliveryArea/admin/product_edit.twig');
}
}