~maj v3.0.19-->v3.0.21
[ptitvelo/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-2014 *
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 if (!defined('_ECRIRE_INC_VERSION')) return;
14
15 function formulaires_dater_charger_dist($objet, $id_objet, $retour='', $options=array()){
16
17 $objet = objet_type($objet);
18 if (!$objet OR !intval($id_objet))
19 return false;
20
21 if (!is_array($options))
22 $options = unserialize($options);
23
24 $_id_objet = id_table_objet($objet);
25 $table = table_objet($objet);
26 $trouver_table = charger_fonction('trouver_table','base');
27 $desc = $trouver_table($table);
28
29 if (!$desc)
30 return false;
31
32 $champ_date = $desc['date']?$desc['date']:'date';
33 if (!isset($desc['field'][$champ_date]))
34 return false;
35
36 $valeurs = array(
37 'objet'=>$objet,
38 'id_objet'=>$id_objet,
39 'id'=>$id_objet,
40 );
41
42
43 $select = "$champ_date as date";
44 if (isset($desc['field']['date_redac']))
45 $select .= ",date_redac";
46 if (isset($desc['field']['statut']))
47 $select .= ",statut";
48
49
50 $row = sql_fetsel($select, $desc['table'], "$_id_objet=".intval($id_objet));
51 $statut = isset($row['statut'])?$row['statut']:'publie'; // pas de statut => publie
52
53 $valeurs['editable'] = autoriser('dater',$objet,$id_objet,null,array('statut'=>$statut));
54
55 $possedeDateRedac = false;
56
57 if (isset($row['date_redac']) AND
58 $regs = recup_date($row['date_redac'], false)) {
59 $annee_redac = $regs[0];
60 $mois_redac = $regs[1];
61 $jour_redac = $regs[2];
62 $heure_redac = $regs[3];
63 $minute_redac = $regs[4];
64 $possedeDateRedac = true;
65 // attention : les vrai dates de l'annee 1 sont stockee avec +9000 => 9001
66 // mais reviennent ici en annee 1 par recup_date
67 // on verifie donc que le intval($row['date_redac']) qui ressort l'annee
68 // est bien lui aussi <=1 : dans ce cas c'est une date sql 'nulle' ou presque, selon
69 // le gestionnnaire sql utilise (0001-01-01 pour PG par exemple)
70 if (intval($row['date_redac'])<=1 AND ($annee_redac<=1) AND ($mois_redac<=1) AND ($jour_redac<=1))
71 $possedeDateRedac = false;
72 }
73 else
74 $annee_redac = $mois_redac = $jour_redac = $heure_redac = $minute_redac = 0;
75
76 if ($regs = recup_date($row['date'], false)) {
77 $annee = $regs[0];
78 $mois = $regs[1];
79 $jour = $regs[2];
80 $heure = $regs[3];
81 $minute = $regs[4];
82 }
83
84 // attention, si la variable s'appelle date ou date_redac, le compilo va
85 // la normaliser, ce qu'on ne veut pas ici.
86 $valeurs['afficher_date_redac'] = ($possedeDateRedac?$row['date_redac']:'');
87 $valeurs['date_redac_jour'] = dater_formater_saisie_jour($jour_redac,$mois_redac,$annee_redac);
88 $valeurs['date_redac_heure'] = "$heure_redac:$minute_redac";
89
90 $valeurs['afficher_date'] = $row['date'];
91 $valeurs['date_jour'] = dater_formater_saisie_jour($jour,$mois,$annee);
92 $valeurs['date_heure'] = "$heure:$minute";
93
94 $valeurs['sans_redac'] = !$possedeDateRedac;
95
96 if (isset($options['date_redac']))
97 $valeurs['_editer_date_anterieure'] = $options['date_redac'];
98 else
99 $valeurs['_editer_date_anterieure'] = ($objet=='article' AND ($GLOBALS['meta']["articles_redac"] != 'non' OR $possedeDateRedac));
100 $valeurs['_label_date'] = (($statut == 'publie')? _T('texte_date_publication_objet'): _T('texte_date_creation_objet'));
101 $valeurs['_saisie_en_cours'] = (_request('date_jour')!==null);
102
103 // cas ou l'on ne peut pas dater mais on peut modifier la date de redac anterieure
104 // https://core.spip.net/issues/3494
105 $valeurs['_editer_date'] = $valeurs['editable'];
106 if ($valeurs['_editer_date_anterieure'] AND !$valeurs['editable']){
107 $valeurs['editable'] = autoriser('modifier',$objet,$id_objet);
108 }
109 return $valeurs;
110 }
111
112 function dater_formater_saisie_jour($jour,$mois,$annee,$sep="/"){
113 $annee = str_pad($annee,4,'0',STR_PAD_LEFT);
114 if (intval($jour)){
115 $jour = str_pad($jour,2,'0',STR_PAD_LEFT);
116 $mois = str_pad($mois,2,'0',STR_PAD_LEFT);
117 return "$jour$sep$mois$sep$annee";
118 }
119 if (intval($mois)) {
120 $mois = str_pad($mois,2,'0',STR_PAD_LEFT);
121 return "$mois$sep$annee";
122 }
123 return $annee;
124 }
125 /**
126 * Identifier le formulaire en faisant abstraction des parametres qui
127 * ne representent pas l'objet edite
128 */
129 function formulaires_dater_identifier_dist($objet, $id_objet, $retour='', $options=array()){
130 return serialize(array($objet, $id_objet));
131 }
132
133 /**
134 * Verification avant traitement
135 *
136 * On verifie que l'upload s'est bien passe et
137 * que le document recu est une image (d'apres son extension)
138 *
139 * @param string $objet
140 * @param integer $id_objet
141 * @param string $retour
142 * @return Array Tableau des erreurs
143 */
144 function formulaires_dater_verifier_dist($objet, $id_objet, $retour=''){
145 $erreurs = array();
146
147 foreach(array('date','date_redac') as $k){
148 if ($v=_request($k."_jour") AND !dater_recuperer_date_saisie($v, $k))
149 $erreurs[$k] = _T('format_date_incorrecte');
150 elseif ($v=_request($k."_heure") AND !dater_recuperer_heure_saisie($v))
151 $erreurs[$k] = _T('format_heure_incorrecte');
152 }
153
154 if (!_request('date_jour'))
155 $erreurs['date'] = _T('info_obligatoire');
156
157 return $erreurs;
158 }
159
160 /**
161 * Traitement
162 *
163 * @param string $objet
164 * @param integer $id_objet
165 * @param string $retour
166 * @return Array
167 */
168 function formulaires_dater_traiter_dist($objet, $id_objet, $retour=''){
169 $res = array('editable'=>' ');
170
171 if (_request('changer')){
172 $_id_objet = id_table_objet($objet);
173 $table = table_objet($objet);
174 $trouver_table = charger_fonction('trouver_table','base');
175 $desc = $trouver_table($table);
176
177 if (!$desc)
178 return array('message_erreur'=>_L('erreur')); #impossible en principe
179
180 $champ_date = $desc['date']?$desc['date']:'date';
181
182 $set = array();
183
184 $charger = charger_fonction("charger","formulaires/dater/");
185 $v = $charger($objet, $id_objet, $retour, $options);
186
187 if ($v['_editer_date']){
188 if (!$d = dater_recuperer_date_saisie(_request('date_jour')))
189 $d = array(date('Y'),date('m'),date('d'));
190 if (!$h = dater_recuperer_heure_saisie(_request('date_heure')))
191 $h = array(0,0);
192
193 $set[$champ_date] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]);
194 }
195
196 if (isset($desc['field']['date_redac']) AND $v['_editer_date_anterieure']){
197 if (!_request('date_redac_jour') OR _request('sans_redac'))
198 $set['date_redac'] = sql_format_date(0,0,0,0,0,0);
199 else {
200 if (!$d = dater_recuperer_date_saisie(_request('date_redac_jour'), "date_redac"))
201 $d = array(date('Y'),date('m'),date('d'));
202 if (!$h = dater_recuperer_heure_saisie(_request('date_redac_heure')))
203 $h = array(0,0);
204 $set['date_redac'] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]);
205 }
206 }
207
208 if (count($set)){
209 $publie_avant = objet_test_si_publie($objet,$id_objet);
210 include_spip('action/editer_objet');
211 objet_modifier($objet, $id_objet, $set);
212 $publie_apres = objet_test_si_publie($objet,$id_objet);
213 if ($publie_avant !== $publie_apres){
214 // on refuse ajax pour forcer le rechargement de la page ici
215 // on refera traiter une 2eme fois, mais c'est sans consequence
216 refuser_traiter_formulaire_ajax();
217 }
218 }
219 }
220
221 if ($retour)
222 $res['redirect'] = $retour;
223
224 set_request('date_jour');
225 set_request('date_redac_jour');
226 set_request('date_heure');
227 set_request('date_redac_heure');
228
229 return $res;
230 }
231
232 /**
233 * Recuperer annee,mois,jour sur la date saisie
234 * @param string $post
235 * @param string $quoi
236 * @return array
237 */
238 function dater_recuperer_date_saisie($post, $quoi="date") {
239 if (!preg_match('#^(?:(?:([0-9]{1,2})[/-])?([0-9]{1,2})[/-])?([0-9]{4}|[0-9]{1,2})#', $post, $regs))
240 return '';
241 if ($quoi=="date_redac") {
242 if ($regs[3]<>'' AND $regs[3] < 1001)
243 $regs[3] += 9000;
244
245 return array($regs[3],$regs[2],$regs[1]);
246 }
247 else {
248 $t = mktime(0,0,0,$regs[2],$regs[1],$regs[3]);
249 // si la date n'est pas valide selon mktime, la refuser
250 if (!$t) return '';
251 return array(date('Y',$t),date('m',$t),date('d',$t));
252 }
253
254 }
255
256 /**
257 * Recuperer heures,minutes sur l'heure saisie
258 * @param string $post
259 * @return array
260 */
261 function dater_recuperer_heure_saisie($post) {
262 if (!preg_match('#([0-9]{1,2})(?:[h:](?:([0-9]{1,2}))?)?#', $post, $regs))
263 return '';
264 return array($regs[1],$regs[2]);
265 }
266
267 ?>