source: spip-zone/_core_/plugins/mots/action/editer_mot.php @ 93543

Last change on this file since 93543 was 93543, checked in by cedric@…, 5 years ago

Fix https://core.spip.net/issues/3617 : passer $set a objet_modifier_champs pour qu'elle ne detecte les conflits sur $_POST que quand c'est pertinent

File size: 10.4 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2015                                                *
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_mot
15 *
16 * @package SPIP\Mots\Actions
17 */
18if (!defined("_ECRIRE_INC_VERSION")) return;
19
20include_spip('inc/filtres');
21
22/**
23 * Action d'édition d'un mot clé 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 un nouveau mot clé.
28 *
29 * @param null|int $arg
30 *     Identifiant du mot-clé. En absence utilise l'argument
31 *     de l'action sécurisée.
32 * @return array
33 *     Liste (identifiant du mot clé, Texte d'erreur éventuel)
34**/
35function action_editer_mot_dist($arg = null)
36{
37        if (is_null($arg)){
38                $securiser_action = charger_fonction('securiser_action', 'inc');
39                $arg = $securiser_action();
40        }
41        $id_mot = intval($arg);
42
43        $id_groupe = intval(_request('id_groupe'));
44        if (!$id_mot AND $id_groupe) {
45                $id_mot = mot_inserer($id_groupe);
46        }
47
48        // Enregistre l'envoi dans la BD
49        if ($id_mot > 0) $err = mot_modifier($id_mot);
50       
51        return array($id_mot,$err);
52}
53
54/**
55 * Insertion d'un mot dans un groupe
56 *
57 * @pipeline_appel pre_insertion
58 * @pipeline_appel post_insertion
59 *
60 * @param int $id_groupe
61 *     Identifiant du groupe de mot
62 * @param array|null $set
63 * @return int|bool
64 *     Identifiant du nouveau mot clé, false si erreur.
65 */
66function mot_inserer($id_groupe, $set = null) {
67
68        $champs = array();
69        $row = sql_fetsel("titre", "spip_groupes_mots", "id_groupe=".intval($id_groupe));
70        if ($row) {
71                $champs['id_groupe'] = $id_groupe;
72                $champs['type'] = $row['titre'];
73        }
74        else
75                return false;
76
77        if ($set)
78                $champs = array_merge($champs, $set);
79
80        // Envoyer aux plugins
81        $champs = pipeline('pre_insertion',
82                array(
83                        'args' => array(
84                                'table' => 'spip_mots',
85                        ),
86                        'data' => $champs
87                )
88        );
89
90        $id_mot = sql_insertq("spip_mots", $champs);
91
92        pipeline('post_insertion',
93                array(
94                        'args' => array(
95                                'table' => 'spip_mots',
96                                'id_objet' => $id_mot
97                        ),
98                        'data' => $champs
99                )
100        );
101
102        return $id_mot;
103}
104
105/**
106 * Modifier un mot
107 *
108 * @param int $id_mot
109 *     Identifiant du mot clé à modifier
110 * @param array|null $set
111 *     Couples (colonne => valeur) de données à modifier.
112 *     En leur absence, on cherche les données dans les champs éditables
113 *     qui ont été postés (via _request())
114 * @return string|null
115 *     - Chaîne vide si aucune erreur,
116 *     - Null si aucun champ n'est à modifier,
117 *     - Chaîne contenant un texte d'erreur sinon.
118 */
119function mot_modifier($id_mot, $set = null) {
120        include_spip('inc/modifier');
121        $c = collecter_requests(
122                // white list
123                array(
124                 'titre', 'descriptif', 'texte', 'id_groupe'
125                ),
126                // black list
127                array('id_groupe'),
128                // donnees eventuellement fournies
129                $set
130        );
131       
132        if ($err = objet_modifier_champs('mot', $id_mot,
133                array(
134                        'data' => $set,
135                        'nonvide' => array('titre' => _T('info_sans_titre'))
136                ),
137                $c))
138                return $err;
139
140        $c = collecter_requests(array('id_groupe', 'type'),array(),$set);
141        $err = mot_instituer($id_mot, $c);
142        return $err;
143}
144
145/**
146 * Instituer un mot clé : modifier son groupe parent
147 *
148 * @pipeline_appel pre_insertion
149 * @pipeline_appel post_insertion
150 *
151 * @param int $id_mot
152 *     Identifiant du mot clé
153 * @param array $c
154 *     Couples (colonne => valeur) des données à instituer
155 * @return null|string
156 *     Null si aucun champ à modifier, chaîne vide sinon.
157 */
158function mot_instituer($id_mot, $c){
159        $champs = array();
160        // regler le groupe
161        if (isset($c['id_groupe']) OR isset($c['type'])) {
162                $row = sql_fetsel("titre", "spip_groupes_mots", "id_groupe=".intval($c['id_groupe']));
163                if ($row) {
164                        $champs['id_groupe'] = $c['id_groupe'];
165                        $champs['type'] = $row['titre'];
166                }
167        }
168
169        // Envoyer aux plugins
170        $champs = pipeline('pre_edition',
171                array(
172                        'args' => array(
173                                'table' => 'spip_mots',
174                                'id_objet' => $id_mot,
175                                'action'=>'instituer',
176                        ),
177                        'data' => $champs
178                )
179        );
180
181        if (!$champs) return;
182
183        sql_updateq('spip_mots', $champs, "id_mot=".intval($id_mot));
184
185        //
186        // Post-modifications
187        //
188
189        // Invalider les caches
190        include_spip('inc/invalideur');
191        suivre_invalideur("id='mot/$id_mot'");
192
193        // Pipeline
194        pipeline('post_edition',
195                array(
196                        'args' => array(
197                                'table' => 'spip_mots',
198                                'id_objet' => $id_mot,
199                                'action'=>'instituer',
200                        ),
201                        'data' => $champs
202                )
203        );
204
205        // Notifications
206        if ($notifications = charger_fonction('notifications', 'inc')) {
207                $notifications('instituermot', $id_mot,
208                        array('id_groupe' => $champs['id_groupe'])
209                );
210        }
211
212        return ''; // pas d'erreur
213}
214
215/**
216 * Supprimer un mot
217 *
218 * @pipeline_appel trig_supprimer_objets_lies
219 *
220 * @param int $id_mot
221 *     Identifiant du mot clé à supprimer
222 * @return void
223 */
224function mot_supprimer($id_mot) {
225        sql_delete("spip_mots", "id_mot=".intval($id_mot));
226        mot_dissocier($id_mot, '*');
227        pipeline('trig_supprimer_objets_lies',
228                array(
229                        array('type'=>'mot','id'=>$id_mot)
230                )
231        );
232}
233
234
235
236/**
237 * Associer un mot à des objets listés sous forme
238 * `array($objet=>$id_objets,...)`
239 *
240 * $id_objets peut lui-même être un scalaire ou un tableau pour une
241 * liste d'objets du même type
242 *
243 * On peut passer optionnellement une qualification du (des) lien(s) qui sera
244 * alors appliquée dans la foulée. En cas de lot de liens, c'est la
245 * même qualification qui est appliquée à tous.
246 *
247 * @example
248 *     ```
249 *     mot_associer(3, array('auteur'=>2));
250 *     // Ne fonctionnera pas ici car pas de champ 'vu' sur spip_mots_liens :
251 *     mot_associer(3, array('auteur'=>2), array('vu'=>'oui));
252 *     ```
253 *
254 * @param int $id_mot
255 *     Identifiant du mot à faire associer
256 * @param array $objets
257 *     Description des associations à faire
258 * @param array $qualif
259 *     Couples (colonne => valeur) de qualifications à faire appliquer
260 * @return int|bool
261 *     Nombre de modifications, false si erreur
262 */
263function mot_associer($id_mot, $objets, $qualif = null){
264
265        include_spip('action/editer_liens');
266
267        // si il s'agit d'un groupe avec 'unseul', alors supprimer d'abord les autres
268        // mots de ce groupe associe a ces objets
269        $id_groupe = sql_getfetsel('id_groupe','spip_mots','id_mot='.intval($id_mot));
270        if (un_seul_mot_dans_groupe($id_groupe)) {
271                $mots_groupe = sql_allfetsel("id_mot", "spip_mots", "id_groupe=".intval($id_groupe));
272                $mots_groupe = array_map('reset',$mots_groupe);
273                objet_dissocier(array('mot'=>$mots_groupe), $objets);
274        }
275
276        return objet_associer(array('mot'=>$id_mot), $objets, $qualif);
277}
278
279
280
281/**
282 * Dissocier un mot des objets listés sous forme
283 * `array($objet=>$id_objets,...)`
284 *
285 * $id_objets peut lui-même être un scalaire ou un tableau pour une
286 * liste d'objets du même type
287 *
288 * un * pour $id_mot,$objet,$id_objet permet de traiter par lot
289 *
290 * @param int $id_mot
291 *     Identifiant du mot à faire dissocier
292 * @param array $objets
293 *     Description des dissociations à faire
294 * @return int|bool
295 *     Nombre de modifications, false si erreur
296 */
297function mot_dissocier($id_mot, $objets){
298        include_spip('action/editer_liens');
299        return objet_dissocier(array('mot'=>$id_mot), $objets);
300}
301
302/**
303 * Qualifier le lien d'un mot avec les objets listés
304 * `array($objet=>$id_objets,...)`
305 *
306 * $id_objets peut lui-même être un scalaire ou un tableau pour une
307 * liste d'objets du même type
308 *
309 * Une * pour $id_auteur,$objet,$id_objet permet de traiter par lot
310 *
311 * @example
312 *     ```
313 *     $c = array('vu'=>'oui');
314 *     ```
315 *
316 * @param int $id_mot
317 *     Identifiant du mot à faire associer
318 * @param array $objets
319 *     Description des associations à faire
320 * @param array $qualif
321 *     Couples (colonne => valeur) de qualifications à faire appliquer
322 * @return int|bool
323 *     Nombre de modifications, false si erreur
324 */
325function mot_qualifier($id_mot, $objets, $qualif){
326        include_spip('action/editer_liens');
327        return objet_qualifier(array('mot'=>$id_mot), $objets, $qualif);
328}
329
330
331
332/**
333 * Teste si un groupe ne doit avoir qu'un seul mot clé associé
334 *
335 * Renvoyer TRUE si le groupe de mot ne doit être associé qu'une fois aux objet
336 * (maximum un seul mot de ce groupe associé à chaque objet)
337 *
338 * @param int $id_groupe
339 *     Identifiant du groupe de mot clé
340 * @return bool
341 *     true si un seul mot doit être lié avec ce groupe, false sinon.
342 */
343function un_seul_mot_dans_groupe($id_groupe)
344{
345        return sql_countsel('spip_groupes_mots', "id_groupe=$id_groupe AND unseul='oui'");
346}
347
348
349
350// Fonctions Dépréciées
351// --------------------
352
353/**
354 * Insertion d'un mot dans un groupe
355 *
356 * @deprecated Utiliser mot_inserer()
357 * @see mot_inserer()
358 *
359 * @param int $id_groupe
360 *     Identifiant du groupe de mot
361 * @return int|bool
362 *     Identifiant du nouveau mot clé, false si erreur.
363 */
364function insert_mot($id_groupe) {
365        return mot_inserer($id_groupe);
366}
367
368/**
369 * Modifier un mot
370 *
371 * @deprecated Utiliser mot_modifier()
372 * @see mot_modifier()
373 *
374 * @param int $id_mot
375 *     Identifiant du mot clé à modifier
376 * @param array|null $set
377 *     Couples (colonne => valeur) de données à modifier.
378 *     En leur absence, on cherche les données dans les champs éditables
379 *     qui ont été postés
380 * @return string|null
381 *     - Chaîne vide si aucune erreur,
382 *     - Null si aucun champ à modifier,
383 *     - Chaîne contenant un texte d'erreur sinon.
384 */
385function mots_set($id_mot, $set = null) {
386        return mot_modifier($id_mot, $set);
387}
388
389/**
390 * Créer une révision d'un mot
391 *
392 * @deprecated Utiliser mot_modifier()
393 * @see mot_modifier()
394 *
395 * @param int $id_mot
396 *     Identifiant du mot clé à modifier
397 * @param array|null $c
398 *     Couples (colonne => valeur) de données à modifier.
399 *     En leur absence, on cherche les données dans les champs éditables
400 *     qui ont été postés
401 * @return string|null
402 *     - Chaîne vide si aucune erreur,
403 *     - Null si aucun champ à modifier,
404 *     - Chaîne contenant un texte d'erreur sinon.
405 */
406function revision_mot($id_mot, $c = false) {
407        return mot_modifier($id_mot, $c);
408}
409
410?>
Note: See TracBrowser for help on using the repository browser.