J’ai souvent affaire avec des événements / agenda et je dois régulièrement savoir si la ou les dates de l’évènement en question se déroulent cette semaine ou le mois prochain par exemple. Je me suis donc fais une petite fonction maison pour savoir quand l’évènement se produira et pouvoir gérer l’affichage en front.
Cas d’école
Quand on a une liste d’évènements, il y a presque toujours des filtres pour nous permettre de trouver facilement ce qu’on cherche. Et bien souvent il y a un filtre par date, un petit select avec les choix suivants:
- Aujourd’hui
- Demain
- Ce week-end
- Cette semaine
- La semaine prochaine
- Ce mois-ci
- Le mois prochain
- Prochainement ( le futur )
Et là, ça devient un peu compliqué de géré les cas ou l’évènement est sur une journée ou plusieurs jours.
Comment ça fonctionne
Dans le backoffice, il vous faut deux champs: début et fin. Ils doivent retourner la date au format YYYYMMDD. C’est en générale plus plus facile de gérer les dates ayant ce format.
Ensuite il vous suffit de donner le début et la fin à la fonction.
Par exemple avec le mardi 20 juillet 2021 ( aujourd’hui, soit 20210720 ):
$periode = get_periode_range(20210720,20210720);
Ici la fonction va retourner le tableau suivant qui indique que la plage date se déroule:
Array
(
[0] => 1 // Aujourd'hui
[1] => 4 // Cette semaine
[2] => 6 // Ce mois-ci
)
Ensuite vous pourriez par exemple injecter ce tableau dans un attribut data sur les éléments HTML et les masquer ou non lors de l’évènement onChange du select.
Voici la fonction en question qui, j’espère, vous fera gagner un peu de temps :
function get_periode_range($debut,$fin) { //https: //www.php.net/manual/fr/datetime.format.php /* 1 Aujourd'hui 2 Demain 3 Ce week-end 4 Cette semaine 5 La semaine prochaine 6 Ce mois-ci 7 le mois prochain 8 le turfu */ $debut = (int)$debut; $fin = (int)$fin; $today = (int)date('Ymd'); $tomorrow = (int)date("Ymd", strtotime("+1 day")); $current_month = (int)date('n'); // Mois sans les zéros initiaux $current_day = (int)date("N"); //1 (pour Lundi) à 7 (pour Dimanche) $current_week = (int)date("W"); // numero de la semaine $next_month = $current_month + 1; $dtdebut = new DateTime($debut); $week_debut = (int)$dtdebut->format("W"); $day_debut = (int)$dtdebut->format("N"); $month_debut = (int)$dtdebut->format("n"); $dtdfin = new DateTime($fin); $week_fin = (int)$dtdfin->format("W"); $day_fin = (int)$dtdfin->format("N"); $month_fin = (int)$dtdfin->format("n"); $tab_periode = []; ///////////////////// //Test des periodes ///////////////////// // si l'event à lieu que sur une seul journée if($debut === $fin){ //Aujourd'hui if($today === $debut) { $tab_periode[] = 1; } //Demain if($tomorrow === $debut) { $tab_periode[] = 2; } //Ce week-end if($current_week === $week_debut){ if($day_debut === 6 || $day_debut === 7){ $tab_periode[] = 3; } } //Cette semaine if ($current_week === $week_debut) { $tab_periode[] = 4; } //La semaine prochaine if (($current_week+1) === $week_debut) { $tab_periode[] = 5; } //Ce mois-ci if ($current_month === $month_debut) { $tab_periode[] = 6; } //le mois prochain if ($next_month === $month_debut) { $tab_periode[] = 7; } //le turfu if ($month_debut > $next_month) { $tab_periode[] = 8; } } // si c est sur une periode if($debut < $fin){ //Aujourd'hui if( $today >= $debut && $today <= $fin){ $tab_periode[] = 1; } // Demain if( $tomorrow >= $debut && $tomorrow <= $fin){ $tab_periode[] = 2; } //Ce week-end if($current_week === $week_fin && $day_fin >= 6) { $tab_periode[] = 3; } //Cette semaine if ($current_week >= $week_debut && $current_week <= $week_fin) { $tab_periode[] = 4; } //La semaine prochaine if ( ($current_week+1) === $week_fin) { $tab_periode[] = 5; } //Ce mois-ci if ($current_month >= $month_debut) { $tab_periode[] = 6; } //le mois prochain if ($next_month === $month_fin) { $tab_periode[] = 7; } //le turfu if ($month_debut > $next_month) { $tab_periode[] = 8; } } return $tab_periode; }