[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / prive / formulaires / dater.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2017 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 /**
14 * Gestion du formulaire de date
15 *
16 * @package SPIP\Core\Formulaires
17 **/
18
19 if (!defined('_ECRIRE_INC_VERSION')) {
20 return;
21 }
22
23
24 /**
25 * Chargement du formulaire d'édition d'une date
26 *
27 * @param string $objet
28 * Type d'objet
29 * @param int $id_objet
30 * Identifiant de l'objet
31 * @param string $retour
32 * URL de redirection après le traitement
33 * @param array|string $options
34 * Options. Si string, unserialize pour obtenir un tableau.
35 *
36 * - date_redac : Permet de modifier en plus la date de rédaction antérieure
37 * @return array
38 * Environnement du formulaire
39 **/
40 function formulaires_dater_charger_dist($objet, $id_objet, $retour = '', $options = array()) {
41
42 $objet = objet_type($objet);
43 if (!$objet or !intval($id_objet)) {
44 return false;
45 }
46
47 if (!is_array($options)) {
48 $options = unserialize($options);
49 }
50
51 $_id_objet = id_table_objet($objet);
52 $table = table_objet($objet);
53 $trouver_table = charger_fonction('trouver_table', 'base');
54 $desc = $trouver_table($table);
55
56 if (!$desc) {
57 return false;
58 }
59
60 $champ_date = $desc['date'] ? $desc['date'] : 'date';
61 if (!isset($desc['field'][$champ_date])) {
62 return false;
63 }
64
65 $valeurs = array(
66 'objet' => $objet,
67 'id_objet' => $id_objet,
68 'id' => $id_objet,
69 );
70
71
72 $select = "$champ_date as date";
73 if (isset($desc['field']['date_redac'])) {
74 $select .= ',date_redac';
75 }
76 if (isset($desc['field']['statut'])) {
77 $select .= ',statut';
78 }
79
80
81 $row = sql_fetsel($select, $desc['table'], "$_id_objet=" . intval($id_objet));
82 $statut = isset($row['statut']) ? $row['statut'] : 'publie'; // pas de statut => publie
83
84 $valeurs['editable'] = autoriser('dater', $objet, $id_objet, null, array('statut' => $statut));
85
86 $possedeDateRedac = false;
87
88 if (isset($row['date_redac']) and
89 $regs = recup_date($row['date_redac'], false)
90 ) {
91 $annee_redac = $regs[0];
92 $mois_redac = $regs[1];
93 $jour_redac = $regs[2];
94 $heure_redac = $regs[3];
95 $minute_redac = $regs[4];
96 $possedeDateRedac = true;
97 // attention : les vrai dates de l'annee 1 sont stockee avec +9000 => 9001
98 // mais reviennent ici en annee 1 par recup_date
99 // on verifie donc que le intval($row['date_redac']) qui ressort l'annee
100 // est bien lui aussi <=1 : dans ce cas c'est une date sql 'nulle' ou presque, selon
101 // le gestionnnaire sql utilise (0001-01-01 pour PG par exemple)
102 if (intval($row['date_redac']) <= 1 and ($annee_redac <= 1) and ($mois_redac <= 1) and ($jour_redac <= 1)) {
103 $possedeDateRedac = false;
104 }
105 } else {
106 $annee_redac = $mois_redac = $jour_redac = $heure_redac = $minute_redac = 0;
107 }
108
109 if ($regs = recup_date($row['date'], false)) {
110 $annee = $regs[0];
111 $mois = $regs[1];
112 $jour = $regs[2];
113 $heure = $regs[3];
114 $minute = $regs[4];
115 }
116
117 // attention, si la variable s'appelle date ou date_redac, le compilo va
118 // la normaliser, ce qu'on ne veut pas ici.
119 $valeurs['afficher_date_redac'] = ($possedeDateRedac ? $row['date_redac'] : '');
120 $valeurs['date_redac_jour'] = dater_formater_saisie_jour($jour_redac, $mois_redac, $annee_redac);
121 $valeurs['date_redac_heure'] = "$heure_redac:$minute_redac";
122
123 $valeurs['afficher_date'] = $row['date'];
124 $valeurs['date_jour'] = dater_formater_saisie_jour($jour, $mois, $annee);
125 $valeurs['date_heure'] = "$heure:$minute";
126
127 $valeurs['sans_redac'] = !$possedeDateRedac;
128
129 if (isset($options['date_redac'])) {
130 $valeurs['_editer_date_anterieure'] = $options['date_redac'];
131 } else {
132 $valeurs['_editer_date_anterieure'] = ($objet == 'article' and ($GLOBALS['meta']['articles_redac'] != 'non' or $possedeDateRedac));
133 }
134 $valeurs['_label_date'] = (($statut == 'publie') ?
135 _T('texte_date_publication_objet') : _T('texte_date_creation_objet'));
136 $valeurs['_saisie_en_cours'] = (_request('_saisie_en_cours') !== null or _request('date_jour') !== null);
137
138 // cas ou l'on ne peut pas dater mais on peut modifier la date de redac anterieure
139 // https://core.spip.net/issues/3494
140 $valeurs['_editer_date'] = $valeurs['editable'];
141 if ($valeurs['_editer_date_anterieure'] and !$valeurs['editable']) {
142 $valeurs['editable'] = autoriser('modifier', $objet, $id_objet);
143 }
144
145 return $valeurs;
146 }
147
148 /**
149 * Formate la date
150 *
151 * @param string|int $jour
152 * Numéro du jour
153 * @param string|int $mois
154 * Numéro du mois
155 * @param string|int $annee
156 * Année
157 * @param string $sep
158 * Séparateur
159 * @return string
160 * Date formatée tel que `02/10/2012`
161 **/
162 function dater_formater_saisie_jour($jour, $mois, $annee, $sep = '/') {
163 $annee = str_pad($annee, 4, '0', STR_PAD_LEFT);
164 if (intval($jour)) {
165 $jour = str_pad($jour, 2, '0', STR_PAD_LEFT);
166 $mois = str_pad($mois, 2, '0', STR_PAD_LEFT);
167
168 return "$jour$sep$mois$sep$annee";
169 }
170 if (intval($mois)) {
171 $mois = str_pad($mois, 2, '0', STR_PAD_LEFT);
172
173 return "$mois$sep$annee";
174 }
175
176 return $annee;
177 }
178
179 /**
180 * Identifier le formulaire en faisant abstraction des paramètres qui
181 * ne représentent pas l'objet edité
182 *
183 * @param string $objet
184 * Type d'objet
185 * @param int $id_objet
186 * Identifiant de l'objet
187 * @param string $retour
188 * URL de redirection après le traitement
189 * @param array|string $options
190 * Options.
191 * @return string
192 * Hash du formulaire
193 **/
194 function formulaires_dater_identifier_dist($objet, $id_objet, $retour = '', $options = array()) {
195 return serialize(array($objet, $id_objet));
196 }
197
198 /**
199 * Vérifications avant traitements du formulaire d'édition d'une date
200 *
201 * @param string $objet
202 * Type d'objet
203 * @param int $id_objet
204 * Identifiant de l'objet
205 * @param string $retour
206 * URL de redirection après le traitement
207 * @param array|string $options
208 * Options.
209 * @return Array
210 * Tableau des erreurs
211 */
212 function formulaires_dater_verifier_dist($objet, $id_objet, $retour = '', $options = array()) {
213 $erreurs = array();
214
215 // ouvrir le formulaire en edition ?
216 if (_request('_saisie_en_cours')) {
217 $erreurs['message_erreur'] = '';
218
219 return $erreurs;
220 }
221
222 foreach (array('date', 'date_redac') as $k) {
223 if ($v = _request($k . '_jour') and !dater_recuperer_date_saisie($v, $k)) {
224 $erreurs[$k] = _T('format_date_incorrecte');
225 } elseif ($v = _request($k . '_heure') and !dater_recuperer_heure_saisie($v)) {
226 $erreurs[$k] = _T('format_heure_incorrecte');
227 }
228 }
229
230 if (!_request('date_jour')) {
231 $erreurs['date'] = _T('info_obligatoire');
232 }
233
234 return $erreurs;
235 }
236
237 /**
238 * Traitement du formulaire d'édition d'une date
239 *
240 * @param string $objet
241 * Type d'objet
242 * @param int $id_objet
243 * Identifiant de l'objet
244 * @param string $retour
245 * URL de redirection après le traitement
246 * @param array|string $options
247 * Options.
248 * @return Array
249 * Retours des traitements
250 */
251 function formulaires_dater_traiter_dist($objet, $id_objet, $retour = '', $options = array()) {
252 $res = array('editable' => ' ');
253
254 if (_request('changer')) {
255 $table = table_objet($objet);
256 $trouver_table = charger_fonction('trouver_table', 'base');
257 $desc = $trouver_table($table);
258
259 if (!$desc) {
260 return array('message_erreur' => _L('erreur'));
261 } #impossible en principe
262
263 $champ_date = $desc['date'] ? $desc['date'] : 'date';
264
265 $set = array();
266
267 $charger = charger_fonction('charger', 'formulaires/dater/');
268 $v = $charger($objet, $id_objet, $retour, $options);
269
270 if ($v['_editer_date']) {
271 if (!$d = dater_recuperer_date_saisie(_request('date_jour'))) {
272 $d = array(date('Y'), date('m'), date('d'));
273 }
274 if (!$h = dater_recuperer_heure_saisie(_request('date_heure'))) {
275 $h = array(0, 0);
276 }
277
278 $set[$champ_date] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]);
279 }
280
281 if (isset($desc['field']['date_redac']) and $v['_editer_date_anterieure']) {
282 if (!_request('date_redac_jour') or _request('sans_redac')) {
283 $set['date_redac'] = sql_format_date(0, 0, 0, 0, 0, 0);
284 } else {
285 if (!$d = dater_recuperer_date_saisie(_request('date_redac_jour'), 'date_redac')) {
286 $d = array(date('Y'), date('m'), date('d'));
287 }
288 if (!$h = dater_recuperer_heure_saisie(_request('date_redac_heure'))) {
289 $h = array(0, 0);
290 }
291 $set['date_redac'] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]);
292 }
293 }
294
295 if (count($set)) {
296 $publie_avant = objet_test_si_publie($objet, $id_objet);
297 include_spip('action/editer_objet');
298 objet_modifier($objet, $id_objet, $set);
299 $publie_apres = objet_test_si_publie($objet, $id_objet);
300 if ($publie_avant !== $publie_apres) {
301 // on refuse ajax pour forcer le rechargement de la page ici
302 // on refera traiter une 2eme fois, mais c'est sans consequence
303 refuser_traiter_formulaire_ajax();
304 }
305 }
306 }
307
308 if ($retour) {
309 $res['redirect'] = $retour;
310 }
311
312 set_request('date_jour');
313 set_request('date_redac_jour');
314 set_request('date_heure');
315 set_request('date_redac_heure');
316
317 return $res;
318 }
319
320 /**
321 * Récupérer annee, mois, jour sur la date saisie
322 *
323 * @param string $post
324 * @param string $quoi
325 * @return array|string Chaîne vide si date invalide, tableau (année, mois, jour) sinon.
326 */
327 function dater_recuperer_date_saisie($post, $quoi = 'date') {
328 if (!preg_match('#^(?:(?:([0-9]{1,2})[/-])?([0-9]{1,2})[/-])?([0-9]{4}|[0-9]{1,2})#', $post, $regs)) {
329 return '';
330 }
331 if ($quoi == 'date_redac') {
332 if ($regs[3] <> '' and $regs[3] < 1001) {
333 $regs[3] += 9000;
334 }
335
336 return array($regs[3], $regs[2], $regs[1]);
337 } else {
338 if (
339 checkdate(intval($regs[2]), intval($regs[1]), intval($regs[3]))
340 and $t = mktime(0, 0, 0, $regs[2], $regs[1], $regs[3])
341 ) {
342 return array(date('Y', $t), date('m', $t), date('d', $t));
343 }
344 return '';
345 }
346 }
347
348 /**
349 * Récupérer heures,minutes sur l'heure saisie
350 *
351 * @param string $post
352 * @return array
353 */
354 function dater_recuperer_heure_saisie($post) {
355 if (!preg_match('#([0-9]{1,2})(?:[h:](?:([0-9]{1,2}))?)?#', $post, $regs)) {
356 return '';
357 }
358 if ($regs[1] >= 23 or $regs[2] >= 59) {
359 return '';
360 }
361
362 return array($regs[1], $regs[2]);
363 }