From b402eabeb9ed1313943261a3ed3a018c04b5f28c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 5 Dec 2019 22:54:52 +0100 Subject: [PATCH] default crud new function --- CRUD/Controller/CRUDController.php | 41 ++++++++++++++++----- CRUD/Routing/CRUDRoutesLoader.php | 7 +++- DependencyInjection/Configuration.php | 8 +++- Resources/views/CRUD/_new_content.html.twig | 30 +++++++++++++++ Resources/views/CRUD/_new_title.html.twig | 1 + Resources/views/CRUD/new.html.twig | 10 +++++ 6 files changed, 83 insertions(+), 14 deletions(-) create mode 100644 Resources/views/CRUD/_new_content.html.twig create mode 100644 Resources/views/CRUD/_new_title.html.twig create mode 100644 Resources/views/CRUD/new.html.twig diff --git a/CRUD/Controller/CRUDController.php b/CRUD/Controller/CRUDController.php index 8df566f0d..85bf34493 100644 --- a/CRUD/Controller/CRUDController.php +++ b/CRUD/Controller/CRUDController.php @@ -132,6 +132,11 @@ class CRUDController extends AbstractController return $this->formEditAction('edit', $request, $id); } + public function new(Request $request): Response + { + return $this->formCreateAction('new', $request); + } + public function view(Request $request, $id): Response { return $this->viewAction('view', $request, $id); @@ -218,7 +223,7 @@ class CRUDController extends AbstractController protected function formCreateAction($action, Request $request, $formClass = null): Response { - $entity = $this->createEntity($request); + $entity = $this->createEntity($action, $request); $this->checkACL($action, $entity); @@ -240,13 +245,13 @@ class CRUDController extends AbstractController $this->getPaginatorFactory(); $this->addFlash('succes', $this->generateFormSuccessMessage($action, $entity)); - $result = $this->onBeforRedirect($action, $entity, $form, $request); + $result = $this->onBeforeRedirect($action, $entity, $form, $request); if ($result instanceof Response) { return $result; } - return $this->redirectToRoute('chill_crud_'.$this->get, ['id' => $entity->getId()]); + return $this->redirectToRoute('chill_crud_'.$this->getCrudName().'_view', ['id' => $entity->getId()]); } elseif ($form->isSubmitted()) { $this->addFlash('error', $this->generateFormErrorMessage($action, $form)); @@ -254,11 +259,12 @@ class CRUDController extends AbstractController $defaultTemplateParameters = [ 'form' => $form->createView(), - 'entity' => $entity + 'entity' => $entity, + 'crud_name' => $this->getCrudName() ]; return $this->render( - $this->getTemplateFor($action), + $this->getTemplateFor($action, $entity, $request), $this->generateTemplateParameter($action, $entity, $request, $defaultTemplateParameters) ); } @@ -289,13 +295,17 @@ class CRUDController extends AbstractController return $this->crudConfig['name']; } - protected function checkACL($entity, $action) + protected function checkACL($action, $entity) { $this->denyAccessUnlessGranted($this->getRoleFor($action), $entity); } protected function getRoleFor($action) { + if (NULL !== ($this->getActionConfig($action)['role'])) { + return $this->getActionConfig($action)['role']; + } + return $this->buildDefaultRole($action); } @@ -373,16 +383,17 @@ class CRUDController extends AbstractController return $defaultTemplateParameters; } - protected function createEntity(Request $request): object + protected function createEntity($action, Request $request): object { $type = $this->getEntityClass(); - return new $type; + + return new $type; } protected function getTemplateFor($action, $entity, Request $request) { - if (!empty($this->crudConfig[$action]['template'])) { - return $this->crudConfig[$action]['template']; + if ($this->hasCustomTemplate($action, $entity, $request)) { + return $this->getActionConfig($action)['template']; } switch ($action) { @@ -399,6 +410,11 @@ class CRUDController extends AbstractController } } + protected function hasCustomTemplate($action, $entity, Request $request): bool + { + return !empty($this->getActionConfig($action)['template']); + } + protected function onPreFlush(string $action, $entity, FormInterface $form, Request $request) { } @@ -432,6 +448,11 @@ class CRUDController extends AbstractController protected function onBeforeRedirect(string $action, $entity, FormInterface $form, Request $request) { } + + protected function getActionConfig(string $action) + { + return $this->crudConfig['actions'][$action]; + } protected function getPaginatorFactory(): PaginatorFactory { diff --git a/CRUD/Routing/CRUDRoutesLoader.php b/CRUD/Routing/CRUDRoutesLoader.php index 3ff7959d3..6ead91a5e 100644 --- a/CRUD/Routing/CRUDRoutesLoader.php +++ b/CRUD/Routing/CRUDRoutesLoader.php @@ -67,10 +67,13 @@ class CRUDRoutesLoader $defaults = [ '_controller' => $action['controller'] ?? $config['controller'].'::'.$name ]; - - if ($action === 'index') { + + if ($name === 'index') { $path = "{_locale}".$config['base_path']; $route = new Route($path, $defaults); + } elseif ($name === 'new') { + $path = "{_locale}".$config['base_path'].'/'.$name; + $route = new Route($path, $defaults); } else { $path = "{_locale}".$config['base_path'].($action['path'] ?? '/{id}/'.$name); $requirements = $action['requirements'] ?? [ diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 1e4d410ce..bb15f3b42 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -135,12 +135,12 @@ class Configuration implements ConfigurationInterface ->arrayPrototype() ->children() ->scalarNode('controller') - ->defaultValue('') + ->defaultNull() ->info('the method name to call in the route. Will be set to the action name if left empty.') ->example("'MyBundle\Controller\MyCrudController::action'") ->end() ->scalarNode('path') - ->defaultValue('') + ->defaultNull() ->info('the path that will be **appended** after the base path. Do not forget to add ' . 'arguments for the method. Will be set to the action name, including an `{id}` ' . 'parameter if left empty.') @@ -150,6 +150,10 @@ class Configuration implements ConfigurationInterface ->ignoreExtraKeys(false) ->info('the requirements for the route. Will be set to `[ \'id\' => \'\d+\' ]` if left empty.') ->end() + ->scalarNode('role') + ->defaultNull() + ->info('the role that will be required for this action. Override option `base_role`') + ->end() ->end() ->end() ->end() diff --git a/Resources/views/CRUD/_new_content.html.twig b/Resources/views/CRUD/_new_content.html.twig new file mode 100644 index 000000000..c01969e24 --- /dev/null +++ b/Resources/views/CRUD/_new_content.html.twig @@ -0,0 +1,30 @@ +
+ {% block crud_content_header %} +

{{ 'crud.%crud_name%.title_new'|trans({'%crud_name%' : crud_name }) }}

+ {% endblock crud_content_header %} + + {% block crud_content_form %} + {{ form_start(form) }} + + {% block crud_content_form_rows %} + {% for f in form if f.vars.name != 'submit' %} + {{ form_row(f) }} + {% endfor %} + {% endblock crud_content_form_rows %} + + {% block crud_content_form_actions %} + + {% endblock %} + + {{ form_end(form) }} + {% endblock %} +
diff --git a/Resources/views/CRUD/_new_title.html.twig b/Resources/views/CRUD/_new_title.html.twig new file mode 100644 index 000000000..60c581122 --- /dev/null +++ b/Resources/views/CRUD/_new_title.html.twig @@ -0,0 +1 @@ +{{ 'crud.%crud_name%.title_new'|trans({'%crud_name%' : crud_name }) }} \ No newline at end of file diff --git a/Resources/views/CRUD/new.html.twig b/Resources/views/CRUD/new.html.twig new file mode 100644 index 000000000..61b5d0b16 --- /dev/null +++ b/Resources/views/CRUD/new.html.twig @@ -0,0 +1,10 @@ +{% extends '@ChillMain/layout.html.twig' %} + +{% block title %} +{% include('@ChillMain/CRUD/_new_title.html.twig') %} +{% endblock %} + +{% block content %} +{% embed '@ChillMain/CRUD/_new_content.html.twig' %} +{% endembed %} +{% endblock %}