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