Loading module/Evenementiel/src/Controller/EvenementController.php +15 −1 Original line number Diff line number Diff line Loading @@ -62,9 +62,23 @@ class EvenementController extends AbstractActionController */ public function indexAction(): ViewModel { $entities = $this->getEvenementService()->getEntities(); $anneeUnivAsOptions = $this->getEvenementService()->getAnneeUniv(); $paramsQuery = $this->params()->fromQuery(); // si anneeUniv nest pas défini on utilise la derniere année universitaire disponible if (!array_key_exists('annee', $paramsQuery)) { $paramsQuery['annee'] = array_key_last($anneeUnivAsOptions); $paramsFiltre['annee_univ'] = array_key_last($anneeUnivAsOptions); }else{ $paramsFiltre['annee_univ'] = $paramsQuery['annee']; } $entities = $this->getEvenementService()->getEvenementsWithFiltre($paramsFiltre); return new ViewModel([ "entities" => $entities, 'paramsQuery' => $paramsQuery, 'anneeUnivAsOptions' => $anneeUnivAsOptions ]); } Loading module/Evenementiel/src/Service/Evenement/EvenementService.php +65 −1 Original line number Diff line number Diff line Loading @@ -141,6 +141,33 @@ class EvenementService return $this->getEntity($id); } public function getEvenementsWithFiltre(array $params = [], string $champ = 'id', string $ordre = 'ASC'): array { foreach ($params as $key => $value) { if ($value == null) { unset($params[$key]); } } $qb = $this->createQueryBuilder(); foreach ($params as $key => $value) { if ($key == 'annee_univ') { $debut = new \DateTimeImmutable($value . '-09-01 00:00:00'); $fin = $debut->modify('+1 year'); $qb->andWhere('entity.jour >= :debutAnneeUniv') ->andWhere('entity.jour < :finAnneeUniv') ->setParameter('debutAnneeUniv', $debut) ->setParameter('finAnneeUniv', $fin); } } $qb = $qb->orderBy('entity.' . $champ, $ordre); $result = $qb->getQuery()->getResult(); return $result; } /** * Get entities as options for a select input * Loading Loading @@ -265,5 +292,42 @@ class EvenementService return false; } public function getAnneeUniv(string $ordre = 'ASC'): array{ $evenements = $this->getEntities('jour', $ordre); $annees = []; foreach ($evenements as $evenement) { $jour = $evenement->getJour(); if ($jour === null) { continue; } $annee = self::getAnneeUniversitaire($jour); $annees[$annee] = sprintf('%d - %d', $annee, $annee + 1 ); } if (strtoupper($ordre) === 'DESC') { krsort($annees); } else { ksort($annees); } return $annees; } public static function getAnneeUniversitaire(?DateTime $date = null): int { if ($date === null) { $date = new DateTime(); } $year = (int) $date->format('Y'); $month = (int) $date->format('m'); if ($month >= 9) { return $year; } return $year - 1 ; } } module/Evenementiel/view/evenementiel/evenement/index.phtml +10 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,8 @@ * @see EvenementController::indexAction * * @var Evenement[] $entities * @var array $anneeUnivAsOptions * @var array $paramsQuery */ use Evenementiel\Provider\Privilege\EvenementPrivileges; Loading Loading @@ -42,6 +44,14 @@ $this->headTitle("Evenements"); <br> <?php echo $this->partial('partial/filtre', [ 'anneeUnivAsOptions' => $anneeUnivAsOptions, 'paramsQuery' => $paramsQuery ], [], true); ?> <br> <?php echo $this->messenger()->addMessagesFromFlashMessenger(); ?> <div class="table-responsive"> Loading module/Evenementiel/view/evenementiel/evenement/partial/filtre.phtml 0 → 100644 +70 −0 Original line number Diff line number Diff line <?php /** * @var array $anneeUnivAsOptions * @var array $paramsQuery */ ?> <div class="card card-default"> <div class="card-header" style="font-variant: small-caps; font-weight: bold"> <span class="icon icon-filtrer"></span> Filtre de recherche des participants </div> <div class="card-body"> <form id="filtre" action="<?php echo $this->url(); ?>" method="get"> <div class="row g-3 align-items-en"> <div class="col-12 col-md-6 col-xl-3"> <label for="annee"> Année Universitaire : </label> <select id="annee" name="annee" class="selectpicker" data-live-search="true"> <option value="">Toutes les années</option> <?php foreach ($anneeUnivAsOptions as $key => $annee): ?> <option value="<?php echo $key; ?>" <?php if (isset($paramsQuery['annee']) && $paramsQuery['annee'] == $key) echo " selected "; ?> > <?php echo $annee; ?> </option> <?php endforeach; ?> </select> </div> <!-- BOUTON --> <div class="col-12 col-md-6 col-xl-3"> <div class="d-grid gap-2 d-sm-flex justify-content-sm-end"> <button class="btn btn-primary" id="clear"> <span class="icon icon-gommer"></span> R.A.Z. </button> <button class="btn btn-primary" id="filter"> <span class="icon icon-filtrer"></span> Filtrer </button> </div> </div> </div> </form> </div> </div> <script> $("form#filtre").submit(function (e) { e.preventDefault(); }); $('button#clear').on("click", function (e) { e.preventDefault(); window.location.href = '?'; }); $('button#filter').click(function () { let anneeValue = $('select#annee :selected').val(); let query = ""; query += "&annee=" + anneeValue window.location.href = '?' + query; }); </script> Loading
module/Evenementiel/src/Controller/EvenementController.php +15 −1 Original line number Diff line number Diff line Loading @@ -62,9 +62,23 @@ class EvenementController extends AbstractActionController */ public function indexAction(): ViewModel { $entities = $this->getEvenementService()->getEntities(); $anneeUnivAsOptions = $this->getEvenementService()->getAnneeUniv(); $paramsQuery = $this->params()->fromQuery(); // si anneeUniv nest pas défini on utilise la derniere année universitaire disponible if (!array_key_exists('annee', $paramsQuery)) { $paramsQuery['annee'] = array_key_last($anneeUnivAsOptions); $paramsFiltre['annee_univ'] = array_key_last($anneeUnivAsOptions); }else{ $paramsFiltre['annee_univ'] = $paramsQuery['annee']; } $entities = $this->getEvenementService()->getEvenementsWithFiltre($paramsFiltre); return new ViewModel([ "entities" => $entities, 'paramsQuery' => $paramsQuery, 'anneeUnivAsOptions' => $anneeUnivAsOptions ]); } Loading
module/Evenementiel/src/Service/Evenement/EvenementService.php +65 −1 Original line number Diff line number Diff line Loading @@ -141,6 +141,33 @@ class EvenementService return $this->getEntity($id); } public function getEvenementsWithFiltre(array $params = [], string $champ = 'id', string $ordre = 'ASC'): array { foreach ($params as $key => $value) { if ($value == null) { unset($params[$key]); } } $qb = $this->createQueryBuilder(); foreach ($params as $key => $value) { if ($key == 'annee_univ') { $debut = new \DateTimeImmutable($value . '-09-01 00:00:00'); $fin = $debut->modify('+1 year'); $qb->andWhere('entity.jour >= :debutAnneeUniv') ->andWhere('entity.jour < :finAnneeUniv') ->setParameter('debutAnneeUniv', $debut) ->setParameter('finAnneeUniv', $fin); } } $qb = $qb->orderBy('entity.' . $champ, $ordre); $result = $qb->getQuery()->getResult(); return $result; } /** * Get entities as options for a select input * Loading Loading @@ -265,5 +292,42 @@ class EvenementService return false; } public function getAnneeUniv(string $ordre = 'ASC'): array{ $evenements = $this->getEntities('jour', $ordre); $annees = []; foreach ($evenements as $evenement) { $jour = $evenement->getJour(); if ($jour === null) { continue; } $annee = self::getAnneeUniversitaire($jour); $annees[$annee] = sprintf('%d - %d', $annee, $annee + 1 ); } if (strtoupper($ordre) === 'DESC') { krsort($annees); } else { ksort($annees); } return $annees; } public static function getAnneeUniversitaire(?DateTime $date = null): int { if ($date === null) { $date = new DateTime(); } $year = (int) $date->format('Y'); $month = (int) $date->format('m'); if ($month >= 9) { return $year; } return $year - 1 ; } }
module/Evenementiel/view/evenementiel/evenement/index.phtml +10 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,8 @@ * @see EvenementController::indexAction * * @var Evenement[] $entities * @var array $anneeUnivAsOptions * @var array $paramsQuery */ use Evenementiel\Provider\Privilege\EvenementPrivileges; Loading Loading @@ -42,6 +44,14 @@ $this->headTitle("Evenements"); <br> <?php echo $this->partial('partial/filtre', [ 'anneeUnivAsOptions' => $anneeUnivAsOptions, 'paramsQuery' => $paramsQuery ], [], true); ?> <br> <?php echo $this->messenger()->addMessagesFromFlashMessenger(); ?> <div class="table-responsive"> Loading
module/Evenementiel/view/evenementiel/evenement/partial/filtre.phtml 0 → 100644 +70 −0 Original line number Diff line number Diff line <?php /** * @var array $anneeUnivAsOptions * @var array $paramsQuery */ ?> <div class="card card-default"> <div class="card-header" style="font-variant: small-caps; font-weight: bold"> <span class="icon icon-filtrer"></span> Filtre de recherche des participants </div> <div class="card-body"> <form id="filtre" action="<?php echo $this->url(); ?>" method="get"> <div class="row g-3 align-items-en"> <div class="col-12 col-md-6 col-xl-3"> <label for="annee"> Année Universitaire : </label> <select id="annee" name="annee" class="selectpicker" data-live-search="true"> <option value="">Toutes les années</option> <?php foreach ($anneeUnivAsOptions as $key => $annee): ?> <option value="<?php echo $key; ?>" <?php if (isset($paramsQuery['annee']) && $paramsQuery['annee'] == $key) echo " selected "; ?> > <?php echo $annee; ?> </option> <?php endforeach; ?> </select> </div> <!-- BOUTON --> <div class="col-12 col-md-6 col-xl-3"> <div class="d-grid gap-2 d-sm-flex justify-content-sm-end"> <button class="btn btn-primary" id="clear"> <span class="icon icon-gommer"></span> R.A.Z. </button> <button class="btn btn-primary" id="filter"> <span class="icon icon-filtrer"></span> Filtrer </button> </div> </div> </div> </form> </div> </div> <script> $("form#filtre").submit(function (e) { e.preventDefault(); }); $('button#clear').on("click", function (e) { e.preventDefault(); window.location.href = '?'; }); $('button#filter').click(function () { let anneeValue = $('select#annee :selected').val(); let query = ""; query += "&annee=" + anneeValue window.location.href = '?' + query; }); </script>