From 577cd04ebe2d4542e0e3af386f6b8fa5de84f014 Mon Sep 17 00:00:00 2001 From: Lars Vierbergen Date: Sat, 23 Jun 2018 15:47:37 +0200 Subject: [PATCH] Add search form for users that have/have not accepted tos --- EventListener/TosListener.php | 71 ++++++++++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 9 deletions(-) diff --git a/EventListener/TosListener.php b/EventListener/TosListener.php index 8715d1f..3b844b7 100644 --- a/EventListener/TosListener.php +++ b/EventListener/TosListener.php @@ -1,21 +1,23 @@ [ 'onBuildForm', -200 @@ -56,6 +58,22 @@ class TosListener implements EventSubscriberInterface ], KernelEvents::REQUEST => 'onKernelRequest' ]; + + if (class_exists(AdminEvents::class) && defined(AdminEvents::class . '::FILTER_LIST')) { + $handlers[AdminEvents::FILTER_LIST] = [ + [ + 'onFilterListCreateForm', + 10 + ], + [ + 'onFilterListFilter', + -10 + ] + + ]; + } + + return $handlers; } public function __construct($terms, $tosVersion, EntityManagerInterface $em, TokenStorageInterface $tokenStorage, UrlGeneratorInterface $urlGenerator) @@ -119,4 +137,39 @@ class TosListener implements EventSubscriberInterface $event->setResponse($response); } } + + public function onFilterListCreateForm(FilterListEvent $event) + { + $event->getSearchFormBuilder()->add('tos_accepted', ChoiceType::class, [ + 'choices' => [ + 'Yes' => '1', + 'No' => '0' + ], + 'expanded' => true, + 'required' => false + ]); + } + + public function onFilterListFilter(FilterListEvent $event) + { + $field = $event->getSearchForm()->get('tos_accepted'); + if ($field->isEmpty() || $field->getData() === null) + return; + $toses = $this->em->createQueryBuilder() + ->select('t') + ->from(UserTos::class, 't') + ->where('t.acceptedVersion >= :currentVersion') + ->setParameter('currentVersion', $this->tosVersion) + ->groupBy('t.user') + ->getQuery() + ->getArrayResult(); + + $userIds = array_map(function ($tos) { + return $tos['user_id']; + }, $toses); + + $expr = $field->getData() === "1" ? Criteria::expr()->in('id', $userIds) : Criteria::expr()->notIn('id', $userIds); + + $event->addFilter('tos_accepted', $expr); + } } \ No newline at end of file