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

Last change on this file since 65485 was 65485, checked in by marcimat@…, 7 years ago

Poursuite du passage à SPIP 3 du plugin dictionnaire. On utilise l'api d'objets éditoriaux et on ne met que les squelettes nécessaires dans le plugin. Au passage on PHPDoc toutes les fonctions.

File size: 7.5 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        // Envoyer aux plugins avant insertion
54        $champs = pipeline('pre_insertion',
55                array(
56                        'args' => array(
57                                'table' => 'spip_definitions',
58                        ),
59                        'data' => $champs
60                )
61        );
62        // Insérer l'objet
63        $id_definition = sql_insertq('spip_definitions', $champs);
64        // Envoyer aux plugins après insertion
65        pipeline('post_insertion',
66                array(
67                        'args' => array(
68                                'table' => 'spip_definitions',
69                                'id_objet' => $id_definition
70                        ),
71                        'data' => $champs
72                )
73        );
74
75        return $id_definition;
76}
77
78
79/**
80 * Modifier une définition
81 *
82 * @param int $id_definition
83 *     Identifiant de la définition à modifier
84 * @param array|null $set
85 *     Couples (colonne => valeur) de données à modifier.
86 *     En leur absence, on cherche les données dans les champs éditables
87 *     qui ont été postés (via _request())
88 * @param bool $purger_cache
89 *     true pour purcher le cache des définitions au passage lors de l'institution
90 * @return string|null
91 *     Chaîne vide si aucune erreur,
92 *     Null si aucun champ à modifier,
93 *     Chaîne contenant un texte d'erreur sinon.
94 */
95function definition_set($id_definition, $set=null, $purger_cache=true) {
96        $err = '';
97
98        include_spip('base/objets');
99        $desc = lister_tables_objets_sql('spip_definitions');
100
101        include_spip('inc/modifier');
102        $c = collecter_requests(
103                // white list
104                $desc['champs_editables'],
105                // black list
106                array(),
107                // donnees eventuellement fournies
108                $set
109        );
110
111        // Pour le parent on fera plus tard
112        unset($c['id_dictionnaire']);
113
114        if ($err = objet_modifier_champs('definition', $id_definition,
115                array(
116                        'nonvide' => array('titre' => _T('info_sans_titre'))
117                ),
118                $c)) {
119                return $err;
120        }
121
122        $c = collecter_requests(array('date', 'statut', 'id_dictionnaire'),array(),$set);
123        $err = instituer_definition($id_definition, $c, $purger_cache);
124        return $err;
125}
126
127
128/**
129 * Instituer une définition : modifier son statut, date, parent
130 *
131 * @pipeline_appel pre_insertion
132 * @pipeline_appel post_insertion
133 *
134 * @param int $id_definition
135 *     Identifiant de la définition
136 * @param array $c
137 *     Couples (colonne => valeur) des données à instituer
138 * @param bool $purger_cache
139 *     true pour purcher le cache des définitions au passage
140 * @return null|string
141 *     Null si aucun champ à modifier, chaîne vide sinon.
142 */
143function instituer_definition($id_definition, $c, $purger_cache=true){
144        include_spip('inc/autoriser');
145        include_spip('inc/rubriques');
146        include_spip('inc/modifier');
147       
148        $row = sql_fetsel('statut, date, id_dictionnaire', 'spip_definitions', "id_definition=$id_definition");
149        $id_dictionnaire = $row['id_dictionnaire'];
150        $statut_ancien = $statut = $row['statut'];
151        $date_ancienne = $date = $row['date'];
152        $champs = array();
153       
154        $d = isset($c['date']) ? $c['date'] : null;
155        $s = isset($c['statut']) ? $c['statut'] : $statut;
156       
157        // On ne modifie le statut que si c'est autorisé
158        if ($s != $statut or ($d AND $d != $date)) {
159                if (autoriser('publierdans', 'dictionnaire', $id_dictionnaire))
160                        $statut = $champs['statut'] = $s;
161                else if (autoriser('modifier', 'definition', $id_definition) and $s != 'publie')
162                        $statut = $champs['statut'] = $s;
163                else
164                        spip_log("editer_definition $id_definition refus " . join(' ', $c));
165
166                // En cas de publication, fixer la date a "maintenant"
167                // sauf si $c commande autre chose
168                // ou si le produit est deja date dans le futur
169                // En cas de proposition d'une définition (mais pas depublication), idem
170                if ($champs['statut'] == 'publie'
171                        or ($champs['statut'] == 'prop' and ($d or !in_array($statut_ancien, array('publie', 'prop'))))
172                ){
173                        if ($d or strtotime($d=$date)>time())
174                                $champs['date'] = $date = $d;
175                        else
176                                $champs['date'] = $date = date('Y-m-d H:i:s');
177                }
178        }
179       
180        // Verifier que la rubrique demandee existe et est differente
181        // de la rubrique actuelle
182        if ($id_dictionnaire_new = $c['id_dictionnaire']
183                and $id_dictionnaire_new != $id_dictionnaire
184                and (sql_fetsel('1', 'spip_dictionnaires', "id_dictionnaire=$id_dictionnaire_new"))
185        ){
186                $champs['id_dictionnaire'] = $id_dictionnaire_new;
187
188                // Si la définition était publiée
189                // et que le demandeur n'est pas admin du dictionnaire où c'était
190                // repasser le produit en statut 'proposé'.
191                if ($statut == 'publie'
192                        and !autoriser('publierdans', 'dictionnaire', $id_dictionnaire)
193                )
194                        $champs['statut'] = 'prop';
195        }
196       
197        // Envoyer aux plugins
198        $champs = pipeline(
199                'pre_edition',
200                array(
201                        'args' => array(
202                                'table' => 'spip_definitions',
203                                'id_objet' => $id_definition,
204                                'action' => 'instituer',
205                                'statut_ancien' => $statut_ancien,
206                        ),
207                        'data' => $champs
208                )
209        );
210        // Si à ce stade il n'y a pas de champs à modifier
211        // on arrête là mais on refait quand même le cache des définitions si besoin
212        if (!count($champs)){
213                // On refait le cache des définitions si le nouveau ou l'ancien statut était publié
214                if ($purger_cache and $statut_ancien == 'publie'){
215                        include_spip('inc/dictionnaires');
216                        dictionnaires_lister_definitions(true);
217                }
218                return;
219        }
220       
221        // Envoyer les modifications et calculer les héritages
222#       editer_definition_heritage($id_definition, $id_dictionnaire, $statut_ancien, $champs, $calcul_rub);
223        sql_updateq('spip_definitions', $champs, "id_definition=$id_definition");
224       
225        // Invalider les caches
226        include_spip('inc/invalideur');
227        suivre_invalideur("id='id_definition/$id_definition'");
228       
229        if ($date) {
230                $t = strtotime($date);
231                $p = @$GLOBALS['meta']['date_prochain_postdate'];
232                if ($t > time() AND (!$p OR ($t < $p))) {
233                        ecrire_meta('date_prochain_postdate', $t);
234                }
235        }
236       
237        // Pipeline
238        pipeline(
239                'post_edition',
240                array(
241                        'args' => array(
242                                'table' => 'spip_definitions',
243                                'id_objet' => $id_definition,
244                                'action' => 'instituer',
245                                'statut_ancien' => $statut_ancien,
246                        ),
247                        'data' => $champs
248                )
249        );
250
251        // On refait le cache des définitions si le nouveau ou l'ancien statut était publié
252        if ($purger_cache and ((isset($champs['statut']) AND $champs['statut'] == 'publie')
253                 OR $statut_ancien == 'publie'))
254                {
255                        include_spip('inc/dictionnaires');
256                        dictionnaires_lister_definitions(true);
257        }
258
259        // Notifications
260        if ($notifications = charger_fonction('notifications', 'inc', true)) {
261                $notifications('definition_instituer', $id_definition,
262                        array('statut' => $statut, 'statut_ancien' => $statut_ancien, 'date'=>$date)
263                );
264        }
265       
266        return '';
267}
268
269?>
Note: See TracBrowser for help on using the repository browser.