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

Last change on this file since 93554 was 93554, 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: 8.1 KB
Line 
1<?php
2
3
4/**
5 * Gestion de l'action editer_definition
6 *
7 * @package SPIP\Dictionnaires\Actions
8 */
9 
10// Sécurité
11if (!defined('_ECRIRE_INC_VERSION')) return;
12
13/**
14 * Action d'édition d'une définition de 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 une nouvelle définition.
19 *
20 * @param null|int $arg
21 *     Identifiant de la définition. En absence utilise l'argument
22 *     de l'action sécurisée.
23 * @return array
24 *     Liste (identifiant de la définition, Texte d'erreur éventuel)
25**/
26function action_editer_definition_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_definition n'est pas un nombre, c'est une creation
33        if (!$id_definition = intval($arg)) {
34                $id_definition = insert_definition();
35        }
36
37        // Enregistre l'envoi dans la BD
38        if ($id_definition > 0) $err = definition_set($id_definition);
39
40        return array($id_definition, $err);
41}
42
43
44/**
45 * Crée une nouvelle définition de dictionnaire
46 *
47 * @param array $champs
48 *     Un tableau avec les champs par défaut lors de l'insertion
49 * @return int
50 *     Identifiant de la nouvelle définition
51 */
52function insert_definition($champs=array()) {
53        $lang = "";
54        // La langue a la creation : si les liens de traduction sont autorises
55        // dans les definitions, on essaie avec la langue de l'auteur
56        if (in_array('spip_definitions',explode(',',$GLOBALS['meta']['multi_objets']))) {
57                lang_select($GLOBALS['visiteur_session']['lang']);
58                if (in_array($GLOBALS['spip_lang'],
59                explode(',', $GLOBALS['meta']['langues_multilingue']))) {
60                        $lang = $GLOBALS['spip_lang'];
61                }
62        }
63
64        if (!$lang) {
65                $lang = $GLOBALS['meta']['langue_site'];
66        }
67       
68        $champs['lang'] = $lang;
69       
70        // Envoyer aux plugins avant insertion
71        $champs = pipeline('pre_insertion',
72                array(
73                        'args' => array(
74                                'table' => 'spip_definitions',
75                        ),
76                        'data' => $champs
77                )
78        );
79        // Insérer l'objet
80        $id_definition = sql_insertq('spip_definitions', $champs);
81       
82        // Envoyer aux plugins après insertion
83        pipeline('post_insertion',
84                array(
85                        'args' => array(
86                                'table' => 'spip_definitions',
87                                'id_objet' => $id_definition
88                        ),
89                        'data' => $champs
90                )
91        );
92
93        return $id_definition;
94}
95
96
97/**
98 * Modifier une définition
99 *
100 * @param int $id_definition
101 *     Identifiant de la définition à modifier
102 * @param array|null $set
103 *     Couples (colonne => valeur) de données à modifier.
104 *     En leur absence, on cherche les données dans les champs éditables
105 *     qui ont été postés (via _request())
106 * @param bool $purger_cache
107 *     true pour purcher le cache des définitions au passage lors de l'institution
108 * @return string|null
109 *     Chaîne vide si aucune erreur,
110 *     Null si aucun champ à modifier,
111 *     Chaîne contenant un texte d'erreur sinon.
112 */
113function definition_set($id_definition, $set=null, $purger_cache=true) {
114        $err = '';
115
116        include_spip('base/objets');
117        $desc = lister_tables_objets_sql('spip_definitions');
118
119        include_spip('inc/modifier');
120        $c = collecter_requests(
121                // white list
122                $desc['champs_editables'],
123                // black list
124                array(),
125                // donnees eventuellement fournies
126                $set
127        );
128
129        // Pour le parent on fera plus tard
130        unset($c['id_dictionnaire']);
131
132        if ($err = objet_modifier_champs('definition', $id_definition,
133                array(
134                        'data' => $set,
135                        'nonvide' => array('titre' => _T('info_sans_titre'))
136                ),
137                $c)) {
138                return $err;
139        }
140
141        $c = collecter_requests(array('date', 'statut', 'id_dictionnaire'),array(),$set);
142        $err = instituer_definition($id_definition, $c, $purger_cache);
143        return $err;
144}
145
146
147/**
148 * Instituer une définition : modifier son statut, date, parent
149 *
150 * @pipeline_appel pre_insertion
151 * @pipeline_appel post_insertion
152 *
153 * @param int $id_definition
154 *     Identifiant de la définition
155 * @param array $c
156 *     Couples (colonne => valeur) des données à instituer
157 * @param bool $purger_cache
158 *     true pour purcher le cache des définitions au passage
159 * @return null|string
160 *     Null si aucun champ à modifier, chaîne vide sinon.
161 */
162function instituer_definition($id_definition, $c, $purger_cache=true){
163        include_spip('inc/autoriser');
164        include_spip('inc/rubriques');
165        include_spip('inc/modifier');
166       
167        $row = sql_fetsel('statut, date, id_dictionnaire', 'spip_definitions', "id_definition=$id_definition");
168        $id_dictionnaire = $row['id_dictionnaire'];
169        $statut_ancien = $statut = $row['statut'];
170        $date_ancienne = $date = $row['date'];
171        $champs = array();
172       
173        $d = isset($c['date']) ? $c['date'] : null;
174        $s = isset($c['statut']) ? $c['statut'] : $statut;
175       
176        // On ne modifie le statut que si c'est autorisé
177        if ($s != $statut or ($d AND $d != $date)) {
178                if (autoriser('publierdans', 'dictionnaire', $id_dictionnaire))
179                        $statut = $champs['statut'] = $s;
180                else if (autoriser('modifier', 'definition', $id_definition) and $s != 'publie')
181                        $statut = $champs['statut'] = $s;
182                else
183                        spip_log("editer_definition $id_definition refus " . join(' ', $c));
184
185                // En cas de publication, fixer la date a "maintenant"
186                // sauf si $c commande autre chose
187                // ou si le produit est deja date dans le futur
188                // En cas de proposition d'une définition (mais pas depublication), idem
189                if ($champs['statut'] == 'publie'
190                        or ($champs['statut'] == 'prop' and ($d or !in_array($statut_ancien, array('publie', 'prop'))))
191                ){
192                        if ($d or strtotime($d=$date)>time())
193                                $champs['date'] = $date = $d;
194                        else
195                                $champs['date'] = $date = date('Y-m-d H:i:s');
196                }
197        }
198       
199        // Verifier que la rubrique demandee existe et est differente
200        // de la rubrique actuelle
201        if ($id_dictionnaire_new = $c['id_dictionnaire']
202                and $id_dictionnaire_new != $id_dictionnaire
203                and (sql_fetsel('1', 'spip_dictionnaires', "id_dictionnaire=$id_dictionnaire_new"))
204        ){
205                $champs['id_dictionnaire'] = $id_dictionnaire_new;
206
207                // Si la définition était publiée
208                // et que le demandeur n'est pas admin du dictionnaire où c'était
209                // repasser le produit en statut 'proposé'.
210                if ($statut == 'publie'
211                        and !autoriser('publierdans', 'dictionnaire', $id_dictionnaire)
212                )
213                        $champs['statut'] = 'prop';
214        }
215       
216        // Envoyer aux plugins
217        $champs = pipeline(
218                'pre_edition',
219                array(
220                        'args' => array(
221                                'table' => 'spip_definitions',
222                                'id_objet' => $id_definition,
223                                'action' => 'instituer',
224                                'statut_ancien' => $statut_ancien,
225                        ),
226                        'data' => $champs
227                )
228        );
229        // Si à ce stade il n'y a pas de champs à modifier
230        // on arrête là mais on refait quand même le cache des définitions si besoin
231        if (!count($champs)){
232                // On refait le cache des définitions si le nouveau ou l'ancien statut était publié
233                if ($purger_cache and $statut_ancien == 'publie'){
234                        include_spip('inc/dictionnaires');
235                        dictionnaires_lister_definitions(true);
236                }
237                return;
238        }
239       
240        // Envoyer les modifications et calculer les héritages
241#       editer_definition_heritage($id_definition, $id_dictionnaire, $statut_ancien, $champs, $calcul_rub);
242        sql_updateq('spip_definitions', $champs, "id_definition=$id_definition");
243       
244        // Invalider les caches
245        include_spip('inc/invalideur');
246        suivre_invalideur("id='id_definition/$id_definition'");
247       
248        if ($date) {
249                $t = strtotime($date);
250                $p = @$GLOBALS['meta']['date_prochain_postdate'];
251                if ($t > time() AND (!$p OR ($t < $p))) {
252                        ecrire_meta('date_prochain_postdate', $t);
253                }
254        }
255       
256        // Pipeline
257        pipeline(
258                'post_edition',
259                array(
260                        'args' => array(
261                                'table' => 'spip_definitions',
262                                'id_objet' => $id_definition,
263                                'action' => 'instituer',
264                                'statut_ancien' => $statut_ancien,
265                        ),
266                        'data' => $champs
267                )
268        );
269
270        // On refait le cache des définitions si le nouveau ou l'ancien statut était publié
271        if ($purger_cache and ((isset($champs['statut']) AND $champs['statut'] == 'publie')
272                 OR $statut_ancien == 'publie'))
273                {
274                        include_spip('inc/dictionnaires');
275                        dictionnaires_lister_definitions(true);
276        }
277
278        // Notifications
279        if ($notifications = charger_fonction('notifications', 'inc', true)) {
280                $notifications('definition_instituer', $id_definition,
281                        array('statut' => $statut, 'statut_ancien' => $statut_ancien, 'date'=>$date)
282                );
283        }
284       
285        return '';
286}
287
288?>
Note: See TracBrowser for help on using the repository browser.