create index action for CRUD

This commit is contained in:
2020-03-12 12:13:41 +01:00
parent 7a952d6f88
commit ba742dd7be
6 changed files with 109 additions and 77 deletions

View File

@@ -32,6 +32,7 @@ use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
use Symfony\Component\Security\Core\Role\Role;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Chill\MainBundle\CRUD\Resolver\Resolver;
use Chill\MainBundle\Pagination\PaginatorInterface;
/**
*
@@ -39,12 +40,6 @@ use Chill\MainBundle\CRUD\Resolver\Resolver;
*/
class CRUDController extends AbstractController
{
/**
*
* @var PaginatorFactory
*/
protected $paginatorFactory;
/**
* The crud configuration
*
@@ -59,13 +54,10 @@ class CRUDController extends AbstractController
$this->crudConfig = $config;
}
protected function getDefaultOrdering(): array
{
return $this->orderingOptions();
}
protected function processTemplateParameters($action): array
{
throw new Exception('is this method used ?');
$configured = $this->getTemplateParameters($action);
switch($action) {
@@ -89,43 +81,57 @@ class CRUDController extends AbstractController
return $result;
}
protected function orderQuery(QueryBuilder $query, Request $request): QueryBuilder
protected function orderQuery($action, QueryBuilder $query, Request $request, PaginatorInterface $paginator): QueryBuilder
{
$defaultOrdering = $this->getDefaultOrdering();
foreach ($defaultOrdering as $sort => $order) {
$query->addOrderBy('e.'.$sort, $order);
}
return $query;
}
public function index(Request $request)
{
$totalItems = $this->getDoctrine()->getManager()
->createQuery("SELECT COUNT(e) FROM ".$this->getEntity()." e")
->getSingleScalarResult()
;
$query = $this->getDoctrine()->getManager()
->createQueryBuilder()
->select('e')
->from($this->getEntity(), 'e');
$this->orderQuery($query, $request);
$paginator = $this->paginatorFactory->create($totalItems);
$query->setFirstResult($paginator->getCurrentPage()->getFirstItemNumber())
->setMaxResults($paginator->getItemsPerPage())
;
return $this->indexEntityAction('index', $request);
}
protected function indexEntityAction($action, Request $request)
{
$totalItems = $this->countEntities($action, $request);
$paginator = $this->getPaginatorFactory()->create($totalItems);
$query = $this->queryEntities($action, $request, $paginator);
$entities = $query->getQuery()->getResult();
return $this->render($this->getTemplate('index'), \array_merge([
'entities' => $entities,
], $this->processTemplateParameters('index'))
);
$defaultTemplateParameters = [
'entities' => $entities,
'crud_name' => $this->getCrudName(),
'paginator' => $paginator
];
return $this->render(
$this->getTemplateFor($action, $entities, $request),
$this->generateTemplateParameter($action, $entities, $request, $defaultTemplateParameters)
);
}
protected function queryEntities($action, Request $request, PaginatorInterface $paginator)
{
$query = $this->getDoctrine()->getManager()
->createQueryBuilder()
->select('e')
->from($this->getEntityClass(), 'e')
->setFirstResult($paginator->getCurrentPage()->getFirstItemNumber())
->setMaxResults($paginator->getItemsPerPage())
;
$this->orderQuery($action, $query, $request, $paginator);
return $query;
}
protected function countEntities($action, Request $request)
{
return $this->getDoctrine()->getManager()
->createQuery("SELECT COUNT(e) FROM ".$this->getEntityClass()." e")
->getSingleScalarResult()
;
}
public function edit(Request $request, $id): Response
@@ -393,6 +399,14 @@ class CRUDController extends AbstractController
return new $type;
}
/**
*
* @param string $action
* @param mixed $entity the entity for the current request, or an array of entities
* @param Request $request
* @return string
* @throws \LogicException
*/
protected function getTemplateFor($action, $entity, Request $request)
{
if ($this->hasCustomTemplate($action, $entity, $request)) {