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

Last change on this file since 58145 was 58145, checked in by rastapopoulos@…, 8 years ago

Ajout d'une option "sensible à la casse" pour les définitions qui obligera alors le détecteur à prendre uniquement ce qu'on a mis comme terme : "ce" ne sera plus reconnu pour "CE".

+ correction de bug qui faisait que les cases à cocher ne pouvaient pas être décochées...

+ chaine d'explication en plus

File size: 6.8 KB
Line 
1<?php
2
3// Sécurité
4if (!defined('_ECRIRE_INC_VERSION')) return;
5
6/**
7 * Action de création / Modification d'un definition
8 * @param unknown_type $arg
9 * @return unknown_type
10 */
11function action_editer_definition_dist($arg=null) {
12        if (is_null($arg)){
13                $securiser_action = charger_fonction('securiser_action', 'inc');
14                $arg = $securiser_action();
15        }
16
17        // si id_definition n'est pas un nombre, c'est une creation
18        if (!$id_definition = intval($arg)) {
19                $id_definition = insert_definition();
20        }
21
22        // Enregistre l'envoi dans la BD
23        if ($id_definition > 0) $err = definition_set($id_definition);
24
25        if (_request('redirect')) {
26                $redirect = parametre_url(urldecode(_request('redirect')),
27                        'id_definition', $id_definition, '&') . $err;
28
29                include_spip('inc/headers');
30                redirige_par_entete($redirect);
31        }
32        else
33                return array($id_definition,$err);
34}
35
36/**
37 * Crée un nouveau definition et retourne son ID
38 *
39 * @param array $champs Un tableau avec les champs par défaut lors de l'insertion
40 * @return int id_definition
41 */
42function insert_definition($champs=array()) {
43        // Envoyer aux plugins avant insertion
44        $champs = pipeline('pre_insertion',
45                array(
46                        'args' => array(
47                                'table' => 'spip_definitions',
48                        ),
49                        'data' => $champs
50                )
51        );
52        // Insérer l'objet
53        $id_definition = sql_insertq('spip_definitions', $champs);
54        // Envoyer aux plugins après insertion
55        pipeline('post_insertion',
56                array(
57                        'args' => array(
58                                'table' => 'spip_definitions',
59                                'id_objet' => $id_definition
60                        ),
61                        'data' => $champs
62                )
63        );
64
65        return $id_definition;
66}
67
68/**
69 * Appelle la fonction de modification d'un definition
70 *
71 * @param int $id_definition
72 * @param unknown_type $set
73 * @return $err
74 */
75function definition_set($id_definition, $set=null, $purger_cache=true) {
76        $err = '';
77
78        include_spip('inc/saisies');
79        $saisies = saisies_chercher_formulaire('editer_definition', array($id_definition));
80        $champs = saisies_lister_champs($saisies, false);
81       
82        $c = array();
83        foreach ($champs as $champ)
84                $c[$champ] = _request($champ,$set);
85       
86        // Pour le parent on fera plus tard
87        if (isset($c['id_dictionnaire'])){
88                unset($c['id_dictionnaire']);
89        }
90       
91        include_spip('inc/modifier');
92        revision_definition($id_definition, $c);
93       
94        // Modification de statut, changement de rubrique ?
95        $c = array();
96        foreach (array(
97                'date', 'statut', 'id_dictionnaire'
98        ) as $champ)
99                $c[$champ] = _request($champ, $set);
100        $err .= instituer_definition($id_definition, $c, $purger_cache);
101
102        return $err;
103}
104
105/**
106 * Enregistre une révision de definition
107 *
108 * @param int $id_definition
109 * @param array $c
110 * @return
111 */
112function revision_definition($id_definition, $c=false) {
113        $invalideur = "id='id_definition/$id_definition'";
114
115        modifier_contenu('definition', $id_definition,
116                array(
117                        'nonvide' => array('titre' => _T('info_sans_titre')),
118                        'invalideur' => $invalideur
119                ),
120                $c);
121
122        return ''; // pas d'erreur
123}
124
125/**
126 * Modifie des éléments à part
127 *
128 * @param int $id_definition
129 * @param array $c
130 * @return
131 */
132function instituer_definition($id_definition, $c, $purger_cache=true){
133        include_spip('inc/autoriser');
134        include_spip('inc/rubriques');
135        include_spip('inc/modifier');
136       
137        $row = sql_fetsel('statut, date, id_dictionnaire', 'spip_definitions', "id_definition=$id_definition");
138        $id_dictionnaire = $row['id_dictionnaire'];
139        $statut_ancien = $statut = $row['statut'];
140        $date_ancienne = $date = $row['date'];
141        $champs = array();
142       
143        $d = isset($c['date']) ? $c['date'] : null;
144        $s = isset($c['statut']) ? $c['statut'] : $statut;
145       
146        // On ne modifie le statut que si c'est autorisé
147        if ($s != $statut or ($d AND $d != $date)) {
148                if (autoriser('publierdans', 'dictionnaire', $id_dictionnaire))
149                        $statut = $champs['statut'] = $s;
150                else if (autoriser('modifier', 'definition', $id_definition) and $s != 'publie')
151                        $statut = $champs['statut'] = $s;
152                else
153                        spip_log("editer_definition $id_definition refus " . join(' ', $c));
154
155                // En cas de publication, fixer la date a "maintenant"
156                // sauf si $c commande autre chose
157                // ou si le produit est deja date dans le futur
158                // En cas de proposition d'une définition (mais pas depublication), idem
159                if ($champs['statut'] == 'publie'
160                        or ($champs['statut'] == 'prop' and ($d or !in_array($statut_ancien, array('publie', 'prop'))))
161                ){
162                        if ($d or strtotime($d=$date)>time())
163                                $champs['date'] = $date = $d;
164                        else
165                                $champs['date'] = $date = date('Y-m-d H:i:s');
166                }
167        }
168       
169        // Verifier que la rubrique demandee existe et est differente
170        // de la rubrique actuelle
171        if ($id_dictionnaire_new = $c['id_dictionnaire']
172                and $id_dictionnaire_new != $id_dictionnaire
173                and (sql_fetsel('1', 'spip_dictionnaires', "id_dictionnaire=$id_dictionnaire_new"))
174        ){
175                $champs['id_dictionnaire'] = $id_dictionnaire_new;
176
177                // Si la définition était publiée
178                // et que le demandeur n'est pas admin du dictionnaire où c'était
179                // repasser le produit en statut 'proposé'.
180                if ($statut == 'publie'
181                        and !autoriser('publierdans', 'dictionnaire', $id_dictionnaire)
182                )
183                        $champs['statut'] = 'prop';
184        }
185       
186        // Envoyer aux plugins
187        $champs = pipeline(
188                'pre_edition',
189                array(
190                        'args' => array(
191                                'table' => 'spip_definitions',
192                                'id_objet' => $id_definition,
193                                'action' => 'instituer',
194                                'statut_ancien' => $statut_ancien,
195                        ),
196                        'data' => $champs
197                )
198        );
199        // Si à ce stade il n'y a pas de champs à modifier
200        // on arrête là mais on refait quand même le cache des définitions si besoin
201        if (!count($champs)){
202                // On refait le cache des définitions si le nouveau ou l'ancien statut était publié
203                if ($purger_cache and $statut_ancien == 'publie'){
204                        include_spip('inc/dictionnaires');
205                        dictionnaires_lister_definitions(true);
206                }
207                return;
208        }
209       
210        // Envoyer les modifications et calculer les héritages
211#       editer_definition_heritage($id_definition, $id_dictionnaire, $statut_ancien, $champs, $calcul_rub);
212        sql_updateq('spip_definitions', $champs, "id_definition=$id_definition");
213       
214        // Invalider les caches
215        include_spip('inc/invalideur');
216        suivre_invalideur("id='id_definition/$id_definition'");
217       
218        if ($date) {
219                $t = strtotime($date);
220                $p = @$GLOBALS['meta']['date_prochain_postdate'];
221                if ($t > time() AND (!$p OR ($t < $p))) {
222                        ecrire_meta('date_prochain_postdate', $t);
223                }
224        }
225       
226        // Pipeline
227        pipeline(
228                'post_edition',
229                array(
230                        'args' => array(
231                                'table' => 'spip_definitions',
232                                'id_objet' => $id_definition,
233                                'action' => 'instituer',
234                                'statut_ancien' => $statut_ancien,
235                        ),
236                        'data' => $champs
237                )
238        );
239       
240        // On refait le cache des définitions si le nouveau ou l'ancien statut était publié
241        if ($purger_cache and ($champs['statut'] == 'publie' or $statut_ancien == 'publie')){
242                include_spip('inc/dictionnaires');
243                dictionnaires_lister_definitions(true);
244        }
245       
246        // Notifications
247        if ($notifications = charger_fonction('notifications', 'inc', true)) {
248                $notifications('definition_instituer', $id_definition,
249                        array('statut' => $statut, 'statut_ancien' => $statut_ancien, 'date'=>$date)
250                );
251        }
252       
253        return '';
254}
255
256?>
Note: See TracBrowser for help on using the repository browser.