Je ne pense pas que ta solution du quart d'heure soit une bonne solution. Je n'y vois pas d'intérêt et au contraire ça complexifie le problème et multiplie des étapes inutiles.
Ce qu'il faut faire à mon avis :
1- définir une vue (jour, semaine, mois, etc.)
2- effectuer les requêtes en fonction de la vue définie
3- créer la vue
Le troisième point va vraiment dépendre de la structure de ton calendrier. Afin de gérer plus facilement les collisions, je pense qu'il faut boucler sur tes évènements récupérés afin de les répartir sur chaque colonne (jour) du calendrier. Tu commences avec un tableau vide de la taille du nombre de colonnes. Tu boucles sur tes évènements, pour chaque évènement tu calcules l'heure de début et de fin sur chaque colonne. Un évènement sur 2 jours par exemple, commencera à 10h et finira à 24h le jour 1 et commencera à 0h et finira à 14h le jour 2. Donc tu remplies ton tableau avec :
$array[colonne1] = [[id évènement, heure début, heure fin, 0]]
$array[colonne2] = [[id évènement, heure début, heure fin, 0]]
$array[colonne3] = [] tu laisses vide car pas la peine de surcharger le tableau
etc.
Ensuite sur chaque colonne tu boucles chaque évènement pour déterminer les chevauchements :
Code :
$arrayLength = count($array[colonne1 ]); for($i = 0; $i < $arrayLength; $i++) { for($j = $i; $j < $arrayLength; $j++) { si chevauchement plage évènement $i avec plage évènement $j alors { $array[colonne1][$i][3]++; $array[colonne1][$j][3]++; } } }
|
Il y a surement plus propre qu'une double boucle imbriquée, surtout qu'il faut aussi boucler sur chaque colonne donc ça nous fait 3 boucles imbriquées mais c'est pour t'expliquer l'idée.
Une fois que tu as les heures de début et de fin de chaque évènement pour chaque colonne, ainsi que le nombre de chevauchements, tu peux calculer la hauteur d'offset de l'évènement, sa hauteur et sa largeur et ainsi créer la div qui va bien.
Au passage je parlais de pixels dans mon post précédent, mieux vaut probablement partir sur une colonne conteneur et des divs évènements dedans aux dimensions en pourcentage de ce conteneur.
Exemple sur 4 jours de deux évènements :
$array[colonne1] = [[#47, 10h, 24h, 0]]
$array[colonne2] = [[#47, 0h, 12h, 1], [#48, 9h, 24h, 1]]
$array[colonne3] = [[#48, 0h, 16h, 0]]
$array[colonne4] = []
Colonne 1 : une div de 100/(0+1) = 100% de large et positionnée à 100*10/24 = 42% du haut de la colonne 1 et faisant 100*(24-10)/24 = 58% de la hauteur de la colonne 1.
Colonne 2 :
- une div de 100/(1+1) = 50% de large et positionnée à 100*0/24 = 0% du haut de la colonne 2 et faisant 100*(12-0)/24 = 50% de la hauteur de la colonne2.
- une div de 100/(1+1) = 50% de large et positionnée à 100*9/24 = 38% du haut de la colonne 2 et faisant 100*(24-9)/24 = 63% de la hauteur de la colonne2.
Colonne 3 : une div de 100/(0+1) = 100% de large et positionnée à 100*0/24 = 0% du haut de la colonne 3 et faisant 100*(16-0)/24 = 67% de la hauteur de la colonne 3.
Colonne 4 : rien
Message édité par MaybeEijOrNot le 10-06-2018 à 16:57:14
---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.