[RESOLU] Gestion d'agenda et récurrence

Eléphant du PHP | 120 Messages

24 juin 2021, 14:54

Bonjour à tous
j'ai développé un agenda simple pour un outil permettant de fixer un rdv à 90 jours pour x inscrits.
Mais on me demande de faire évoluer mon outil pour permettre de gérer la récurrence dans certains rdvs. Par exemple, 1 fois par semaine, 1 fois par mois, ou 1 fois toutes les 6 semaines...
Je ne sais pas trop comment m'y prendre.
Mon problème principal n'est pas de créer les rdvs au moment de l'action. ça, à la rigueur, je vois à peu près. En fonction de ma récurrence, j'obtiens x dates sur ma période de 90 jours pour cet inscrit, et je crée un rdv pour chacune de ces dates.
C'est plutôt pour que, alors que le temps passe, des nouveaux rdvs soient de nouveau créés au delà de la période initiale des 90 jours de départ, pour que la récurrence continue.
Alors, peut etre que je devrais ne pas me limiter à 90 jours et prévoir dès le départ une récurrence à l'infini... enfin, l'infini n'existe pas, disons sur 99 ans (ça fait un sacré flux de rdvs à créer ça...) ? Du coup, je crée tous les rdvs dès le départ ?
Ou alors je fais une tache cron avec une fonction qui repasse pour créer les nouveaux rdvs suivants chaque jour qui passe ?
Mais ensuite, je vais devoir gérer les corrections de récurrence pour tous les rdvs créés s'il doit y avoir des modifs... modif du lot, suppression...
Bref, il y a beaucoup de sujets qui découlent de cette fonctionnalité, et j'avoue que c'est un peu complexe...
Si vous pouviez me donner quelques conseils sur la marche à suivre, j'aurais peut etre la bonne méthode dès le départ...
Merci de vos conseils
si tu as un soucis en informatique, dis toi bien que quelqu'un d'autre l'a eu avant toi

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

24 juin 2021, 15:49

En résumé il ne faut pas créer des évènements séparés mais stocker la règle qui permet de définir/retrouver ces évènements.

Une très bonne piste de départ ici : https://github.com/bmoeskau/Extensible/ ... verview.md
Une autre plus concrète : https://stackoverflow.com/questions/105 ... inal-maths
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 120 Messages

24 juin 2021, 16:27

aie...
je me doutais que j'allais basculer dans un truc complexe...
Là il va falloir que je me pose rien que pour comprendre le concept lol
Merci pour ces liens, je vais étudier tout ça
si tu as un soucis en informatique, dis toi bien que quelqu'un d'autre l'a eu avant toi

Eléphant du PHP | 120 Messages

23 août 2021, 20:33

Merci de ces conseils...
le temps a passé, j'ai un peu avancé grâce à ton aide, et j'ai réussi à faire fonctionner quelque chose sur la base de ces explications :
https://stackoverflow.com/questions/518 ... 95#5186095

Notamment en bas, où le gars fournit un exemple fonctionnel, que j'ai décortiqué et adapté.

Aujourd'hui, j'ai quand même un peu de problème à comprendre cette requete :

Code : Tout sélectionner

$sql = "SELECT EV.* FROM `events` EV RIGHT JOIN `events_meta` EM1 ON EM1.`event_id` = EV.`id` WHERE ( DATEDIFF( '$nowString', repeat_start ) % repeat_interval = 0 ) OR ( (repeat_year = $year OR repeat_year = '*' ) AND (repeat_month = $month OR repeat_month = '*' ) AND (repeat_day = $day OR repeat_day = '*' ) AND (repeat_week = $week OR repeat_week = '*' ) AND (repeat_weekday = $weekday OR repeat_weekday = '*' ) AND repeat_start <= DATE('$nowString') )";
Enfin, si, je la comprends, mais j'ai besoin de mettre en place une date de fin.
Dans le script actuel, il existe une date de début : repeat_start
Mais dans mon usage, j'ai aussi besoin d’arrêter la récurrence à une date de fin : repeat_end
Voilà donc comment j'imagine mettre en place ce besoin, une fois le champs ajouté dans la base de données évidemment.

Code : Tout sélectionner

$sql = "SELECT EV.* FROM `events` EV RIGHT JOIN `events_meta` EM1 ON EM1.`event_id` = EV.`id` WHERE ( DATEDIFF( '$nowString', repeat_start ) % repeat_interval = 0 ) OR ( (repeat_year = $year OR repeat_year = '*' ) AND (repeat_month = $month OR repeat_month = '*' ) AND (repeat_day = $day OR repeat_day = '*' ) AND (repeat_week = $week OR repeat_week = '*' ) AND (repeat_weekday = $weekday OR repeat_weekday = '*' ) AND repeat_start <= DATE('$nowString') AND repeat_end >= DATE('$nowString') )";
ça me parait facile pour la 2e partie de la requête, après le OR, mais pour la partie d'avant, celle qui utilise :
WHERE ( DATEDIFF( '$nowString', repeat_start ) % repeat_interval = 0 )
j'ai du mal à l'adapter pour un usage avec une date de fin...

Je ne suis pas sûr qu'ajouter cela soit correct :
WHERE ( DATEDIFF( '$nowString', repeat_start ) % repeat_interval = 0 )
AND ( DATEDIFF( repeat_end, '$nowString' ) % repeat_interval = 0 )

Pourriez vous m'aider ?
merci de votre patience
si tu as un soucis en informatique, dis toi bien que quelqu'un d'autre l'a eu avant toi

Eléphant du PHP | 120 Messages

25 août 2021, 19:54

j'ai fini par trouver !

Code : Tout sélectionner

$sql = "SELECT EV.* FROM `events` EV RIGHT JOIN `events_meta` EM1 ON EM1.`event_id` = EV.`id` WHERE ( ( DATEDIFF( '$nowString', repeat_start ) % repeat_interval = 0 ) AND ( (repeat_end = '0000-00-00') OR (DATEDIFF( repeat_end, '$nowString' ) > 0 ) ) ) OR ( (repeat_year = $year OR repeat_year = '*' ) AND (repeat_month = $month OR repeat_month = '*' ) AND (repeat_day = $day OR repeat_day = '*' ) AND (repeat_week = $week OR repeat_week = '*' ) AND (repeat_weekday = $weekday OR repeat_weekday = '*' ) AND repeat_start <= DATE('$nowString') AND (repeat_end >= DATE('$nowString') OR repeat_end = '0000-00-00') )";
si tu as un soucis en informatique, dis toi bien que quelqu'un d'autre l'a eu avant toi