[PLUGINS] ~maj globale
[lhc/web/www.git] / www / plugins / verifier / verifier / date.php
1 <?php
2
3 // Sécurité
4 if (!defined('_ECRIRE_INC_VERSION')) {
5 return;
6 }
7
8 /**
9 * Une date au format JJ/MM/AAAA (avec séparateurs souples : espace / - .)
10 * Options :
11 * - format : permet de préciser le format de la date jma pour jour/mois/année (par défaut), mja (pour mois / jour / année), amj (année/mois/jour)
12 * TODO : compléter les formats
13 * On pourrait faire mieux, genre vérifier les jours en fonction du mois
14 * Mais c'est pas très important, on reste simple
15 *
16 * @param string|array $valeur
17 * La valeur à vérifier, en chaîne pour une date seule, en tableau contenant deux entrées "date" et "heure" si on veut aussi l'heure
18 * @param array $options
19 * tableau d'options.
20 * @param null $valeur_normalisee
21 * Si normalisation a faire, la variable sera rempli par la date normalisee.
22 * @return string
23 * Retourne une chaine vide si c'est valide, sinon une chaine expliquant l'erreur.
24 */
25 function verifier_date_dist($valeur, $options = array(), &$valeur_normalisee = null) {
26 $erreur = _T('verifier:erreur_date_format');
27 $horaire = false; // par défaut on ne teste qu'une date
28
29 // Si ce n'est ni une chaîne ni un tableau : pas le bon format
30 if (!is_string($valeur) and !is_array($valeur)) {
31 return $erreur;
32 }
33
34 // Si c'est un tableau
35 if (is_array($valeur)) {
36 // S'il y a les bonnes infos on les garde aux bons endroits
37 if (isset($valeur['date']) and is_string($valeur['date'])
38 and isset($valeur['heure']) and is_string($valeur['heure'])) {
39 $options['heure'] = $valeur['heure']; // l'heure pour la fonction de normalisation
40 $valeur = $valeur['date']; // valeur principale pour la date
41 $horaire = true; // on détecte une vérif avec horaire uniquement dans ce cas
42 } else {
43 // Sinon : pas le bon format
44 return $erreur;
45 }
46 }
47
48 $ok = '';
49
50 // On tolère différents séparateurs
51 $valeur = preg_replace('#\.|/| #i', '-', $valeur);
52
53 // On vérifie la validité du format
54 $format = isset($options['format']) ? $options['format'] : 'jma';
55
56 if ($format=='mja') {
57 if (!preg_match('#^[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}$#', $valeur)) {
58 return $erreur;
59 }
60 list($mois,$jour,$annee) = explode('-', $valeur);
61 } elseif ($format=='amj') {
62 if (!preg_match('#^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$#', $valeur)) {
63 return $erreur;
64 }
65 list($annee,$mois,$jour) = explode('-', $valeur);
66 } else {
67 // Format jma par défaut
68 if (!preg_match('#^[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}$#', $valeur)) {
69 return $erreur;
70 }
71 list($jour,$mois,$annee) = explode('-', $valeur);
72 }
73
74 // Validité de la date
75 $erreur = _T('verifier:erreur_date');
76 if (!checkdate($mois, $jour, $annee)) {
77 return $erreur;
78 }
79
80 if ($horaire) {
81 // Format de l'heure
82 $options['heure'] = str_replace(array('h','m','min'), array(':','',''), $options['heure']);
83 if (!preg_match('#^([0-9]{1,2}):([0-9]{1,2})$#', $options['heure'], $hetm)) {
84 return _T('verifier:erreur_heure_format');
85 } else {
86 // Si c'est le bon format, on teste si les nombres donnés peuvent exister
87 $heures = intval($hetm[1]);
88 $minutes = intval($hetm[2]);
89 if ($heures < 0 or $heures > 23 or $minutes < 0 or $minutes > 59) {
90 return _T('verifier:erreur_heure');
91 } else {
92 // Si tout est bon pour l'heure, on recompose en ajoutant des 0 si besoin
93 $options['heure'] = sprintf('%02d:%02d', $heures, $minutes);
94 }
95 }
96 }
97 // normaliser si demandé
98 if ($options['normaliser'] and $options['normaliser'] == 'datetime') {
99 $valeur_normalisee = normaliser_date_datetime_dist($valeur, $options, $ok);
100 }
101
102 return $ok;
103 }
104
105 /**
106 * Convertir une date en datetime
107 *
108 **/
109 function normaliser_date_datetime_dist($valeur, $options, &$erreur) {
110 $defaut = '0000-00-00 00:00:00';
111 if (!$valeur or $valeur==array('date'=>'','heure'=>'')) {
112 return $defaut;
113 }
114
115 $date = str_replace('-', '/', $valeur); // formater en jj/mm/aaaa
116
117 if (isset($options['heure'])) {
118 $date .= (' ' . $options['heure'] . ':00');
119 } else {
120 $date .= ' 00:00:00';
121 }
122
123 include_spip('inc/filtres');
124 if (!$date = recup_date($date)) {
125 $erreur = "Impossible d'extraire la date de $date";
126 return false;
127 }
128
129 if (!($date = mktime($date[3], $date[4], 0, (int)$date[1], (int)$date[2], (int)$date[0]))) {
130 // mauvais format de date
131 $erreur = 'Impossible de normaliser la date...';
132 return false;
133 }
134
135 $date = date('Y-m-d H:i:s', $date);
136 $date = vider_date($date); // enlever les valeurs considerees comme nulles (1 1 1970, etc...)
137
138 if (!$date) {
139 $date = $defaut;
140 }
141
142 return $date;
143 }