From efc6fe1a93ee41a983bfb7b0462bcb5a8b4b9ade Mon Sep 17 00:00:00 2001 From: Raphael Odini Date: Fri, 15 Dec 2023 14:59:38 +0100 Subject: [PATCH] Event widget: allow multiple filter by event kind --- .../views/event/_partial/widget.html.twig | 7 +++---- .../Controller/AdminEventController.php | 11 +++++++--- src/AppBundle/Controller/EventController.php | 21 ++++++++++--------- src/AppBundle/Repository/EventRepository.php | 8 +++---- 4 files changed, 26 insertions(+), 21 deletions(-) diff --git a/app/Resources/views/event/_partial/widget.html.twig b/app/Resources/views/event/_partial/widget.html.twig index 8f14611b1..246b78d91 100644 --- a/app/Resources/views/event/_partial/widget.html.twig +++ b/app/Resources/views/event/_partial/widget.html.twig @@ -3,9 +3,8 @@ {% block content %} {% if title %}

- liste des prochains événements - {% if eventKind %}{{ eventKind.name }}{% endif %} - {% if maxDate %}(jusqu'au {{ maxDate | date_short }}){% endif %} + Liste des prochains événements + {% if date_max %}(jusqu'au {{ date_max | date_short }}){% endif %}

{% endif %} diff --git a/src/AppBundle/Controller/AdminEventController.php b/src/AppBundle/Controller/AdminEventController.php index 5229912f8..8ccecc173 100644 --- a/src/AppBundle/Controller/AdminEventController.php +++ b/src/AppBundle/Controller/AdminEventController.php @@ -431,7 +431,7 @@ public function widgetGeneratorAction(Request $request) 'label' => "Quel type d'événement ?", 'class' => 'AppBundle:EventKind', 'choice_label' => 'name', - 'multiple' => false, + 'multiple' => true, 'required' => false )) ->add('date_max', TextType::class, array( @@ -461,8 +461,13 @@ public function widgetGeneratorAction(Request $request) if ($form->handleRequest($request)->isValid()) { $data = $form->getData(); - - $widgetQueryString = 'event_kind_id=' . ($data['kind'] ? $data['kind']->getId() : '') . '&date_max=' . ($data['date_max'] ? $data['date_max'] : '') . '&limit=' . ($data['limit'] ? $data['limit'] : '') . '&title=' . ($data['title'] ? 1 : 0) . '&links=' . ($data['links'] ? 1 : 0); + $widgetQueryString = ''; + if ($data['kind']) { + foreach ($data['kind'] as $kind) { + $widgetQueryString .= 'event_kind_id[]=' . $kind->getId() . '&'; + } + } + $widgetQueryString .= 'date_max=' . ($data['date_max'] ? $data['date_max'] : '') . '&limit=' . ($data['limit'] ? $data['limit'] : '') . '&title=' . ($data['title'] ? 1 : 0) . '&links=' . ($data['links'] ? 1 : 0); return $this->render('admin/event/widget_generator.html.twig', array( 'form' => $form->createView(), diff --git a/src/AppBundle/Controller/EventController.php b/src/AppBundle/Controller/EventController.php index a1c1353ef..172eb31c6 100644 --- a/src/AppBundle/Controller/EventController.php +++ b/src/AppBundle/Controller/EventController.php @@ -33,31 +33,32 @@ public function widgetAction(Request $request) $em = $this->getDoctrine()->getManager(); $buckets = array(); - $eventKind = null; - $eventDateMax = null; + $filter_event_kind_id_list = null; + $filter_date_max_cleaned = null; $filter_title = $request->query->has('title') ? ($request->get('title') == 1) : false; $filter_links = $request->query->has('links') ? ($request->get('links') == 1) : false; $filter_date_max = $request->query->has('date_max') ? ($request->get('date_max') ? new DateTime($request->get('date_max')) : null) : null; if ($filter_date_max) { - $eventDateMax = clone($filter_date_max); - $eventDateMax->modify('+1 day'); // also return events happening on max date + $filter_date_max_cleaned = clone($filter_date_max); + $filter_date_max_cleaned->modify('+1 day'); // also return events happening on max date } $filter_limit = $request->query->has('limit') ? ($request->get('limit') ? $request->get('limit') : null) : null; - $filter_event_kind_id = $request->get('event_kind_id'); - if ($filter_event_kind_id) { - $eventKind = $em->getRepository('AppBundle:EventKind')->find($filter_event_kind_id); + $filter_event_kind_id_list = $request->get('event_kind_id'); // should be an array (or null) + if (is_string($filter_event_kind_id_list)) { // manage case if string (retro-compatibility) + $filter_event_kind_id_list = array($filter_event_kind_id_list); } + $filter_event_kind_id_list = array_filter($filter_event_kind_id_list); // remove any empty values - $events = $em->getRepository('AppBundle:Event')->findFutureOrOngoing($eventKind, false, $eventDateMax, $filter_limit); + $events = $em->getRepository('AppBundle:Event')->findFutureOrOngoing($filter_event_kind_id_list, false, $filter_date_max_cleaned, $filter_limit); return $this->render('event/_partial/widget.html.twig', [ 'events' => $events, - 'eventKind' => $eventKind, 'title' => $filter_title, 'links' => $filter_links, - 'maxDate' => $filter_date_max, + 'date_max' => $filter_date_max, + 'event_kind_id_list' => $filter_event_kind_id_list ]); } diff --git a/src/AppBundle/Repository/EventRepository.php b/src/AppBundle/Repository/EventRepository.php index 84eb0d69f..f1ce592a4 100644 --- a/src/AppBundle/Repository/EventRepository.php +++ b/src/AppBundle/Repository/EventRepository.php @@ -17,7 +17,7 @@ public function findAll() return $this->findBy(array(), array('date' => 'DESC')); } - public function findFutureOrOngoing(EventKind $eventKind = null, bool $dislayedHome = false, \DateTime $max = null, int $limit = null) + public function findFutureOrOngoing(array $eventKinds = null, bool $dislayedHome = false, \DateTime $max = null, int $limit = null) { $qb = $this->createQueryBuilder('e') ->leftJoin('e.kind', 'ek') @@ -25,10 +25,10 @@ public function findFutureOrOngoing(EventKind $eventKind = null, bool $dislayedH ->where('e.date > :now OR e.date < :now AND e.end IS NOT NULL AND e.end > :now') ->setParameter('now', new \Datetime('now')); - if ($eventKind) { + if ($eventKinds) { $qb - ->andwhere('e.kind = :kind') - ->setParameter('kind', $eventKind); + ->andwhere('e.kind in (:kinds)') + ->setParameter('kinds', $eventKinds); } if ($dislayedHome) {