From 4a1585334c34aa8e6d0347f31bd5e4c598f85436 Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Wed, 6 Oct 2021 14:41:59 +0200 Subject: [PATCH] add filter in page --- core/Form/Site/Page/Filter/PageFilterType.php | 14 +++++++++ .../Site/Page/PageRepositoryQuery.php | 31 +++++++++++++++++-- core/Resources/translations/messages.fr.yaml | 1 + 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/core/Form/Site/Page/Filter/PageFilterType.php b/core/Form/Site/Page/Filter/PageFilterType.php index 3a95281..0aee47f 100644 --- a/core/Form/Site/Page/Filter/PageFilterType.php +++ b/core/Form/Site/Page/Filter/PageFilterType.php @@ -9,6 +9,7 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; +use Symfony\Component\Form\Extension\Core\Type\ChoiceType; class PageFilterType extends AbstractType { @@ -47,6 +48,19 @@ class PageFilterType extends AbstractType ], ] ); + + $builder->add( + 'isAssociated', + ChoiceType::class, + [ + 'label' => 'Associated', + 'choices' => [ + 'Anyway' => -1, + 'No' => 0, + 'Yes' => 1, + ], + ] + ); } public function configureOptions(OptionsResolver $resolver) diff --git a/core/Repository/Site/Page/PageRepositoryQuery.php b/core/Repository/Site/Page/PageRepositoryQuery.php index efd9145..c22deef 100644 --- a/core/Repository/Site/Page/PageRepositoryQuery.php +++ b/core/Repository/Site/Page/PageRepositoryQuery.php @@ -16,9 +16,11 @@ class PageRepositoryQuery extends RepositoryQuery public function __construct(PageRepository $repository, PaginatorInterface $paginator) { parent::__construct($repository, 'p', $paginator); + + $this->forcedFilterHandlers[] = 'isAssociated'; } - public function filterByNavigation(Navigation $navigation) + public function filterByNavigation(Navigation $navigation): self { return $this ->leftJoin('.nodes', 'node') @@ -29,7 +31,7 @@ class PageRepositoryQuery extends RepositoryQuery ; } - public function filterById($id) + public function filterById($id): self { $this ->where('.id = :id') @@ -39,12 +41,37 @@ class PageRepositoryQuery extends RepositoryQuery return $this; } + protected function withAssociation(bool $isAssociated): self + { + $entities = $this->create()->find(); + $ids = []; + + foreach ($entities as $entity) { + if ($isAssociated && !$entity->getNodes()->isEmpty()) { + $ids[] = $entity->getId(); + } elseif (!$isAssociated && $entity->getNodes()->isEmpty()) { + $ids[] = $entity->getId(); + } + } + + $this + ->andWhere('.id IN (:ids)') + ->setParameter(':ids', $ids) + ; + + return $this; + } + protected function filterHandler(string $name, $value) { if ('navigation' === $name) { return $this->filterByNavigation($value); } + if ('isAssociated' === $name && $value > -1) { + $this->withAssociation((bool) $value); + } + return parent::filterHandler($name, $value); } } diff --git a/core/Resources/translations/messages.fr.yaml b/core/Resources/translations/messages.fr.yaml index 6127630..780f9e3 100644 --- a/core/Resources/translations/messages.fr.yaml +++ b/core/Resources/translations/messages.fr.yaml @@ -191,3 +191,4 @@ "Insert": "Insérer" "Attributes": "Attributs" "Choose": "Choisir" +"Associated": "Associé(e)"