/** * {@inheritdoc} */ public function call(ActionEvent $event) { $controller = $event->getController(); $request = $event->getRequest(); $dataProvider = $event->getDataProvider(); $dispatcher = $controller->get('event_dispatcher'); $formProvider = $controller->get('vardius_crud.form.provider'); if ($id = $request->get('id')) { $data = $dataProvider->get($id); $this->checkRole($controller, $data); } else { $data = $dataProvider->create(); $this->checkRole($controller); } $repository = $dataProvider->getSource(); $form = $formProvider->createForm($event->getFormType(), $data); $crudEvent = new CrudEvent($repository, $controller, $form); $dispatcher->dispatch(CrudEvents::CRUD_PRE_SAVE, $crudEvent); $responseHandler = $this->getResponseHandler($controller); if ($request->isMethod('POST')) { $form->handleRequest($request); if ($form->isValid()) { if ($data->getId()) { $dispatcher->dispatch(CrudEvents::CRUD_PRE_UPDATE, $crudEvent); $dataProvider->update($data); $dispatcher->dispatch(CrudEvents::CRUD_POST_UPDATE, $crudEvent); } else { $dispatcher->dispatch(CrudEvents::CRUD_PRE_CREATE, $crudEvent); $dataProvider->add($data); $dispatcher->dispatch(CrudEvents::CRUD_POST_CREATE, $crudEvent); } $dispatcher->dispatch(CrudEvents::CRUD_POST_SAVE, $crudEvent); $routeName = rtrim(rtrim($request->get('_route'), 'edit'), 'add') . 'show'; if (!$controller->get('router')->getRouteCollection()->get($routeName)) { $routeName = rtrim($routeName, 'show') . 'list'; } if (!$controller->get('router')->getRouteCollection()->get($routeName)) { $flashBag = $request->getSession()->getFlashBag(); $flashBag->add('success', 'save.success'); return $controller->redirect($responseHandler->getRefererUrl($controller, $request, ['id' => $data->getId()])); } if ($this->options['response_type'] === 'html') { return $controller->redirect($controller->generateUrl($routeName, ['id' => $data->getId()])); } else { return $responseHandler->getResponse($this->options['response_type'], '', '', ['data' => $data], self::ACTION_CODE); } } elseif ($this->options['response_type'] === 'json') { $formErrorHandler = $controller->get('vardius_crud.form.error_handler'); return new JsonResponse(['message' => 'Invalid form data', 'errors' => $formErrorHandler->getErrorMessages($form)], 400); } } $params = ['data' => $data]; if ($this->options['response_type'] === 'html') { $params = array_merge($params, ['form' => $form->createView()]); } $paramsEvent = new ResponseEvent($params); $crudEvent = new CrudEvent($repository, $controller, $paramsEvent); $dispatcher->dispatch(CrudEvents::CRUD_SAVE_PRE_RESPONSE, $crudEvent); return $responseHandler->getResponse($this->options['response_type'], $event->getView(), $this->getTemplate(), $paramsEvent->getParams()); }
/** * {@inheritdoc} */ public function call(ActionEvent $event, string $format) : Response { $controller = $event->getController(); $dataProvider = $event->getDataProvider(); $request = $event->getRequest(); if ($id = $request->get('id')) { $data = $dataProvider->get($id); $this->checkRole($controller, $data); } else { $data = $dataProvider->create(); $this->checkRole($controller); } $formProvider = $controller->get('vardius_crud.form.provider'); $form = $formProvider->createForm($event->getFormType(), $data, ['method' => $request->getMethod()]); $source = $dataProvider->getSource(); $crudEvent = new CrudEvent($source, $controller, $form); $dispatcher = $controller->get('event_dispatcher'); $dispatcher->dispatch(CrudEvents::CRUD_PRE_SAVE, $crudEvent); $responseHandler = $controller->get('vardius_crud.response.handler'); if (in_array($request->getMethod(), ['POST', 'PUT'])) { $form->handleRequest($request); if ($form->isValid()) { if ($data->getId()) { $dispatcher->dispatch(CrudEvents::CRUD_PRE_UPDATE, $crudEvent); $dataProvider->update($data); $dispatcher->dispatch(CrudEvents::CRUD_POST_UPDATE, $crudEvent); } else { $dispatcher->dispatch(CrudEvents::CRUD_PRE_CREATE, $crudEvent); $dataProvider->add($data); $dispatcher->dispatch(CrudEvents::CRUD_POST_CREATE, $crudEvent); } $dispatcher->dispatch(CrudEvents::CRUD_POST_SAVE, $crudEvent); if ($format === 'html') { $routeName = rtrim(rtrim($request->get('_route'), 'edit'), 'add') . 'show'; if (!$controller->get('router')->getRouteCollection()->get($routeName)) { $routeName = rtrim($routeName, 'show') . 'list'; } if (!$controller->get('router')->getRouteCollection()->get($routeName)) { /** @var Session $session */ $session = $request->getSession(); /** @var FlashBagInterface $flashBag */ $flashBag = $session->getFlashBag(); $flashBag->add('success', 'save.success'); return $controller->redirect($responseHandler->getRefererUrl($controller, $request, ['id' => $data->getId()])); } return $controller->redirect($controller->generateUrl($routeName, ['id' => $data->getId()])); } else { return $responseHandler->getResponse($format, '', '', $data, self::ACTION_CODE, [], ['groups' => ['update']]); } } elseif ($format === 'json') { $formErrorHandler = $controller->get('vardius_crud.form.error_handler'); return new JsonResponse(['message' => 'Invalid form data', 'errors' => $formErrorHandler->getErrorMessages($form)], 400); } } $params = $data; if ($format === 'html') { $params = array_merge($params, ['form' => $form->createView()]); } $paramsEvent = new ResponseEvent($params); $crudEvent = new CrudEvent($source, $controller, $paramsEvent); $dispatcher->dispatch(CrudEvents::CRUD_SAVE, $crudEvent); return $responseHandler->getResponse($format, $event->getView(), $this->getTemplate(), $paramsEvent->getParams(), 200, [], ['groups' => ['update']]); }