Subversion Repository Public Repository

location-sisco

Diff Revisions 9 vs 19 for /trunk/fonctions.inc

Diff revisions: vs.
  @@ -92,4 +92,269 @@
92 92 return false;
93 93 //==========
94 94 }
95 +
96 + /***************************************************************
97 + Gestion du calendrier
98 + ***************************************************************/
99 +
100 + // fonctions utiles, $valeur repr�sente une date au format AAAA-MM-JJ
101 + function getSecond($valeur) {
102 + return substr($valeur, 17, 2);
103 + }
104 +
105 + function getMinute($valeur) {
106 + return substr($valeur, 14, 2);
107 + }
108 +
109 + function getHour($valeur) {
110 + return substr($valeur, 11, 2);
111 + }
112 +
113 + function getDay($valeur) {
114 + return substr($valeur, 8, 2);
115 + }
116 +
117 + function getMonth($valeur) {
118 + return substr($valeur, 5, 2);
119 + }
120 +
121 + function getPreviousMonth($valeur) {
122 + $month = substr($valeur, 5, 2);
123 + $month = intval($month);
124 + $month -= 1;
125 + if($month == 0){
126 + $month = 12;
127 + }
128 + return $month;
129 + }
130 +
131 + function getNextMonth($valeur) {
132 + $month = substr($valeur, 5, 2);
133 + $month = intval($month);
134 + $month += 1;
135 + if($month == 13){
136 + $month = 1;
137 + }
138 + return $month;
139 + }
140 +
141 + function getYear($valeur) {
142 + return substr($valeur, 0, 4);
143 + }
144 +
145 + //Prend en param�tre un mois et une ann�e - retourne l'ann�e du mois pr�c�dent
146 + function getPreviousYear($valeur) {
147 + $year = substr($valeur, 0, 4);
148 + $year = intval($year);
149 + $month = substr($valeur, 5, 2);
150 + $month = intval($month);
151 + $month -= 1;
152 + if($month == 0){
153 + $year -= 1;
154 + }
155 + return $year;
156 + }
157 +
158 + //Prend en param�tre un mois et une ann�e - retourne l'ann�e du mois suivant
159 + function getNextYear($valeur) {
160 + $year = substr($valeur, 0, 4);
161 + $year = intval($year);
162 + $month = substr($valeur, 5, 2);
163 + $month = intval($month);
164 + $month += 1;
165 + if($month == 13){
166 + $year += 1;
167 + }
168 + return $year;
169 + }
170 +
171 + function monthNumToName($mois) {
172 + $tableau = Array("", "Janvier", "F�vrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "A�ut", "Septembre", "Octobre", "Novembre", "D�cembre");
173 + return (intval($mois) > 0 && intval($mois) < 13) ? $tableau[intval($mois)] : "Ind�fini";
174 + }
175 +
176 + function connectToDB(){
177 +
178 + $options = array(
179 + PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
180 + );
181 +
182 + $hote = $_SERVER['HTTP_HOST'];
183 +
184 + if( strcmp($hote, "www.location-sisco.fr") == 0 ||
185 + strcmp($hote, "location-sisco.fr") == 0)
186 + {
187 + // Serveur de prod
188 + $url = 'mysql:host=mysql51-98.perso;dbname=locationypkdk';
189 + $name = 'locationypkdk';
190 + $mdp = '3fC7vW5B';
191 + }
192 + else
193 + {
194 + // Serveur de test => localhost
195 + $url = 'mysql:host=localhost;dbname=location-sisco';
196 + $name = 'root';
197 + $mdp = '';
198 + }
199 +
200 + return new PDO($url, $name, $mdp, $options);
201 + }
202 +
203 + /*
204 + computeStyleDateJour($periode, $timestampJourCalendrier, &$dateJourReserve, &$indicationEtatJour, &$donnees, $reponse, $type_mois)
205 + Cette fonction se charge d'affecter � la variable $indicationEtatJour le style appropri� : jour libre ou jour occup�, du mois courant ou non.
206 + Param�tres :
207 + [IN] $periode => le mois affich� par le calendrier
208 + [IN] $timestampJourCalendrier => le timestamp du jour du calendrier que l'on est en train de traiter
209 + [IN OUT] $dateJourReserve => la date du prochain jour indiqu� comme r�serv� en base ; si c'est le jour courant, $dateJourReserve sera mise � jour et contiendra le prochain jour
210 + [IN OUT] $typeJourReserve => le type du prochain jour indiqu� comme non dispo en base (r�serv� ou no disponible � la location); si c'est le jour courant, $typeJourReserve sera mise � jour et contiendra le prochain jour
211 + [IN OUT] $indicationEtatJour => le style � appliquer � la case du jour trait� lors de l'affichage du calendrier
212 + [IN OUT] $donnees => les donn�es extraites de la BDD par la requette en d�but de fontion showCalendar()
213 + [IN] $reponse => donn�e extraite de $donnes
214 + [IN] $type_mois => indique le type du mois que l'on est en train de traiter : mois courant ou mois non courant (pour les quelques jours du mois pr�c�dent et du mois suivant affich�s ds le calendrier)
215 + */
216 + function computeStyleDateJour($periode, $timestampJourCalendrier, &$dateJourReserve, &$typeJourReserve, &$indicationEtatJour, &$donnees, $reponse, $type_mois){
217 + global $calendrier_jour_libre;
218 + global $calendrier_jour_occupe;
219 + //on calcule le timestamp du premier jour r�serv� en base
220 + if($dateJourReserve != NULL){
221 + $timestampJourBDD = mktime(0, 0, 0, getMonth($dateJourReserve), getDay($dateJourReserve), getYear($dateJourReserve));
222 + }else{
223 + $timestampJourBDD = 0;
224 + }
225 + //si les timestamp sont identiques, le jour est r�serv�, on pr�pare l'affichage en cons�quence
226 + if($timestampJourCalendrier == $timestampJourBDD){
227 + //on applique � $indicationEtatJour le style appropri�
228 + $indicationEtatJour = $calendrier_jour_occupe[$type_mois][$typeJourReserve];
229 + //on passe � la donn�e suivante (prochain jour r�serv�)
230 + $donnees = $reponse->fetch();
231 + //si la donn�e existe, on extrait la date
232 + if($donnees != NULL){
233 + $dateJourReserve = substr($donnees['date'], 0, 10);
234 + $typeJourReserve = $donnees['etat'];
235 + }
236 + //sinon on met dateJourReserve � NULL, ce qui indiquera qu'il n'y a plus aucun jour de r�serv� jusqu'� la fin du mois
237 + else{
238 + $dateJourReserve = NULL;
239 + $typeJourReserve = NULL;
240 + }
241 + }else{
242 + //on applique � $indicationEtatJour le style appropri�
243 + $indicationEtatJour = $calendrier_jour_libre[$type_mois];
244 + }
245 + }
246 +
247 + // Fonction pour afficher le calendrier
248 + function showCalendar($periode) {
249 + //variable globale indiquant la page o� on se trouve, calcul�e dans index.php
250 + global $page;
251 + //variabke globale pointant sur la bdd ; d�clar�e dans variables_communes
252 + global $bdd;
253 +
254 + global $calendrier_jour_libre;
255 + global $calendrier_jour_occupe;
256 +
257 + $leCalendrier = "";
258 + // Tableau des valeurs possibles pour un num�ro de jour dans la semaine
259 + $tableau = Array("0", "1", "2", "3", "4", "5", "6", "0");
260 +
261 + $nb_jour = Date("t", mktime(0, 0, 0, getMonth($periode), 1, getYear($periode)));
262 + $pas = 0;
263 + $indexe = 1;
264 +
265 + // Affichage du mois et de l'ann�e
266 + $leCalendrier .= "\n<table><thead><tr><th>";
267 + $leCalendrier .= "<a href='index.php?page=".$page."&mois=".getPreviousMonth($periode)."&annee=".getPreviousYear($periode)."'><</a> </th>";
268 + $leCalendrier .= "<th COLSPAN='5'> " . monthNumToName(getMonth($periode)) . " " . getYear($periode) . "</th><th>";
269 + $leCalendrier .= "<a href='index.php?page=".$page."&mois=".getNextMonth($periode)."&annee=".getNextYear($periode)."'>></a> </th></tr></thead>\n";
270 + $leCalendrier .= "\n<tfoot><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr></tfoot>\n";
271 + // Affichage des ent�tes
272 + $leCalendrier .= "
273 + <tr>
274 + <td>L</td>
275 + <td>M</td>
276 + <td>M</td>
277 + <td>J</td>
278 + <td>V</td>
279 + <td>S</td>
280 + <td>D</td>
281 + </tr><tr>";
282 +
283 + $leCalendrier .= "\n";
284 + // 0 >> Calcul des jours du mois pr�c�dents et des jours du mois suivant que l'on va devroi afficher dans le calendrier
285 + //1er jour du mois
286 + $num_prem_jour = Date("w", mktime(0, 0, 0, getMonth($periode), 1, getYear($periode)));
287 + //nombre de jours du mois pr�c�dent � afficher
288 + //puisque Date("w"...) renvoi un indice de jour ainsi fait : D=0, L=1, ..., S=6 et que nous affichons un tableau construit de la sorte : L=0, M=1, ..., D=6
289 + //on doit effectuer l'op�ration [num�ro du premier jour du mois] + 6 modulo 7 pour retomber sur nos pates
290 + $nb_jour_mois_precedent_ds_tab = ($num_prem_jour+6)%7;
291 + $nb_jour_mois_precedent = Date("t", mktime(0, 0, 0, getPreviousMonth($periode), 1, getPreviousYear($periode)));
292 +
293 + $datePremierJourAAfficher = Date("Y-m-d", mktime(0, 0, 0, getPreviousMonth($periode), $nb_jour_mois_precedent - $nb_jour_mois_precedent_ds_tab +1, getPreviousYear($periode)));
294 + $nb_jour_mois_suivant = (7-($nb_jour_mois_precedent_ds_tab + $nb_jour)%7);
295 + if($nb_jour_mois_suivant == 7){
296 + $nb_jour_mois_suivant = 0;
297 + }
298 + $dateDernierJourAAfficher = Date("Y-m-d", mktime(0, 0, 0, getNextMonth($periode), $nb_jour_mois_suivant, getNextYear($periode)));
299 + //echo "on affiche ".$nb_jour_mois_suivant." jours en plus<br/>";
300 + //echo $datePremierJourAAfficher." / ".$dateDernierJourAAfficher;
301 +
302 + try
303 + {
304 + $bdd = connectToDB();
305 + $reponse = $bdd->query('SELECT * FROM _LS_reservations WHERE date >= "'.$datePremierJourAAfficher.'" AND date <= "'.$dateDernierJourAAfficher.'" ORDER BY date');
306 +
307 + $donnees = $reponse->fetch();
308 + if($donnees != NULL){
309 + $dateJourReserve = substr($donnees['date'], 0, 10);
310 + $typeJourReserve = $donnees['etat'];
311 + }else{
312 + $dateJourReserve = NULL;
313 + $typeJourReserve = NULL;
314 + }
315 + //$reponse->closeCursor(); // Termine le traitement de la requ�te*/
316 + }
317 + catch (Exception $e)
318 + {
319 + die('Erreur : ' . $e->getMessage());
320 + }
321 + // 1 >> On traite d'abord les derniers jours du mois pr�c�dent, s'il y a lieu (afin d'obtenir un tableau enti�rement rempli, sans "vide")
322 + for($cpt = $nb_jour_mois_precedent - $nb_jour_mois_precedent_ds_tab +1; $cpt <= $nb_jour_mois_precedent ; $cpt++){
323 + //on calcule le timestamp du jour du calendrier que l'on est en train de traiter
324 + $timestampJourCalendrier = mktime(0, 0, 0, getPreviousMonth($periode), $cpt, getPreviousYear($periode));
325 + $indicationEtatJour = "";
326 + computeStyleDateJour($periode, $timestampJourCalendrier, $dateJourReserve, $typeJourReserve, $indicationEtatJour, $donnees, $reponse, "mois_non_courant");
327 + $leCalendrier .= "<td ".$indicationEtatJour."><i>".Date("j", $timestampJourCalendrier)."</i></td>";
328 + $indexe++;
329 + }
330 + // 2 >> On traite ensuite les jours du mois courant
331 + //Tant que l'on n'a pas affect� tous les jours du mois trait�
332 + while ($pas < $nb_jour) {
333 + if ($indexe == 1) $leCalendrier .= "\n";
334 + $timestampJourCalendrier = mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode));
335 + $indicationEtatJour = "";
336 + computeStyleDateJour($periode, $timestampJourCalendrier, $dateJourReserve, $typeJourReserve, $indicationEtatJour, $donnees, $reponse, "mois_courant");
337 + $afficheJour = Date("j", $timestampJourCalendrier);
338 + // Ajout de la case avec la date
339 + $leCalendrier .= "\n<td ".$indicationEtatJour."><i>"."$afficheJour</i></td>";
340 + $pas++;
341 +
342 + if ($indexe == 7 && $pas < $nb_jour) { $leCalendrier .= "\n</tr><tr>"; $indexe = 1;} else {$indexe++;}
343 + }
344 + // 3 >> On traite enfin les premiers jours du mois suivant (afin d'obtenir un tableau enti�rement rempli, sans "vide")
345 + $pas=0;
346 + for($indexe; $indexe <= 7; $indexe++){
347 + $timestampJourCalendrier = mktime(0, 0, 0, getNextMonth($periode), 1 + $pas, getNextYear($periode));
348 + $indicationEtatJour = "";
349 + computeStyleDateJour($periode, $timestampJourCalendrier, $dateJourReserve, $typeJourReserve, $indicationEtatJour, $donnees, $reponse, "mois_non_courant");
350 + $leCalendrier .= "<td ".$indicationEtatJour."><i>".Date("j", mktime(0, 0, 0, getNextMonth($periode), 1+$pas, getNextYear($periode)))."</i></td>";
351 + $pas++;
352 + }
353 +
354 + $reponse->closeCursor(); // Termine le traitement de la requ�te
355 + $leCalendrier .= "\n</tr></table>\n";
356 +
357 + // Retour de la chaine contenant le Calendrier
358 + return $leCalendrier;
359 + }
95 360 ?>