source: spip-zone/_plugins_/verifier/verifier/date.php @ 115027

Last change on this file since 115027 was 115027, checked in by maieul@…, 15 months ago

Vérification de date et heure. Être plus précis dans le message d'erreur si jamais la date et/ou l'heure est vide (Florence Henry)

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