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

Last change on this file since 92115 was 92115, checked in by kent1@…, 4 years ago

Pouvoir avoir des traductions de définition

version 1.1.0 (grosse modification)

File size: 8.0 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                        'nonvide' => array('titre' => _T('info_sans_titre'))
135                ),
136                $c)) {
137                return $err;
138        }
139
140        $c = collecter_requests(array('date', 'statut', 'id_dictionnaire'),array(),$set);
141        $err = instituer_definition($id_definition, $c, $purger_cache);
142        return $err;
143}
144
145
146/**
147 * Instituer une définition : modifier son statut, date, parent
148 *
149 * @pipeline_appel pre_insertion
150 * @pipeline_appel post_insertion
151 *
152 * @param int $id_definition
153 *     Identifiant de la définition
154 * @param array $c
155 *     Couples (colonne => valeur) des données à instituer
156 * @param bool $purger_cache
157 *     true pour purcher le cache des définitions au passage
158 * @return null|string
159 *     Null si aucun champ à modifier, chaîne vide sinon.
160 */
161function instituer_definition($id_definition, $c, $purger_cache=true){
162        include_spip('inc/autoriser');
163        include_spip('inc/rubriques');
164        include_spip('inc/modifier');
165       
166        $row = sql_fetsel('statut, date, id_dictionnaire', 'spip_definitions', "id_definition=$id_definition");
167        $id_dictionnaire = $row['id_dictionnaire'];
168        $statut_ancien = $statut = $row['statut'];
169        $date_ancienne = $date = $row['date'];
170        $champs = array();
171       
172        $d = isset($c['date']) ? $c['date'] : null;
173        $s = isset($c['statut']) ? $c['statut'] : $statut;
174       
175        // On ne modifie le statut que si c'est autorisé
176        if ($s != $statut or ($d AND $d != $date)) {
177                if (autoriser('publierdans', 'dictionnaire', $id_dictionnaire))
178                        $statut = $champs['statut'] = $s;
179                else if (autoriser('modifier', 'definition', $id_definition) and $s != 'publie')
180                        $statut = $champs['statut'] = $s;
181                else
182                        spip_log("editer_definition $id_definition refus " . join(' ', $c));
183
184                // En cas de publication, fixer la date a "maintenant"
185                // sauf si $c commande autre chose
186                // ou si le produit est deja date dans le futur
187                // En cas de proposition d'une définition (mais pas depublication), idem
188                if ($champs['statut'] == 'publie'
189                        or ($champs['statut'] == 'prop' and ($d or !in_array($statut_ancien, array('publie', 'prop'))))
190                ){
191                        if ($d or strtotime($d=$date)>time())
192                                $champs['date'] = $date = $d;
193                        else
194                                $champs['date'] = $date = date('Y-m-d H:i:s');
195                }
196        }
197       
198        // Verifier que la rubrique demandee existe et est differente
199        // de la rubrique actuelle
200        if ($id_dictionnaire_new = $c['id_dictionnaire']
201                and $id_dictionnaire_new != $id_dictionnaire
202                and (sql_fetsel('1', 'spip_dictionnaires', "id_dictionnaire=$id_dictionnaire_new"))
203        ){
204                $champs['id_dictionnaire'] = $id_dictionnaire_new;
205
206                // Si la définition était publiée
207                // et que le demandeur n'est pas admin du dictionnaire où c'était
208                // repasser le produit en statut 'proposé'.
209                if ($statut == 'publie'
210                        and !autoriser('publierdans', 'dictionnaire', $id_dictionnaire)
211                )
212                        $champs['statut'] = 'prop';
213        }
214       
215        // Envoyer aux plugins
216        $champs = pipeline(
217                'pre_edition',
218                array(
219                        'args' => array(
220                                'table' => 'spip_definitions',
221                                'id_objet' => $id_definition,
222                                'action' => 'instituer',
223                                'statut_ancien' => $statut_ancien,
224                        ),
225                        'data' => $champs
226                )
227        );
228        // Si à ce stade il n'y a pas de champs à modifier
229        // on arrête là mais on refait quand même le cache des définitions si besoin
230        if (!count($champs)){
231                // On refait le cache des définitions si le nouveau ou l'ancien statut était publié
232                if ($purger_cache and $statut_ancien == 'publie'){
233                        include_spip('inc/dictionnaires');
234                        dictionnaires_lister_definitions(true);
235                }
236                return;
237        }
238       
239        // Envoyer les modifications et calculer les héritages
240#       editer_definition_heritage($id_definition, $id_dictionnaire, $statut_ancien, $champs, $calcul_rub);
241        sql_updateq('spip_definitions', $champs, "id_definition=$id_definition");
242       
243        // Invalider les caches
244        include_spip('inc/invalideur');
245        suivre_invalideur("id='id_definition/$id_definition'");
246       
247        if ($date) {
248                $t = strtotime($date);
249                $p = @$GLOBALS['meta']['date_prochain_postdate'];
250                if ($t > time() AND (!$p OR ($t < $p))) {
251                        ecrire_meta('date_prochain_postdate', $t);
252                }
253        }
254       
255        // Pipeline
256        pipeline(
257                'post_edition',
258                array(
259                        'args' => array(
260                                'table' => 'spip_definitions',
261                                'id_objet' => $id_definition,
262                                'action' => 'instituer',
263                                'statut_ancien' => $statut_ancien,
264                        ),
265                        'data' => $champs
266                )
267        );
268
269        // On refait le cache des définitions si le nouveau ou l'ancien statut était publié
270        if ($purger_cache and ((isset($champs['statut']) AND $champs['statut'] == 'publie')
271                 OR $statut_ancien == 'publie'))
272                {
273                        include_spip('inc/dictionnaires');
274                        dictionnaires_lister_definitions(true);
275        }
276
277        // Notifications
278        if ($notifications = charger_fonction('notifications', 'inc', true)) {
279                $notifications('definition_instituer', $id_definition,
280                        array('statut' => $statut, 'statut_ancien' => $statut_ancien, 'date'=>$date)
281                );
282        }
283       
284        return '';
285}
286
287?>
Note: See TracBrowser for help on using the repository browser.