ff182110a904adfc73b5302b1c5cba46f16dd3fe
[lhc/web/www.git] / www / plugins-dist / breves / action / editer_breve.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
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 de l'action editer_breve
15 *
16 * @package SPIP\Breves\Actions
17 */
18 if (!defined('_ECRIRE_INC_VERSION')) {
19 return;
20 }
21
22 /**
23 * Action d'édition d'une brève dans la base de données dont
24 * l'identifiant est donné en paramètre de cette fonction ou
25 * en argument de l'action sécurisée
26 *
27 * Si aucun identifiant n'est donné, on crée alors une nouvelle brève.
28 *
29 * @param null|int $arg
30 * Identifiant de la brève. En absence utilise l'argument
31 * de l'action sécurisée.
32 * @return array
33 * Liste : identifiant de la brève, texte d'erreur éventuel
34 **/
35 function action_editer_breve_dist($arg = null) {
36
37 if (is_null($arg)) {
38 $securiser_action = charger_fonction('securiser_action', 'inc');
39 $arg = $securiser_action();
40 }
41
42 // Envoi depuis le formulaire d'edition d'une breve
43 if (!$id_breve = intval($arg)) {
44 $id_breve = breve_inserer(_request('id_parent'));
45 }
46
47 if (!$id_breve) {
48 return array(0, '');
49 } // erreur
50
51 $err = breve_modifier($id_breve);
52
53 return array($id_breve, $err);
54 }
55
56
57 /**
58 * Insertion d'une brève dans une rubrique
59 *
60 * @pipeline_appel pre_insertion
61 * @pipeline_appel post_insertion
62 *
63 * @param int $id_rubrique
64 * Identifiant de la rubrique
65 * @param array|null $set
66 * @return int
67 * Identifiant de la nouvelle brève.
68 */
69 function breve_inserer($id_rubrique, $set = null) {
70
71 include_spip('inc/rubriques');
72
73 // Si id_rubrique vaut 0 ou n'est pas definie, creer la breve
74 // dans la premiere rubrique racine
75 if (!$id_rubrique = intval($id_rubrique)) {
76 $id_rubrique = sql_getfetsel('id_rubrique', 'spip_rubriques', 'id_parent=0', '', '0+titre,titre', '1');
77 }
78
79 // La langue a la creation : c'est la langue de la rubrique
80 $row = sql_fetsel('lang, id_secteur', 'spip_rubriques', 'id_rubrique='.intval($id_rubrique));
81 $lang = $row['lang'];
82 $id_rubrique = $row['id_secteur']; // garantir la racine
83
84 $champs = array(
85 'id_rubrique' => $id_rubrique,
86 'statut' => 'prop',
87 'date_heure' => date('Y-m-d H:i:s'),
88 'lang' => $lang,
89 'langue_choisie' => 'non'
90 );
91
92 if ($set) {
93 $champs = array_merge($champs, $set);
94 }
95
96 // Envoyer aux plugins
97 $champs = pipeline(
98 'pre_insertion',
99 array(
100 'args' => array(
101 'table' => 'spip_breves',
102 ),
103 'data' => $champs
104 )
105 );
106 $id_breve = sql_insertq('spip_breves', $champs);
107 pipeline(
108 'post_insertion',
109 array(
110 'args' => array(
111 'table' => 'spip_breves',
112 'id_objet' => $id_breve
113 ),
114 'data' => $champs
115 )
116 );
117
118 return $id_breve;
119 }
120
121
122 /**
123 * Modifier une brève en base
124 *
125 * @param int $id_breve
126 * Identifiant de la brève à modifier
127 * @param array|null $set
128 * Couples (colonne => valeur) de données à modifier.
129 * En leur absence, on cherche les données dans les champs éditables
130 * qui ont été postés (via _request())
131 * @return string|null
132 * Chaîne vide si aucune erreur,
133 * Null si aucun champ à modifier,
134 * Chaîne contenant un texte d'erreur sinon.
135 */
136 function breve_modifier($id_breve, $set = null) {
137
138 include_spip('inc/modifier');
139 $c = collecter_requests(
140 // white list
141 array('titre', 'texte', 'lien_titre', 'lien_url'),
142 // black list
143 array('id_parent', 'statut'),
144 // donnees eventuellement fournies
145 $set
146 );
147
148 $invalideur = '';
149 $indexation = false;
150
151 // Si la breve est publiee, invalider les caches et demander sa reindexation
152 $t = sql_getfetsel('statut', 'spip_breves', 'id_breve='.intval($id_breve));
153 if ($t == 'publie') {
154 $invalideur = "id='breve/$id_breve'";
155 $indexation = true;
156 }
157
158 if ($err = objet_modifier_champs(
159 'breve',
160 $id_breve,
161 array(
162 'data' => $set,
163 'nonvide' => array('titre' => _T('breves:titre_nouvelle_breve') . ' ' . _T('info_numero_abbreviation') . $id_breve),
164 'invalideur' => $invalideur,
165 'indexation' => $indexation
166 ),
167 $c
168 )) {
169 return $err;
170 }
171
172 $c = collecter_requests(array('id_parent', 'statut'), array(), $set);
173 $err = breve_instituer($id_breve, $c);
174
175 return $err;
176 }
177
178
179 /**
180 * Instituer une brève : modifier son statut ou son parent
181 *
182 * @pipeline_appel pre_insertion
183 * @pipeline_appel post_insertion
184 *
185 * @param int $id_breve
186 * Identifiant de la brève
187 * @param array $c
188 * Couples (colonne => valeur) des données à instituer
189 * @return string|null
190 * Null si aucun champ à modifier, chaîne vide sinon.
191 */
192 function breve_instituer($id_breve, $c) {
193 $champs = array();
194
195 // Changer le statut de la breve ?
196 $row = sql_fetsel('statut, id_rubrique,lang, langue_choisie', 'spip_breves', 'id_breve=' . intval($id_breve));
197 $id_rubrique = $row['id_rubrique'];
198
199 $statut_ancien = $statut = $row['statut'];
200 $langue_old = $row['lang'];
201 $langue_choisie_old = $row['langue_choisie'];
202
203 if (isset($c['statut'])
204 and $c['statut']
205 and $c['statut'] != $statut
206 and autoriser('publierdans', 'rubrique', $id_rubrique)
207 ) {
208 $statut = $champs['statut'] = $c['statut'];
209 }
210
211 // Changer de rubrique ?
212 // Verifier que la rubrique demandee est a la racine et differente
213 // de la rubrique actuelle
214 if (
215 isset($c['id_parent'])
216 and $id_parent = intval($c['id_parent'])
217 and $id_parent != $id_rubrique
218 and (null !== ($lang = sql_getfetsel(
219 'lang',
220 'spip_rubriques',
221 'id_parent=0 AND id_rubrique=' . intval($id_parent)
222 )))
223 ) {
224 $champs['id_rubrique'] = $id_parent;
225 // - changer sa langue (si heritee)
226 if ($langue_choisie_old != 'oui') {
227 if ($lang != $langue_old) {
228 $champs['lang'] = $lang;
229 }
230 }
231 // si la breve est publiee
232 // et que le demandeur n'est pas admin de la rubrique
233 // repasser la breve en statut 'prop'.
234 if ($statut == 'publie') {
235 if (!autoriser('publierdans', 'rubrique', $id_parent)) {
236 $champs['statut'] = $statut = 'prop';
237 }
238 }
239 }
240
241 // Envoyer aux plugins
242 $champs = pipeline(
243 'pre_edition',
244 array(
245 'args' => array(
246 'table' => 'spip_breves',
247 'id_objet' => $id_breve,
248 'action' => 'instituer',
249 'statut_ancien' => $statut_ancien,
250 ),
251 'data' => $champs
252 )
253 );
254
255 if (!$champs) {
256 return;
257 }
258
259 sql_updateq('spip_breves', $champs, 'id_breve=' . intval($id_breve));
260
261 //
262 // Post-modifications
263 //
264
265 // Invalider les caches
266 include_spip('inc/invalideur');
267 suivre_invalideur("id='breve/$id_breve'");
268
269 // Au besoin, changer le statut des rubriques concernees
270 include_spip('inc/rubriques');
271 calculer_rubriques_if($id_rubrique, $champs, $statut_ancien);
272
273 // Pipeline
274 pipeline(
275 'post_edition',
276 array(
277 'args' => array(
278 'table' => 'spip_breves',
279 'id_objet' => $id_breve,
280 'action' => 'instituer',
281 'statut_ancien' => $statut_ancien,
282 ),
283 'data' => $champs
284 )
285 );
286
287
288 // Notifications
289 if ($notifications = charger_fonction('notifications', 'inc')) {
290 $notifications('instituerbreve', $id_breve,
291 array('statut' => $statut, 'statut_ancien' => $statut_ancien)
292 );
293 }
294
295 return ''; // pas d'erreur
296 }
297
298
299 // Fonctions Dépréciées
300 // --------------------
301
302 /**
303 * Insertion d'une brève dans une rubrique
304 *
305 * @deprecated Utiliser breve_inserer()
306 * @see breve_inserer()
307 *
308 * @param int $id_rubrique
309 * Identifiant de la rubrique
310 * @return int
311 * Identifiant de la nouvelle brève.
312 */
313 function insert_breve($id_rubrique) {
314 return breve_inserer($id_rubrique);
315 }
316
317 /**
318 * Créer une révision de brève
319 *
320 * @deprecated Utiliser breve_modifier()
321 * @see breve_modifier()
322 *
323 * @param int $id_breve
324 * Identifiant de la brève à modifier
325 * @param array|null $set
326 * Couples (colonne => valeur) de données à modifier.
327 * En leur absence, on cherche les données dans les champs éditables
328 * qui ont été postés (via _request())
329 * @return string|null
330 * Chaîne vide si aucune erreur,
331 * Null si aucun champ à modifier,
332 * Chaîne contenant un texte d'erreur sinon.
333 */
334 function revisions_breves($id_breve, $set = false) {
335 return breve_modifier($id_breve, $set);
336 }