<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Sylius\Bundle\CoreBundle\Controller;
use Sylius\Bundle\ResourceBundle\Controller\ResourceController;
use Sylius\Component\Resource\ResourceActions;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
class BaseController extends ResourceController
{
public function indexAction(Request $request): Response
{
$session = $request->getSession();
$criteria = $request->get('criteria', null);
$sessionCriteria = $request->get('_route') . '_criteria';
$resetFilters = $request->get('resetFilters', null);
if($resetFilters){
$session->remove($sessionCriteria);
}else{
if($criteria){
$session->set($sessionCriteria, $criteria);
}else{
$criteria = $session->get($sessionCriteria, null);
if($criteria){
$request->query->set('criteria', $criteria);
}
}
}
$allValues = $request->query->all();
if(isset($allValues['iframeTargetSessionData']) && $allValues['iframeTargetSessionData'] != null){
$session->set("iframeTargetSessionData", $allValues['iframeTargetSessionData']);
}
$configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
$parameters = $configuration->getParameters();
// Enabled or disabled filterSession
if($parameters->get('filterSession') === false){
$session->remove($sessionCriteria);
}
$this->isGrantedOr403($configuration, ResourceActions::INDEX);
$resources = $this->resourcesCollectionProvider->get($configuration, $this->repository);
$event = $this->eventDispatcher->dispatchMultiple(ResourceActions::INDEX, $configuration, $resources);
$eventResponse = $event->getResponse();
if (null !== $eventResponse) {
return $eventResponse;
}
if ($configuration->isHtmlRequest()) {
$template = $request->isXmlHttpRequest() && $request->query->get('get_only_content', false) ? '@SyliusAdmin\Crud/index_only_content.html.twig' : $configuration->getTemplate(ResourceActions::INDEX . '.html');
return $this->render($template, [
'configuration' => $configuration,
'parameters' => $parameters,
'request' => $request,
'metadata' => $this->metadata,
'resources' => $resources,
$this->metadata->getPluralName() => $resources,
]);
}
return $this->createRestView($configuration, $resources);
}
public function createAction(Request $request): Response
{
$configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
$this->isGrantedOr403($configuration, ResourceActions::CREATE);
$newResource = $this->newResourceFactory->create($configuration, $this->factory);
$form = $this->resourceFormFactory->create($configuration, $newResource);
// add button and redirectLet exists
$parameters = $configuration->getParameters();
if($parameters->get('redirectLet')){
$form->add('saveAndLet', SubmitType::class, ['label' => 'Guardar y Permanecer']);
}
if($parameters->get('redirectAditional')){
$form->add('saveAndRedirect', SubmitType::class, ['label' => 'Guardar y Redirigir']);
}
$form->handleRequest($request);
if ($request->isMethod('POST') && $form->isSubmitted() && $form->isValid()) {
$newResource = $form->getData();
$event = $this->eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $newResource);
if ($event->isStopped() && !$configuration->isHtmlRequest()) {
throw new HttpException($event->getErrorCode(), $event->getMessage());
}
if ($event->isStopped()) {
$this->flashHelper->addFlashFromEvent($configuration, $event);
$eventResponse = $event->getResponse();
if (null !== $eventResponse) {
return $eventResponse;
}
return $this->redirectHandler->redirectToIndex($configuration, $newResource);
}
if ($configuration->hasStateMachine()) {
$stateMachine = $this->getStateMachine();
$stateMachine->apply($configuration, $newResource);
}
$this->repository->add($newResource);
if ($configuration->isHtmlRequest()) {
$this->flashHelper->addSuccessFlash($configuration, ResourceActions::CREATE, $newResource);
}
$postEvent = $this->eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $newResource);
if (!$configuration->isHtmlRequest()) {
return $this->createRestView($configuration, $newResource, Response::HTTP_CREATED);
}
$postEventResponse = $postEvent->getResponse();
if (null !== $postEventResponse) {
return $postEventResponse;
}
// saveAndLet check, redirect to referer
if ($form->getClickedButton() && 'saveAndLet' === $form->getClickedButton()->getName()) {
if($parameters->get('redirectLet')){
return $this->redirectHandler->redirectToRoute($configuration, $parameters->get('redirectLet'), ['id'=> $newResource->getId()]);
}
}
if ($form->getClickedButton() && 'saveAndRedirect' === $form->getClickedButton()->getName()) {
if($parameters->get('redirectAditional')){
return $this->redirectHandler->redirectToRoute($configuration, $parameters->get('redirectAditional'), ['id'=> $newResource->getId()]);
}
}
return $this->redirectHandler->redirectToResource($configuration, $newResource);
}
if ($request->isMethod('POST') && $form->isSubmitted() && !$form->isValid()) {
$responseCode = Response::HTTP_UNPROCESSABLE_ENTITY;
}
if (!$configuration->isHtmlRequest()) {
return $this->createRestView($configuration, $form, Response::HTTP_BAD_REQUEST);
}
$initializeEvent = $this->eventDispatcher->dispatchInitializeEvent(ResourceActions::CREATE, $configuration, $newResource);
$initializeEventResponse = $initializeEvent->getResponse();
if (null !== $initializeEventResponse) {
return $initializeEventResponse;
}
return $this->render($configuration->getTemplate(ResourceActions::CREATE . '.html'), [
'configuration' => $configuration,
'metadata' => $this->metadata,
'resource' => $newResource,
$this->metadata->getName() => $newResource,
'form' => $form->createView(),
], null, $responseCode ?? Response::HTTP_OK);
}
public function updateAction(Request $request): Response
{
$configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
$this->isGrantedOr403($configuration, ResourceActions::UPDATE);
$resource = $this->findOr404($configuration);
$form = $this->resourceFormFactory->create($configuration, $resource);
// add button and redirectLet exists
$parameters = $configuration->getParameters();
if(!$form->isSubmitted() && $parameters->get('redirectLet')){
$form->add('saveAndLet', SubmitType::class, ['label' => 'Guardar y Permanecer']);
}
if(!$form->isSubmitted() && $parameters->get('redirectAditional')){
$form->add('saveAndRedirect', SubmitType::class, ['label' => 'Guardar y Redirigir']);
}
$form->handleRequest($request);
if (
in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true) &&
$form->isSubmitted() &&
$form->isValid()
) {
$resource = $form->getData();
/** @var ResourceControllerEvent $event */
$event = $this->eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource);
if ($event->isStopped() && !$configuration->isHtmlRequest()) {
throw new HttpException($event->getErrorCode(), $event->getMessage());
}
if ($event->isStopped()) {
$this->flashHelper->addFlashFromEvent($configuration, $event);
$eventResponse = $event->getResponse();
if (null !== $eventResponse) {
return $eventResponse;
}
return $this->redirectHandler->redirectToResource($configuration, $resource);
}
try {
$this->resourceUpdateHandler->handle($resource, $configuration, $this->manager);
} catch (UpdateHandlingException $exception) {
if (!$configuration->isHtmlRequest()) {
return $this->createRestView($configuration, $form, $exception->getApiResponseCode());
}
$this->flashHelper->addErrorFlash($configuration, $exception->getFlash());
return $this->redirectHandler->redirectToReferer($configuration);
}
if ($configuration->isHtmlRequest()) {
$this->flashHelper->addSuccessFlash($configuration, ResourceActions::UPDATE, $resource);
}
$postEvent = $this->eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource);
if (!$configuration->isHtmlRequest()) {
if ($configuration->getParameters()->get('return_content', false)) {
return $this->createRestView($configuration, $resource, Response::HTTP_OK);
}
return $this->createRestView($configuration, null, Response::HTTP_NO_CONTENT);
}
$postEventResponse = $postEvent->getResponse();
if (null !== $postEventResponse) {
return $postEventResponse;
}
// saveAndLet check, redirect to referer
if ($form->getClickedButton() && 'saveAndLet' === $form->getClickedButton()->getName()) {
if($parameters->get('redirectLet')){
return $this->redirectHandler->redirectToRoute($configuration, $parameters->get('redirectLet'), ['id'=> $resource->getId()]);
}
}
if ($form->getClickedButton() && 'saveAndRedirect' === $form->getClickedButton()->getName()) {
if($parameters->get('redirectAditional')){
return $this->redirectHandler->redirectToRoute($configuration, $parameters->get('redirectAditional'), ['id'=> $resource->getId()]);
}
}
return $this->redirectHandler->redirectToResource($configuration, $resource);
}
if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true) && $form->isSubmitted() && !$form->isValid()) {
$responseCode = Response::HTTP_UNPROCESSABLE_ENTITY;
}
if (!$configuration->isHtmlRequest()) {
return $this->createRestView($configuration, $form, Response::HTTP_BAD_REQUEST);
}
$initializeEvent = $this->eventDispatcher->dispatchInitializeEvent(ResourceActions::UPDATE, $configuration, $resource);
$initializeEventResponse = $initializeEvent->getResponse();
if (null !== $initializeEventResponse) {
return $initializeEventResponse;
}
return $this->render($configuration->getTemplate(ResourceActions::UPDATE . '.html'), [
'configuration' => $configuration,
'metadata' => $this->metadata,
'resource' => $resource,
$this->metadata->getName() => $resource,
'form' => $form->createView(),
], null, $responseCode ?? Response::HTTP_OK);
}
public function cleanSessionDataAction(Request $request): Response
{
$session = $request->getSession();
$cleanIframeTargetSessionData = $request->get('cleanIframeTargetSessionData', false);
if($cleanIframeTargetSessionData){
$session->remove("iframeTargetSessionData");
}
return new JsonResponse([
'cleanSessionData' => true,
]
);
}
}