ctrl-f5/ctrl-rad-bundle

View on GitHub
Crud/Action/EditAction.php

Summary

Maintainability
B
6 hrs
Test Coverage
<?php

namespace Ctrl\RadBundle\Crud\Action;

use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\OptionsResolver\OptionsResolver;

class EditAction extends AbstractAction
{
    const SAVE_SUCCESS_RELOAD   = 'reload';
    const SAVE_SUCCESS_REDIRECT = 'redirect';

    public function execute(Request $request, $id = null, array $context = array())
    {
        $options = $this->config->getOptions();
        $routes = $this->config->getRoutes();
        $config = $options['action_config'];

        if ((!$id && $routes['create'] === false) || ($id && $routes['edit'] === false)) {
            throw new NotFoundHttpException('CRUD route disabled');
        }

        /** @var FormInterface $form */
        $form                   = $config['form'];
        $entity                 = $config['entity'];
        $context['is_create']   = false;
        $context['route']       = array(
            'route'     => $request->get('_route'),
            'params'    => $request->get('_route_params'),
        );

        if ($id) {
            $entity = $this->getEntityService()->getFinder()->firstOrNull()->find(array('id' => $id));
            if (!$entity) {
                $this->session->getFlashBag()->add('error', sprintf('%s not found', $options['entity_label']));
                return new RedirectResponse($this->router->generate($routes['index']));
            }
            $context['is_create'] = true;
        }

        if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
            $entity = $form->getData();

            if (isset($config['pre_persist'])) {
                $result = call_user_func_array($options['pre_persist'], array($entity, $context));
                if ($result instanceof Response) return $result;
            }

            $this->getEntityService()->persist($entity);

            if (isset($config['post_persist'])) {
                $result = call_user_func_array($config['post_persist'], array($entity, $context));
                if ($result instanceof Response) return $result;
            }
            $context['route']['params']['id'] = $entity->getId();

            if ($config['save_success_redirect']) {
                return new RedirectResponse($this->router->generate(
                    $routes['index']
                ));
            }

            return new RedirectResponse($this->router->generate(
                $context['route']['route'],
                $context['route']['params']
            ));
        }

        $viewVars = array_merge(array(
            'entity'        => $entity,
            'form'          => $form->createView(),
            'config'        => $this->config,
            'options'       => $this->config->getOptions(),
            'routes'        => $routes,
            'action'        => $config,
        ), $options['view_vars']);

        return $this->templating->renderResponse($config['template'], $viewVars);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        parent::configureOptions($resolver);

        $resolver->setRequired([
            'template'
        ]);

        $resolver->setDefaults([
            'template'                  => 'CtrlRadBundle:crud:edit.html.twig',
            'template_form_elements'    => 'CtrlRadBundle:partial:_form_elements.html.twig',
            'template_form_buttons'     => 'CtrlRadBundle:partial:_form_buttons.html.twig',
            'save_success_redirect'     => self::SAVE_SUCCESS_REDIRECT,
            'post_persist'              => null,
            'pre_persist'               => null,
            'entity'                    => null,
            'entity_id'                 => null,
        ]);
        $resolver->setRequired([
            'form'
        ]);
    }
}