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

Last change on this file since 115849 was 115849, checked in by rastapopoulos@…, 3 months ago

Depuis [115027] il était devenu impossible de ne pas remplir les dates, même si on n'avait jamais dit que c'était obligatoire. Le test d'obligation se fait dans Saisies en amont, mais si ce n'est pas le cas, on DOIT pouvoir laisser les champs vides. On change donc pour ne faire une erreur que si la date est vide alors qu'on a remplit l'heure. Si c'est le contraire, on considère que l'heure est 00:00. Et si tout est vide, ya rien du tout, puisqu'on n'a jamais demandé obligatoire, donc ça reste vide et ça sera possiblement normalisé avec tout à zéro.

File size: 5.3 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 l'heure sans la date principale, c'est directement erreur
45                if (!isset($valeur['date']) and isset($valeur['heure'])) {
46                        return _T('verifier:erreur_date_format_date_vide');
47                }
48                // S'il y a au moins la date ok
49                elseif (isset($valeur['date']) and is_string($valeur['date'])) {
50                        $valeur = $valeur['date']; // valeur principale pour la date
51                        $horaire = true; // on détecte une vérif avec horaire uniquement dans ce cas
52                       
53                        // Si on trouve une heure donnée
54                        if (isset($valeur['heure']) and is_string($valeur['heure'])) {
55                                $options['heure'] = $valeur['heure']; // l'heure pour la fonction de normalisation
56                        }
57                        // Sinon on met l'heure à minuit
58                        else {
59                                $options['heure'] = '00:00';
60                        }
61                }
62                // Sinon c'est une date vide, et on a tout à fait le droit !
63                // (sinon on aurait mis "obligatoire", et c'est pris en compte par Saisies avant)
64                else {
65                        $valeur = null;
66                }
67        }
68
69        // On ne fait tout la suite que s'il y a une date
70        // car comme on peut vouloir normaliser, il est possible d'être dans cette fonction avec une date vide
71        if ($valeur) {
72                // On tolère différents séparateurs
73                $valeur = preg_replace('#\.|/| #i', '-', $valeur);
74
75                // On vérifie la validité du format
76                $format = isset($options['format']) ? $options['format'] : 'jma';
77                if ($format=='mja') {
78                        if (!preg_match('#^[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}$#', $valeur)) {
79                                return $erreur;
80                        }
81                        list($mois,$jour,$annee) = explode('-', $valeur);
82                } elseif ($format=='amj') {
83                        if (!preg_match('#^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$#', $valeur)) {
84                                return $erreur;
85                        }
86                        list($annee,$mois,$jour) = explode('-', $valeur);
87                } else {
88                // Format jma par défaut
89                        if (!preg_match('#^[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}$#', $valeur)) {
90                                return $erreur;
91                        }
92                        list($jour,$mois,$annee) = explode('-', $valeur);
93                }
94                // Validité de la date
95                $erreur = _T('verifier:erreur_date');
96                if (!checkdate($mois, $jour, $annee)) {
97                        return $erreur;
98                }
99
100                if ($horaire) {
101                        // Format de l'heure
102                        $options['heure'] = str_replace(array('h','m','min'), array(':','',''), $options['heure']);
103                        if (!preg_match('#^([0-9]{1,2}):([0-9]{1,2})$#', $options['heure'], $hetm)) {
104                                return _T('verifier:erreur_heure_format');
105                        } else {
106                                // Si c'est le bon format, on teste si les nombres donnés peuvent exister
107                                $heures = intval($hetm[1]);
108                                $minutes = intval($hetm[2]);
109                                if ($heures < 0 or $heures > 23 or $minutes < 0 or $minutes > 59) {
110                                        return _T('verifier:erreur_heure');
111                                } else {
112                                        // Si tout est bon pour l'heure, on recompose en ajoutant des 0 si besoin
113                                        $options['heure'] = sprintf('%02d:%02d', $heures, $minutes);
114                                }
115                        }
116                }
117        }
118       
119        // Normaliser si demandé
120        $ok = '';
121        if ($options['normaliser'] and $options['normaliser'] == 'datetime') {
122                $valeur_normalisee = normaliser_date_datetime_dist($valeur, $options, $ok);
123        }
124
125        return $ok;
126}
127
128/**
129 * Convertir une date en datetime
130 *
131**/
132function normaliser_date_datetime_dist($valeur, $options, &$erreur) {
133        $defaut = '0000-00-00 00:00:00';
134        if (!$valeur or $valeur==array('date'=>'','heure'=>'')) {
135                return $defaut;
136        }
137
138        $date = str_replace('-', '/', $valeur); // formater en jj/mm/aaaa
139
140        if (isset($options['heure'])) {
141                $date .= (' ' . $options['heure'] . ':00');
142        } elseif (isset($options['fin_de_journee'])) {
143                $date .= ' 23:59:59';
144        }
145        else {
146                $date .= ' 00:00:00';
147        }
148
149        include_spip('inc/filtres');
150        if (!$date = recup_date($date)) {
151                $erreur = "Impossible d'extraire la date de $date";
152                return false;
153        }
154
155        if (!($date = mktime($date[3], $date[4], $date[5], (int)$date[1], (int)$date[2], (int)$date[0]))) {
156                // mauvais format de date
157                $erreur = 'Impossible de normaliser la date...';
158                return false;
159        }
160
161        $date = date('Y-m-d H:i:s', $date);
162        $date = vider_date($date); // enlever les valeurs considerees comme nulles (1 1 1970, etc...)
163
164        if (!$date) {
165                $date = $defaut;
166        }
167
168        return $date;
169}
Note: See TracBrowser for help on using the repository browser.