add filters in page crud
This commit is contained in:
parent
ccfc562ead
commit
c09e526324
|
@ -6,6 +6,7 @@ use App\Core\Controller\Admin\AdminController;
|
|||
use App\Core\Entity\Site\Page\Page as Entity;
|
||||
use App\Core\Factory\Site\Page\PageFactory as EntityFactory;
|
||||
use App\Core\Form\Site\Page\PageType as EntityType;
|
||||
use App\Core\Form\Site\Page\Filter\PageFilterType as FilterType;
|
||||
use App\Core\Manager\EntityManager;
|
||||
use App\Core\Page\FooPage;
|
||||
use App\Core\Page\SimplePage;
|
||||
|
@ -14,6 +15,7 @@ use App\Core\Site\PageLocator;
|
|||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\Routing\Annotation\Route;
|
||||
use Symfony\Component\HttpFoundation\Session\Session;
|
||||
|
||||
/**
|
||||
* @Route("/admin/site/page")
|
||||
|
@ -23,12 +25,17 @@ class PageAdminController extends AdminController
|
|||
/**
|
||||
* @Route("/{page}", name="admin_site_page_index", requirements={"page": "\d+"})
|
||||
*/
|
||||
public function index(int $page = 1, RepositoryQuery $query, Request $request): Response
|
||||
public function index(int $page = 1, RepositoryQuery $query, Request $request, Session $session): Response
|
||||
{
|
||||
$pager = $query->paginate($page);
|
||||
$this->updateFilters($request, $session);
|
||||
|
||||
$pager = $query
|
||||
->useFilters($this->filters)
|
||||
->paginate($page);
|
||||
|
||||
return $this->render('@Core/site/page_admin/index.html.twig', [
|
||||
'pager' => $pager,
|
||||
'hasFilters' => !empty($this->filters),
|
||||
]);
|
||||
}
|
||||
|
||||
|
@ -102,6 +109,45 @@ class PageAdminController extends AdminController
|
|||
return $this->redirectToRoute('admin_site_page_index');
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/filters", name="admin_site_page_filters")
|
||||
*/
|
||||
public function filters(Session $session): Response
|
||||
{
|
||||
$form = $this->createForm(FilterType::class);
|
||||
$form->submit($session->get('page_filter', []));
|
||||
|
||||
return $this->render('@Core/site/page_admin/filters.html.twig', [
|
||||
'form' => $form->createView(),
|
||||
]);
|
||||
}
|
||||
|
||||
protected function updateFilters(Request $request, Session $session)
|
||||
{
|
||||
if ($request->query->has('page_filter')) {
|
||||
$filters = $request->query->get('page_filter');
|
||||
|
||||
if ('0' === $filters) {
|
||||
$filters = [];
|
||||
}
|
||||
} elseif ($session->has('page_filter')) {
|
||||
$filters = $session->get('page_filter');
|
||||
} else {
|
||||
$filters = [];
|
||||
}
|
||||
|
||||
$form = $this->createForm(FilterType::class);
|
||||
$form->submit($filters);
|
||||
|
||||
if (empty($filters)) {
|
||||
$this->filters = $filters;
|
||||
$session->set('page_filter', $filters);
|
||||
} elseif ($form->isValid()) {
|
||||
$this->filters = $form->getData();
|
||||
$session->set('page_filter', $filters);
|
||||
}
|
||||
}
|
||||
|
||||
public function getSection(): string
|
||||
{
|
||||
return 'site_page';
|
||||
|
|
|
@ -25,8 +25,7 @@ class TreeAdminController extends AdminController
|
|||
|
||||
if ($session->has('site_tree_last_navigation')) {
|
||||
$navigation = $navigationQuery->create()
|
||||
->where('.id = :id')
|
||||
->setParameter(':id', (int) $session->get('site_tree_last_navigation'))
|
||||
->filterById((int) $session->get('site_tree_last_navigation'))
|
||||
->findOne()
|
||||
;
|
||||
}
|
||||
|
|
64
core/Form/Site/Page/Filter/PageFilterType.php
Normal file
64
core/Form/Site/Page/Filter/PageFilterType.php
Normal file
|
@ -0,0 +1,64 @@
|
|||
<?php
|
||||
|
||||
namespace App\Core\Form\Site\Page\Filter;
|
||||
|
||||
use App\Core\Entity\Site\Page\Page;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\FileType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
use Symfony\Component\Validator\Constraints\Image;
|
||||
use Symfony\Component\Validator\Constraints\NotBlank;
|
||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
||||
use App\Core\Entity\Site\Navigation;
|
||||
use Doctrine\ORM\EntityRepository;
|
||||
|
||||
class PageFilterType extends AbstractType
|
||||
{
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
{
|
||||
$builder->add(
|
||||
'name',
|
||||
TextType::class,
|
||||
[
|
||||
'label' => 'Name',
|
||||
'required' => false,
|
||||
'attr' => [
|
||||
],
|
||||
'constraints' => [
|
||||
],
|
||||
]
|
||||
);
|
||||
|
||||
$builder->add(
|
||||
'navigation',
|
||||
EntityType::class,
|
||||
[
|
||||
'label' => 'Naviation',
|
||||
'class' => Navigation::class,
|
||||
'choice_label' => 'label',
|
||||
'choice_value' => 'id',
|
||||
'required' => false,
|
||||
'attr' => [
|
||||
],
|
||||
'query_builder' => function (EntityRepository $repo) {
|
||||
return $repo->createQueryBuilder('n')
|
||||
->orderBy('n.label, n.domain', 'ASC')
|
||||
;
|
||||
},
|
||||
'constraints' => [
|
||||
],
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
{
|
||||
$resolver->setDefaults([
|
||||
'data_class' => null,
|
||||
'csrf_protection' => false,
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -17,6 +17,16 @@ class NavigationRepositoryQuery extends RepositoryQuery
|
|||
parent::__construct($repository, 'n', $paginator);
|
||||
}
|
||||
|
||||
public function filterById($id)
|
||||
{
|
||||
$this
|
||||
->where('.id = :id')
|
||||
->setParameter(':id', $id)
|
||||
;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function whereDomain($domain)
|
||||
{
|
||||
return $this
|
||||
|
|
|
@ -4,6 +4,7 @@ namespace App\Core\Repository\Site\Page;
|
|||
|
||||
use App\Core\Repository\RepositoryQuery;
|
||||
use Knp\Component\Pager\PaginatorInterface;
|
||||
use App\Core\Entity\Site\Navigation;
|
||||
|
||||
/**
|
||||
* class PageRepositoryQuery.
|
||||
|
@ -17,6 +18,25 @@ class PageRepositoryQuery extends RepositoryQuery
|
|||
parent::__construct($repository, 'p', $paginator);
|
||||
}
|
||||
|
||||
protected function filterHandler(string $name, $value)
|
||||
{
|
||||
if ($name === 'navigation') {
|
||||
return $this->filterByNavigation($value);
|
||||
} else {
|
||||
return parent::filterHandler($name, $value);
|
||||
}
|
||||
}
|
||||
|
||||
public function filterByNavigation(Navigation $navigation)
|
||||
{
|
||||
return $this
|
||||
->leftJoin('.nodes', 'node')
|
||||
->leftJoin('node.menu', 'menu')
|
||||
->leftJoin('menu.navigation', 'navigation')
|
||||
->where('navigation.id = :navigationId')
|
||||
->setParameter(':navigationId', $navigation->getId());
|
||||
}
|
||||
|
||||
public function filterById($id)
|
||||
{
|
||||
$this
|
||||
|
|
21
core/Resources/views/site/page_admin/filters.html.twig
Normal file
21
core/Resources/views/site/page_admin/filters.html.twig
Normal file
|
@ -0,0 +1,21 @@
|
|||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">
|
||||
{{ 'Filter'|trans }}
|
||||
</h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form action="{{ path('admin_site_page_index') }}" id="form-filters" method="GET">
|
||||
{{ form_widget(form) }}
|
||||
</form>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<a href="{{ path('admin_site_page_index', {page_filter: 0}) }}" class="btn btn-secondary">{{ 'Vider'|trans }}</a>
|
||||
<button type="submit" form="form-filters" class="btn btn-primary">{{ 'Filter'|trans }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -10,7 +10,16 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
{{ knp_pagination_render(pager) }}
|
||||
<div class="row">
|
||||
<div class="col-auto ml-auto {% if pager.getPaginationData.pageCount > 1 %}mr-3{% endif %}">
|
||||
<button data-modal="{{ path('admin_site_page_filters') }}" class="btn btn-sm btn-secondary">
|
||||
{{ 'Filter'|trans }} {% if hasFilters %}({{ 'Yes'|trans }}){% endif %}
|
||||
</button>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
{{ knp_pagination_render(pager) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="table-responsive">
|
||||
|
|
Loading…
Reference in a new issue