3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2019 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
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 \***************************************************************************/
14 * Gestion de l'action editer_mot
16 * @package SPIP\Mots\Actions
18 if (!defined('_ECRIRE_INC_VERSION')) {
22 include_spip('inc/filtres');
25 * Action d'édition d'un mot clé dans la base de données dont
26 * l'identifiant est donné en paramètre de cette fonction ou
27 * en argument de l'action sécurisée
29 * Si aucun identifiant n'est donné, on crée alors un nouveau mot clé.
31 * @param null|int $arg
32 * Identifiant du mot-clé. En absence utilise l'argument
33 * de l'action sécurisée.
35 * Liste (identifiant du mot clé, Texte d'erreur éventuel)
37 function action_editer_mot_dist($arg = null) {
39 $securiser_action = charger_fonction('securiser_action', 'inc');
40 $arg = $securiser_action();
42 $id_mot = intval($arg);
44 $id_groupe = intval(_request('id_groupe'));
45 if (!$id_mot and $id_groupe) {
46 $id_mot = mot_inserer($id_groupe);
49 // Enregistre l'envoi dans la BD
51 $err = mot_modifier($id_mot);
54 return array($id_mot, $err);
58 * Insertion d'un mot dans un groupe
60 * @pipeline_appel pre_insertion
61 * @pipeline_appel post_insertion
63 * @param int $id_groupe
64 * Identifiant du groupe de mot
65 * @param array|null $set
67 * Identifiant du nouveau mot clé, false si erreur.
69 function mot_inserer($id_groupe, $set = null) {
72 $row = sql_fetsel('titre', 'spip_groupes_mots', 'id_groupe=' . intval($id_groupe));
74 $champs['id_groupe'] = $id_groupe;
75 $champs['type'] = $row['titre'];
81 $champs = array_merge($champs, $set);
84 // Envoyer aux plugins
89 'table' => 'spip_mots',
95 $id_mot = sql_insertq('spip_mots', $champs);
101 'table' => 'spip_mots',
102 'id_objet' => $id_mot
115 * Identifiant du mot clé à modifier
116 * @param array|null $set
117 * Couples (colonne => valeur) de données à modifier.
118 * En leur absence, on cherche les données dans les champs éditables
119 * qui ont été postés (via _request())
120 * @return string|null
121 * - Chaîne vide si aucune erreur,
122 * - Null si aucun champ n'est à modifier,
123 * - Chaîne contenant un texte d'erreur sinon.
125 function mot_modifier($id_mot, $set = null) {
126 include_spip('inc/modifier');
127 $c = collecter_requests(
137 // donnees eventuellement fournies
141 if ($err = objet_modifier_champs(
146 'nonvide' => array('titre' => _T('info_sans_titre'))
153 $c = collecter_requests(array('id_groupe', 'type'), array(), $set);
154 $err = mot_instituer($id_mot, $c);
160 * Instituer un mot clé : modifier son groupe parent
162 * @pipeline_appel pre_insertion
163 * @pipeline_appel post_insertion
166 * Identifiant du mot clé
168 * Couples (colonne => valeur) des données à instituer
169 * @return null|string
170 * Null si aucun champ à modifier, chaîne vide sinon.
172 function mot_instituer($id_mot, $c) {
175 if (isset($c['id_groupe']) or isset($c['type'])) {
176 $row = sql_fetsel('titre', 'spip_groupes_mots', 'id_groupe=' . intval($c['id_groupe']));
178 $champs['id_groupe'] = $c['id_groupe'];
179 $champs['type'] = $row['titre'];
183 // Envoyer aux plugins
188 'table' => 'spip_mots',
189 'id_objet' => $id_mot,
190 'action' => 'instituer',
200 sql_updateq('spip_mots', $champs, 'id_mot=' . intval($id_mot));
203 // Post-modifications
206 // Invalider les caches
207 include_spip('inc/invalideur');
208 suivre_invalideur("id='mot/$id_mot'");
215 'table' => 'spip_mots',
216 'id_objet' => $id_mot,
217 'action' => 'instituer',
224 if ($notifications = charger_fonction('notifications', 'inc')) {
225 $notifications('instituermot', $id_mot,
226 array('id_groupe' => $champs['id_groupe'])
230 return ''; // pas d'erreur
236 * @pipeline_appel trig_supprimer_objets_lies
239 * Identifiant du mot clé à supprimer
242 function mot_supprimer($id_mot) {
243 sql_delete('spip_mots', 'id_mot=' . intval($id_mot));
244 mot_dissocier($id_mot, '*');
246 'trig_supprimer_objets_lies',
248 array('type' => 'mot', 'id' => $id_mot)
255 * Associer un mot à des objets listés sous forme
256 * `array($objet=>$id_objets,...)`
258 * $id_objets peut lui-même être un scalaire ou un tableau pour une
259 * liste d'objets du même type
261 * On peut passer optionnellement une qualification du (des) lien(s) qui sera
262 * alors appliquée dans la foulée. En cas de lot de liens, c'est la
263 * même qualification qui est appliquée à tous.
267 * mot_associer(3, array('auteur'=>2));
268 * // Ne fonctionnera pas ici car pas de champ 'vu' sur spip_mots_liens :
269 * mot_associer(3, array('auteur'=>2), array('vu'=>'oui));
273 * Identifiant du mot à faire associer
274 * @param array $objets
275 * Description des associations à faire
276 * @param array $qualif
277 * Couples (colonne => valeur) de qualifications à faire appliquer
279 * Nombre de modifications, false si erreur
281 function mot_associer($id_mot, $objets, $qualif = null) {
283 include_spip('action/editer_liens');
285 // si il s'agit d'un groupe avec 'unseul', alors supprimer d'abord les autres
286 // mots de ce groupe associe a ces objets
287 $id_groupe = sql_getfetsel('id_groupe', 'spip_mots', 'id_mot=' . intval($id_mot));
288 if (un_seul_mot_dans_groupe($id_groupe)) {
289 $mots_groupe = sql_allfetsel('id_mot', 'spip_mots', 'id_groupe=' . intval($id_groupe));
290 $mots_groupe = array_map('reset', $mots_groupe);
291 objet_dissocier(array('mot' => $mots_groupe), $objets);
294 return objet_associer(array('mot' => $id_mot), $objets, $qualif);
299 * Dissocier un mot des objets listés sous forme
300 * `array($objet=>$id_objets,...)`
302 * $id_objets peut lui-même être un scalaire ou un tableau pour une
303 * liste d'objets du même type
305 * un * pour $id_mot,$objet,$id_objet permet de traiter par lot
308 * Identifiant du mot à faire dissocier
309 * @param array $objets
310 * Description des dissociations à faire
312 * Nombre de modifications, false si erreur
314 function mot_dissocier($id_mot, $objets) {
315 include_spip('action/editer_liens');
317 return objet_dissocier(array('mot' => $id_mot), $objets);
321 * Qualifier le lien d'un mot avec les objets listés
322 * `array($objet=>$id_objets,...)`
324 * $id_objets peut lui-même être un scalaire ou un tableau pour une
325 * liste d'objets du même type
327 * Une * pour $id_auteur,$objet,$id_objet permet de traiter par lot
331 * $c = array('vu'=>'oui');
335 * Identifiant du mot à faire associer
336 * @param array $objets
337 * Description des associations à faire
338 * @param array $qualif
339 * Couples (colonne => valeur) de qualifications à faire appliquer
341 * Nombre de modifications, false si erreur
343 function mot_qualifier($id_mot, $objets, $qualif) {
344 include_spip('action/editer_liens');
346 return objet_qualifier(array('mot' => $id_mot), $objets, $qualif);
351 * Teste si un groupe ne doit avoir qu'un seul mot clé associé
353 * Renvoyer TRUE si le groupe de mot ne doit être associé qu'une fois aux objet
354 * (maximum un seul mot de ce groupe associé à chaque objet)
356 * @param int $id_groupe
357 * Identifiant du groupe de mot clé
359 * true si un seul mot doit être lié avec ce groupe, false sinon.
361 function un_seul_mot_dans_groupe($id_groupe) {
362 return sql_countsel('spip_groupes_mots', "id_groupe=$id_groupe AND unseul='oui'");
366 // Fonctions Dépréciées
367 // --------------------
370 * Insertion d'un mot dans un groupe
372 * @deprecated Utiliser mot_inserer()
375 * @param int $id_groupe
376 * Identifiant du groupe de mot
378 * Identifiant du nouveau mot clé, false si erreur.
380 function insert_mot($id_groupe) {
381 return mot_inserer($id_groupe);
387 * @deprecated Utiliser mot_modifier()
388 * @see mot_modifier()
391 * Identifiant du mot clé à modifier
392 * @param array|null $set
393 * Couples (colonne => valeur) de données à modifier.
394 * En leur absence, on cherche les données dans les champs éditables
396 * @return string|null
397 * - Chaîne vide si aucune erreur,
398 * - Null si aucun champ à modifier,
399 * - Chaîne contenant un texte d'erreur sinon.
401 function mots_set($id_mot, $set = null) {
402 return mot_modifier($id_mot, $set);
406 * Créer une révision d'un mot
408 * @deprecated Utiliser mot_modifier()
409 * @see mot_modifier()
412 * Identifiant du mot clé à modifier
413 * @param array|null $c
414 * Couples (colonne => valeur) de données à modifier.
415 * En leur absence, on cherche les données dans les champs éditables
417 * @return string|null
418 * - Chaîne vide si aucune erreur,
419 * - Null si aucun champ à modifier,
420 * - Chaîne contenant un texte d'erreur sinon.
422 function revision_mot($id_mot, $c = false) {
423 return mot_modifier($id_mot, $c);