source: spip-zone/_plugins_/dictionnaires/trunk/action/editer_dictionnaire.php @ 93554

Last change on this file since 93554 was 93554, checked in by cedric@…, 4 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: 4.9 KB
Line 
1<?php
2
3/**
4 * Gestion de l'action editer_dictionnaire
5 *
6 * @package SPIP\Dictionnaires\Actions
7 */
8
9// Sécurité
10if (!defined('_ECRIRE_INC_VERSION')) return;
11
12
13/**
14 * Action d'édition d'un dictionnaire dans la base de données dont
15 * l'identifiant est donné en paramètre de cette fonction ou
16 * en argument de l'action sécurisée
17 *
18 * Si aucun identifiant n'est donné, on crée alors un nouveau dictionnaire.
19 *
20 * @param null|int $arg
21 *     Identifiant du dictionnaire. En absence utilise l'argument
22 *     de l'action sécurisée.
23 * @return array
24 *     Liste (identifiant du dictionnaire, Texte d'erreur éventuel)
25**/
26function action_editer_dictionnaire_dist($arg=null) {
27        if (is_null($arg)){
28                $securiser_action = charger_fonction('securiser_action', 'inc');
29                $arg = $securiser_action();
30        }
31
32        // si id_dictionnaire n'est pas un nombre, c'est une creation
33        if (!$id_dictionnaire = intval($arg)) {
34                $id_dictionnaire = insert_dictionnaire();
35        }
36
37        // Enregistre l'envoi dans la BD
38        if ($id_dictionnaire > 0) $err = dictionnaire_set($id_dictionnaire);
39
40        return array($id_dictionnaire,$err);
41}
42
43/**
44 * Crée un nouveau dictionnaire et retourne son ID
45 *
46 * @param array $champs
47 *     Un tableau avec les champs par défaut lors de l'insertion
48 * @return int
49 *     Identifiant du nouveau dictionnaire
50 */
51function insert_dictionnaire($champs=array()) {
52        // Envoyer aux plugins avant insertion
53        $champs = pipeline('pre_insertion',
54                array(
55                        'args' => array(
56                                'table' => 'spip_dictionnaires',
57                        ),
58                        'data' => $champs
59                )
60        );
61        // Insérer l'objet
62        $id_dictionnaire = sql_insertq('spip_dictionnaires', $champs);
63        // Envoyer aux plugins après insertion
64        pipeline('post_insertion',
65                array(
66                        'args' => array(
67                                'table' => 'spip_dictionnaires',
68                                'id_objet' => $id_dictionnaire
69                        ),
70                        'data' => $champs
71                )
72        );
73
74        return $id_dictionnaire;
75}
76
77/**
78 * Modifier un dictionnaire
79 *
80 * @param int $id_dictionnaire
81 *     Identifiant du dictionnaire à modifier
82 * @param array|null $set
83 *     Couples (colonne => valeur) de données à modifier.
84 *     En leur absence, on cherche les données dans les champs éditables
85 *     qui ont été postés (via _request())
86 * @return string|null
87 *     Chaîne vide si aucune erreur,
88 *     Null si aucun champ à modifier,
89 *     Chaîne contenant un texte d'erreur sinon.
90 */
91function dictionnaire_set($id_dictionnaire, $set=null) {
92        $err = '';
93
94        include_spip('base/objets');
95        $desc = lister_tables_objets_sql('spip_dictionnaires');
96
97        include_spip('inc/modifier');
98        $c = collecter_requests(
99                // white list
100                $desc['champs_editables'],
101                // black list
102                array(),
103                // donnees eventuellement fournies
104                $set
105        );
106
107
108        if ($err = objet_modifier_champs('dictionnaire', $id_dictionnaire,
109                array(
110                        'data' => $set,
111                        'nonvide' => array('titre' => _T('info_sans_titre'))
112                ),
113                $c)) {
114                return $err;
115        }
116
117        $c = collecter_requests(array('statut'),array(),$set);
118        $err = instituer_dictionnaire($id_dictionnaire, $c);
119        return $err;
120}
121
122
123/**
124 * Instituer un dictionnaire : modifier son statut
125 *
126 * @pipeline_appel pre_insertion
127 * @pipeline_appel post_insertion
128 *
129 * @param int $id_dictionnaire
130 *     Identifiant du dictionnaire
131 * @param array $c
132 *     Couples (colonne => valeur) des données à instituer
133 * @return null|string
134 *     Null si aucun champ à modifier, chaîne vide sinon.
135 */
136function instituer_dictionnaire($id_dictionnaire, $c){
137        include_spip('inc/autoriser');
138        include_spip('base/objets');
139        $desc = lister_tables_objets_sql('spip_dictionnaires');
140
141        if (isset($c['statut']) and in_array(($statut = $c['statut']), array_keys($desc['statut_textes_instituer']))){
142                $ancien = sql_getfetsel('statut', 'spip_dictionnaires', 'id_dictionnaire = '.$id_dictionnaire);
143                $champs = array();
144
145                // Seulement si on change le statut et qu'on a le droit
146                if ($statut != $ancien and autoriser('modifier', 'dictionnaire', $id_dictionnaire)){
147                        $champs['statut'] = $statut;
148                }
149               
150                // Envoyer aux plugins
151                $champs = pipeline(
152                        'pre_edition',
153                        array(
154                                'args' => array(
155                                        'table' => 'spip_dictionnaires',
156                                        'id_objet' => $id_dictionnaire,
157                                        'action' => 'instituer',
158                                        'statut_ancien' => $ancien,
159                                ),
160                                'data' => $champs
161                        )
162                );
163               
164                if (!count($champs)) return;
165               
166                // Invalider les caches
167                include_spip('inc/invalideur');
168                suivre_invalideur("id='id_dictionnaire/$id_dictionnaire'");
169               
170                sql_updateq(
171                        'spip_dictionnaires',
172                        $champs,
173                        'id_dictionnaire = '.$id_dictionnaire
174                );
175               
176                // Pipeline
177                pipeline(
178                        'post_edition',
179                        array(
180                                'args' => array(
181                                        'table' => 'spip_dictionnaires',
182                                        'id_objet' => $id_dictionnaire,
183                                        'action' => 'instituer',
184                                        'statut_ancien' => $ancien,
185                                ),
186                                'data' => $champs
187                        )
188                );
189
190                // Notifications
191                if ($notifications = charger_fonction('notifications', 'inc')) {
192                        $notifications('instituerdictionnaire', $id_dictionnaire, $champs);
193                }
194
195                // On refait le cache des définitions
196                include_spip('inc/dictionnaires');
197                dictionnaires_lister_definitions(true);
198        }
199
200        return '';
201}
202
203?>
Note: See TracBrowser for help on using the repository browser.