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

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

Pour la vérif date, on ne fait plus de dérogation en dur, mais on gère le cas où c'est vide dans la fonction dédiée. En effet, même si c'est vide, on veut absolument passer dedans car ça peut être normalisé ! Là si c'était vide, pas de normalisation et donc pétage de SQL si on devait avoir un datetime. Dans tous les cas, la fonction renvoie pareil qu'avant : chaine vide, si la date est vide, mais c'est fait en interne.

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