<?phpnamespace Plugin\ApexSignboard;use Doctrine\ORM\EntityManagerInterface;use Eccube\Entity\Order;use Eccube\Event\TemplateEvent;use Plugin\ApexSignboard\Entity\OrderItemTrait;use Plugin\ApexSignboard\Repository\Master\MtbSignboardTypeRepository;use Plugin\ApexSignboard\Service\SignboardService;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use Symfony\Component\Form\FormFactoryInterface;use Symfony\Component\HttpFoundation\RedirectResponse;use Symfony\Component\HttpKernel\Event\ResponseEvent;use Symfony\Component\HttpKernel\KernelEvents;use Symfony\Component\Routing\RouterInterface;class Event implements EventSubscriberInterface{ public function __construct( EntityManagerInterface $entityManager, FormFactoryInterface $formFactory, MtbSignboardTypeRepository $mtbSignboardTypeRepository, SignboardService $signboardService, RouterInterface $router ) { $this->entityManager = $entityManager; $this->formFactory = $formFactory; $this->mtbSignboardTypeRepository = $mtbSignboardTypeRepository; $this->signboardService = $signboardService; $this->router = $router; } /** * @return array */ public static function getSubscribedEvents() { return [// KernelEvents::RESPONSE => 'onResponse',// 'Shopping/index.twig' => 'shopping',// 'Shopping/confirm.twig' => 'shopping',// 'Mypage/history.twig' => 'onRenderMypageHistory', '@admin/Order/edit.twig' => 'onRenderAdminOrderEdit', ]; } /** * @param TemplateEvent $event */ public function shopping(TemplateEvent $event) { $parameters = $event->getParameters(); /** @var Order $Order */ $Order = $parameters['Order']; $Signboards = $this->signboardService->getSignboards($Order); $carrying_date_max = $this->signboardService->getCarryingDateMax($Order); foreach ($Signboards as $Signboard){ if($Signboard->getId() == null){ // 立て札情報がなければ登録画面にリダイレクト $this->redirect_url = $this->router->generate('apex_signboard_shopping'); return; } if(!is_null($carrying_date_max) && !is_null($Signboard->getCarryingDate()) && $Signboard->getCarryingDate() > $carrying_date_max){ // オリジナルボードの持ち込み日が配達日の2日前よりも後の場合は入力画面にリダイレクト $this->redirect_url = $this->router->generate('apex_signboard_shopping'); return; } } $parameters['Signboards'] = $Signboards; $event->setParameters($parameters); $event->addSnippet('@ApexSignboard/default/shopping.twig'); } public function onResponse(ResponseEvent $event) { // $this->redirect_url が設定されている場合はリダイレクトする if(isset($this->redirect_url)){ $response = new RedirectResponse($this->redirect_url); $event->setResponse($response); } } /** * [order/{id}/edit]表示の時のEvent Fork. * * @param TemplateEvent $event */ public function onRenderAdminOrderEdit(TemplateEvent $event) { $parameters = $event->getParameters(); if (is_null($parameters['Order'])) { return; } /** @var Order $Order */ $Order = $parameters['Order']; $Signboards = []; /* @var OrderItemTrait $orderDetail */ foreach ($Order->getProductOrderItems() as $orderDetail) { // 商品ごと・個数ごとに立て札のデータを取得 for($i=0; $i<$orderDetail->getQuantity(); $i++){ // 立て札情報を取得 $Signboards[] = $orderDetail->getSignboards()->get($i); } } $parameters['Signboards'] = $Signboards; $event->setParameters($parameters); // add twig $event->addSnippet('@ApexSignboard/admin/order_edit_signboard.twig'); }}