[wip] add actions to crud

This commit is contained in:
2019-12-11 16:08:16 +01:00
parent d6354da24e
commit 199930d23a
16 changed files with 265 additions and 37 deletions

View File

@@ -31,6 +31,7 @@ use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
use Symfony\Component\Security\Core\Role\Role;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Chill\MainBundle\CRUD\Resolver\Resolver;
/**
*
@@ -161,7 +162,8 @@ class CRUDController extends AbstractController
}
$defaultTemplateParameters = [
'entity' => $entity
'entity' => $entity,
'crud_name' => $this->getCrudName()
];
return $this->render(
@@ -193,17 +195,15 @@ class CRUDController extends AbstractController
$em->flush();
$this->onPostFlush($action, $entity, $form, $request);
$this->addFlash('succes', $this->generateFormSuccessMessage($action, $entity));
$this->addFlash('success', $this->generateFormSuccessMessage($action, $entity));
$result = $this->onBeforeRedirect($action, $entity, $form, $request);
$result = $this->onBeforeRedirectAfterSubmission($action, $entity, $form, $request);
if ($result instanceof Response) {
return $result;
}
return $this->redirectToRoute('chill_crud_'.$this->getCrudName().'_index', [
'id' => $entity->getId()
]);
return $this->redirectToRoute('chill_crud_'.$this->getCrudName().'_index');
} elseif ($form->isSubmitted()) {
$this->addFlash('error', $this->generateFormErrorMessage($action, $form));
@@ -223,7 +223,11 @@ class CRUDController extends AbstractController
protected function formCreateAction($action, Request $request, $formClass = null): Response
{
$entity = $this->createEntity($action, $request);
if ($request->query->has('duplicate')) {
$entity = $this->duplicateEntity($action, $request);
} else {
$entity = $this->createEntity($action, $request);
}
$this->checkACL($action, $entity);
@@ -243,9 +247,9 @@ class CRUDController extends AbstractController
$em->flush();
$this->onPostFlush($action, $entity, $form, $request);
$this->getPaginatorFactory();
$this->addFlash('succes', $this->generateFormSuccessMessage($action, $entity));
$this->addFlash('success', $this->generateFormSuccessMessage($action, $entity));
$result = $this->onBeforeRedirect($action, $entity, $form, $request);
$result = $this->onBeforeRedirectAfterSubmission($action, $entity, $form, $request);
if ($result instanceof Response) {
return $result;
@@ -280,9 +284,17 @@ class CRUDController extends AbstractController
return $this->getDoctrine()
->getRepository($this->getEntityClass())
->find($id);
}
protected function duplicateEntity(string $action, Request $request)
{
$id = $request->query->get('duplicate_id', 0);
$originalEntity = $this->getEntity($action, $id, $request);
$this->getDoctrine()->getManager()
->detach($originalEntity);
return $originalEntity;
}
protected function getEntityClass(): string
@@ -311,14 +323,7 @@ class CRUDController extends AbstractController
protected function buildDefaultRole($action)
{
if (empty($this->crudConfig['base_role'])) {
throw new \LogicException(sprintf("the base role is not defined. You must define "
. "on or override %s or %s methods", __METHOD__, "getRoleFor"));
}
return \strtoupper(
$this->crudConfig['base_role'].
'_'.
return $this->getCrudResolver()->buildDefaultRole($this->getCrudName(),
$action);
}
@@ -334,21 +339,19 @@ class CRUDController extends AbstractController
$form = $this->createForm($formClass, $entity, $formOptions);
$this->addDefaultButtons($action, $form);
$this->customizeForm($action, $form);
return $form;
}
protected function addDefaultButtons($action, FormInterface $form)
protected function customizeForm($action, FormInterface $form)
{
$form->add('submit', SubmitType::class, [
'label' => $this->generateLabelForButton($action, 'submit', $form)
]);
}
protected function generateLabelForButton($action, $formName, $form)
{
return $action;
return sprintf("crud.%s.button_action_form", $action);
}
protected function generateFormErrorMessage($action, FormInterface $form): string
@@ -362,13 +365,13 @@ class CRUDController extends AbstractController
{
switch ($action) {
case 'edit':
$msg = "The data have been successfully updated";
$msg = "crud.edit.success";
break;
case 'new':
$msg = "The date have been successfully created";
$msg = "crud.new.success";
break;
default:
$msg = "Your request has been successfully executed";
$msg = "crud.default.success";
}
return $this->getTranslator()->trans($msg);
@@ -403,6 +406,8 @@ class CRUDController extends AbstractController
return '@ChillMain/CRUD/edit.html.twig';
case 'index':
return '@ChillMain/CRUD/index.html.twig';
case 'view':
return '@ChillMain/CRUD/view.html.twig';
default:
throw new \LogicException("the view for action $action is not "
. "defined. You should override ".__METHOD__." to add this "
@@ -445,8 +450,20 @@ class CRUDController extends AbstractController
{
}
protected function onBeforeRedirect(string $action, $entity, FormInterface $form, Request $request)
protected function onBeforeRedirectAfterSubmission(string $action, $entity, FormInterface $form, Request $request)
{
$next = $request->request->get("submit", "save-and-close");
switch ($next) {
case "save-and-close":
return $this->redirectToRoute('chill_crud_'.$this->getCrudName().'_index');
case "save-and-new":
return $this->redirectToRoute('chill_crud_'.$this->getCrudName().'_new');
default:
return $this->redirectToRoute('chill_crud_'.$this->getCrudName().'_view', [
'id' => $entity->getId()
]);
}
}
protected function getActionConfig(string $action)
@@ -481,6 +498,11 @@ class CRUDController extends AbstractController
return $this->get(EventDispatcherInterface::class);
}
protected function getCrudResolver(): Resolver
{
return $this->get(Resolver::class);
}
public static function getSubscribedServices()
{
return \array_merge(
@@ -490,6 +512,7 @@ class CRUDController extends AbstractController
'translator' => TranslatorInterface::class,
AuthorizationHelper::class => AuthorizationHelper::class,
EventDispatcherInterface::class => EventDispatcherInterface::class,
Resolver::class => Resolver::class,
]
);
}

View File

@@ -41,10 +41,35 @@ class Resolver
*/
protected $propertyAccess;
function __construct(EntityManagerInterface $em)
/**
*
* @var array
*/
protected $crudConfig;
/**
* @deprecated
*/
const ROLE_VIEW = 'role.view';
/**
* @deprecated
*/
const ROLE_EDIT = 'role.edit';
/**
* The key to get the role necessary for the action
*/
const ROLE = 'role';
function __construct(EntityManagerInterface $em, array $crudConfig)
{
$this->em = $em;
foreach($crudConfig as $conf) {
$this->crudConfig[$conf['name']] = $conf;
}
$this->buildPropertyAccess();
}
@@ -69,13 +94,37 @@ class Resolver
return $this->propertyAccess->getValue($entity, $path);
}
public function getConfigValue($key, $crudName, $action = null)
{
$config = $this->crudConfig[$crudName];
switch ($key) {
case self::ROLE:
dump($config);
return $config['actions'][$action]['role'] ?? $this->buildDefaultRole($crudName, $action);
}
}
public function buildDefaultRole($crudName, $action)
{
if (empty($this->crudConfig[$crudName]['base_role'])) {
throw new \LogicException(sprintf("the base role is not defined. You must define "
. "on or override %s or %s methods", __METHOD__, "getRoleFor"));
}
return \strtoupper(
$this->crudConfig[$crudName]['base_role'].
'_'.
$action);
}
public function getTwigTemplate($entity, $path): string
{
list($focusEntity, $subPath) = $this->getFocusedEntity($entity, $path);
$classMetadata = $this->em->getClassMetadata(\get_class($focusEntity));
$type = $classMetadata->getTypeOfField($subPath);
dump($type);
switch ($type) {
default:

View File

@@ -22,6 +22,7 @@ namespace Chill\MainBundle\CRUD\Templating;
use Chill\MainBundle\CRUD\Resolver\Resolver;
use Twig\TwigFilter;
use Twig\TwigFunction;
use Twig\Extension\AbstractExtension;
use Twig\Environment;
@@ -50,6 +51,14 @@ class TwigCRUDResolver extends AbstractExtension
];
}
public function getFunctions()
{
return [
new TwigFunction('chill_crud_config', [$this, 'getConfig'],
['is_safe' => 'html'])
];
}
public function display(Environment $env, $entity, $path): string
{
$data = $this->resolver->getData($entity, $path);
@@ -57,5 +66,10 @@ class TwigCRUDResolver extends AbstractExtension
return $env->render($template, ['data' => $data, 'entity' => $entity, ]);
}
public function getConfig($configKey, $crudName, $action = null)
{
return $this->resolver->getConfigValue($configKey, $crudName, $action);
}
}