source: spip-zone/_plugins_/agenda/trunk/action/editer_evenement.php @ 54034

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

gestion du statut :

  • refactoring de evenement_instituer pour prendre en compte le changement d'article, et le post du statut
  • initialisation du statut en base lors de l'upgrade, en fonction de celui des articles
  • menu instituer

On peut publier un evenement si l'article l'est, mais sinon on ne peut que le proposer ou poubelle.
Si on deplace l'evenement publie sur un article non publie, il est repasse en prop
Il reste a synchroniser le statut de l'evenement lorsqu'on change celui de l'article

File size: 12.6 KB
Line 
1<?php
2/**
3 * Plugin Agenda pour Spip 2.0
4 * Licence GPL
5 *
6 *
7 */
8
9/**
10 * Edition d'un evenement
11 * @param string $arg
12 * @return array
13 */
14function action_editer_evenement_dist($arg=null){
15
16        if (is_null($arg)){
17                $securiser_action = charger_fonction('securiser_action', 'inc');
18                $arg = $securiser_action();
19        }
20
21        // si id_evenement n'est pas un nombre, c'est une creation
22        // mais on verifie qu'on a toutes les donnees qu'il faut.
23        if (!$id_evenement = intval($arg)) {
24                $id_parent = _request('id_parent');
25                if (!$id_evenement = agenda_action_insert_evenement($id_parent))
26                        return array(false,_L('echec'));
27        }
28
29        $err = action_evenement_set($id_evenement);
30        return array($id_evenement,$err);
31}
32
33/**
34 * Creer un nouvel evenement
35 *
36 * @param int $id_article
37 * @param int $id_evenement_source
38 * @return int
39 */
40function evenement_inserer($id_article,$id_evenement_source = 0){
41        include_spip('inc/autoriser');
42        if (!autoriser('creerevenementdans','article',$id_article)){
43                spip_log("agenda action formulaire article : auteur ".$GLOBALS['visiteur_session']['id_auteur']." n'a pas le droit de creer un evenement dans article $id_article",'agenda');
44                return false;
45        }
46
47        $champs = array(
48                "id_evenement_source"=>intval($id_evenement_source),
49                'id_article'=>intval($id_article),
50                'statut' => 'prepa',
51        );
52
53        // Envoyer aux plugins
54        $champs = pipeline('pre_insertion',
55                array(
56                        'args' => array(
57                                'table' => 'spip_evenements',
58                        ),
59                        'data' => $champs
60                )
61        );
62
63        // nouvel evenement
64        $id_evenement = sql_insertq("spip_evenements", $champs);
65
66        pipeline('post_insertion',
67                array(
68                        'args' => array(
69                                'table' => 'spip_evenements',
70                                'id_objet' => $id_evenement
71                        ),
72                        'data' => $champs
73                )
74        );
75
76        if (!$id_evenement){
77                spip_log("agenda action formulaire evenement : impossible d'ajouter un evenement",'agenda');
78                return false;
79        }
80        return $id_evenement;
81}
82
83/**
84 * Modifier un evenement existant
85 *
86 * @param int $id_evenement
87 * @param array $set
88 * @return bool|string
89 */
90function evenement_modifier($id_evenement, $set=null){
91
92        include_spip('inc/modifier');
93        include_spip('inc/filtres');
94        $c = collecter_requests(
95                // white list
96                objet_info('evenement','champs_editables'),
97                // black list
98                array('statut','id_article'),
99                // donnees eventuellement fournies
100                $set
101        );
102
103        // Si l'evenement est publie, invalider les caches et demander sa reindexation
104        $t = sql_getfetsel("statut", "spip_evenements", "id_evenement=".intval($id_evenement));
105        $invalideur = $indexation = false;
106        if ($t == 'publie') {
107                $invalideur = "id='evenement/$id_evenement'";
108                $indexation = true;
109        }
110
111        if ($err = objet_modifier_champs('evenement', $id_evenement,
112                array(
113                        'nonvide' => array('titre' => _T('info_nouvel_evenement')." "._T('info_numero_abbreviation').$id_evenement),
114                        'invalideur' => $invalideur,
115                        'indexation' => $indexation,
116                ),
117                $c))
118                return $err;
119
120        if (!is_null($mots = _request('mots',$set)))
121                evenement_associer_mots($id_evenement,$mots);
122
123        if (!is_null($repetitions = _request('repetitions',$set)))
124                agenda_action_revision_evenement_repetitions($id_evenement,$repetitions);
125
126        // Modification de statut, changement de parent ?
127        $c = collecter_requests(array('statut', 'id_parent'),array(),$set);
128        $err = evenement_instituer($id_evenement, $c);
129
130        return $err;
131}
132
133
134function agenda_action_revision_evenement_repetitions($id_evenement,$repetitions="",$liste_mots=array()){
135        include_spip('inc/filtres');
136        $repetitions = preg_split(",[^0-9\-\/],",$repetitions);
137        // gestion des repetitions
138        $rep = array();
139        foreach($repetitions as $date){
140                if (strlen($date)){
141                        $date = recup_date($date);
142                        if ($date=mktime(0,0,0,$date[1],$date[2],$date[0]))
143                                $rep[] = $date;
144                }
145        }
146        agenda_action_update_repetitions($id_evenement, $rep, $liste_mots);
147}
148
149function agenda_action_update_repetitions($id_evenement,$repetitions){
150        // evenement source
151        if ($row = sql_fetsel("*", "spip_evenements","id_evenement=".intval($id_evenement))){
152                $titre = $row['titre'];
153                $descriptif = $row['descriptif'];
154                $horaire = $row['horaire'];
155                $lieu = $row['lieu'];
156                $adresse = $row['adresse'];
157                $date_debut = strtotime($row['date_debut']);
158                $date_fin = strtotime($row['date_fin']);
159                $duree = $date_fin - $date_debut;
160                $id_evenement_source = $row['id_evenement_source'];
161                $id_article = $row['id_article'];
162                $inscription = $row['inscription'];
163                $places = $row['places'];
164                if ($id_evenement_source!=0)
165                        return; // pas un evenement source donc rien a faire ici
166
167                include_spip('action/editer_liens');
168                $liens = objet_trouver_liens(array('mot'=>'*'),array('evenement'=>$id_evenement));
169                $mots = array();
170                foreach($liens as $l)
171                        $mots[] = $l['mot'];
172
173                $repetitions_updated = array();
174                // mettre a jour toutes les repetitions deja existantes ou les supprimer si plus lieu
175                $res = sql_select("id_evenement,date_debut","spip_evenements","id_evenement_source=".sql_quote($id_evenement));
176                while ($row = sql_fetch($res)){
177                        $date = strtotime(date('Y-m-d',strtotime($row['date_debut'])));
178                        if (in_array($date,$repetitions)){
179                                // il est maintenu, on l'update
180                                $repetitions_updated[] = $date;
181                                $update_date_debut = date('Y-m-d',$date)." ".date('H:i:s',$date_debut);
182                                $update_date_fin = date('Y-m-d H:i:s',strtotime($update_date_debut)+$duree);
183
184                                // TODO : prendre en charge la mise a jour uniquement si conforme a l'original
185                                $update_titre = $titre;
186                                $update_descriptif = $descriptif;
187                                $update_lieu = $lieu;
188                                $update_adresse = $adresse;
189                                $update_inscription = $inscription;
190                                $update_places = $places;
191
192                                // mettre a jour l'evenement
193                                sql_updateq('spip_evenements',
194                                        array(
195                                                "titre" => $update_titre,
196                                                "descriptif" => $update_descriptif,
197                                                "lieu" => $update_lieu,
198                                                "adresse" => $update_adresse,
199                                                "horaire" => $horaire,
200                                                "date_debut" => $update_date_debut,
201                                                "date_fin" => $update_date_fin,
202                                                "inscription" => $update_inscription,
203                                                "places" => $update_places,
204                                                "id_article" => $id_article),"id_evenement=".intval($row['id_evenement']));
205
206                                evenement_associer_mots($row['id_evenement'], $mots);
207                        }
208                        else {
209                                // il est supprime
210                                sql_delete("spip_mots_liens","objet='evenement' AND id_objet=".$row['id_evenement']);
211                                sql_delete("spip_evenements","id_evenement=".$row['id_evenement']);
212                        }
213                }
214                // regarder les repetitions a ajouter
215                foreach($repetitions as $date){
216                        if (!in_array($date,$repetitions_updated)){
217                                $update_date_debut = date('Y-m-d',$date)." ".date('H:i:s',$date_debut);
218                                $update_date_fin = date('Y-m-d H:i:s',strtotime($update_date_debut)+$duree);
219                                $update_titre = $titre;
220                                $update_descriptif = $descriptif;
221                                $update_lieu = $lieu;
222                                $update_adresse = $adresse;
223                                $update_inscription = $inscription;
224                                $update_places = $places;
225
226                                if ($id_evenement_new = agenda_action_insert_evenement($id_article,$id_evenement)) {
227                                        // mettre a jour l'evenement
228                                        sql_updateq('spip_evenements',
229                                                array(
230                                                        "titre" => $update_titre,
231                                                        "descriptif" => $update_descriptif,
232                                                        "lieu" => $update_lieu,
233                                                        "adresse" => $update_adresse,
234                                                        "horaire" => $horaire,
235                                                        "date_debut" => $update_date_debut,
236                                                        "date_fin" => $update_date_fin,
237                                                        "inscription" => $update_inscription,
238                                                        "places" => $update_places,
239                                                        "id_article" => $id_article),"id_evenement=".intval($id_evenement_new));
240                                        agenda_action_revision_evenement_mots($id_evenement_new, $liste_mots);
241                                }
242                        }
243                }
244        }
245}
246
247/**
248 * Associer une liste de mots a un evenement
249 * Modifie la liste des mots lies pour qu'elle corresponde exactement a $mots
250 *
251 * @param int $id_evenement
252 * @param array $mots
253 * @return void
254 */
255function evenement_associer_mots($id_evenement,$mots){
256        include_spip('action/editer_liens');
257        // associer les mots fournis
258        objet_associer(array('mot'=>$mots),array('evenement'=>$id_evenement));
259        // enlever les autres
260        objet_dissocier(array('mot'=>array('NOT',$mots)),array('evenement'=>$id_evenement));
261}
262
263
264/**
265 * Instituer un evenement
266 *
267 * @param int $id_evenement
268 * @param array $c
269 * @return bool|string
270 */
271function evenement_instituer($id_evenement, $c) {
272
273        include_spip('inc/autoriser');
274        include_spip('inc/modifier');
275
276        $row = sql_fetsel("id_article, statut", "spip_evenements", "id_evenement=".intval($id_evenement));
277        $id_parent  = $id_parent_ancien = $row['id_article'];
278        $statut = $statut_ancien = $row['statut'];
279
280        $champs = array();
281
282        if (!autoriser('modifier', 'article', $id_parent)
283          OR (isset($c['id_parent']) AND !autoriser('modifier', 'article', $c['id_parent']))){
284                spip_log("editer_evenement $id_evenement refus " . join(' ', $c));
285                return false;
286        }
287
288        // Verifier que l'article demande existe et est different
289        // de l'article actuel
290        if ($c['id_parent']
291          AND $c['id_parent'] != $id_parent
292          AND (sql_countsel("spip_articles", "id_article=".intval($c['id_parent'])))) {
293                $id_parent = $champs['id_article'] = $c['id_parent'];
294        }
295
296        $sa = sql_getfetsel('statut','spip_articles','id_article='.intval($id_parent));
297        if ($id_parent
298          AND (
299                        $id_parent!==$id_parent_ancien OR $statut=='0'
300                )){
301                switch($sa){
302                        case 'publie':
303                                // statut par defaut si besoin
304                                if ($statut=='0')
305                                        $champs['statut'] = $statut = 'publie';
306                                break;
307                        case 'poubelle':
308                                // si article a la poubelle, evenement aussi
309                                $champs['statut'] = $statut = 'poubelle';
310                                break;
311                        default:
312                                // pas de publie ni 0 si article pas publie
313                                if (in_array($statut,array('publie','0')))
314                                        $champs['statut'] = $statut = 'prop';
315                                break;
316                }
317        }
318
319        // si pas d'article lie, et statut par defaut
320        // on met en propose
321        if ($statut=='0')
322                $champs['statut'] = $statut = 'prop';
323
324        if (isset($c['statut'])
325                AND $s = $c['statut']
326                AND $s != $statut) {
327                // pour instituer un evenement il faut avoir le droit d'instituer l'article associe avec le meme statut
328                if (autoriser('instituer', 'article', $id_parent, null, array('statut'=>$s))
329                  AND ($sa=='publie' OR $s!=='publie'))
330                        $champs['statut'] = $statut = $s;
331                else
332                        spip_log("editer_evenement $id_evenement refus " . join(' ', $c));
333        }
334
335        // Envoyer aux plugins
336        $champs = pipeline('pre_edition',
337                array(
338                        'args' => array(
339                                'table' => 'spip_evenements',
340                                'action'=>'instituer',
341                                'id_objet' => $id_evenement,
342                                'id_parent_ancien' => $id_parent_ancien,
343                                'statut_ancien' => $statut_ancien,
344                        ),
345                        'data' => $champs
346                )
347        );
348
349        if (!count($champs)) return;
350
351        // Envoyer les modifs sur l'evenement et toutes ses repetitons
352        $ids = array_map('reset',sql_allfetsel('id_evenement','spip_evenements','id_evenement_source='.intval($id_evenement)));
353        $ids[] = intval($id_evenement);
354        sql_updateq('spip_evenements',$champs,sql_in('id_evenement',$ids));
355
356        // Invalider les caches
357        include_spip('inc/invalideur');
358        suivre_invalideur("id='id_article/$id_parent_ancien'");
359        suivre_invalideur("id='id_article/$id_parent'");
360
361        // Pipeline
362        pipeline('post_edition',
363                array(
364                        'args' => array(
365                                'table' => 'spip_evenements',
366                                'action'=>'instituer',
367                                'id_objet' => $id_evenement,
368                                'id_parent_ancien' => $id_parent_ancien,
369                                'statut_ancien' => $statut_ancien,
370                        ),
371                        'data' => $champs
372                )
373        );
374
375        // Notifications
376        if ($notifications = charger_fonction('notifications', 'inc')) {
377                $notifications('instituerevenement', $id_evenement,
378                        array('id_parent' => $id_parent, 'statut' => $statut, 'id_parent_ancien' => $id_parent, 'statut_ancien' => $statut_ancien)
379                );
380        }
381
382        return ''; // pas d'erreur
383}
384
385
386function agenda_action_supprime_repetitions($supp_evenement){
387        $res = sql_select("id_evenement", "spip_evenements", "id_evenement_source=".intval($supp_evenement));
388        while ($row = sql_fetch($res)){
389                $id_evenement = $row['id_evenement'];
390                sql_delete("spip_mots_evenements", "id_evenement=".intval($id_evenement));
391                sql_delete("spip_evenements", "id_evenement=".intval($id_evenement));
392        }
393}
394
395function agenda_action_supprime_evenement($id_article,$supp_evenement){
396        $id_evenement = sql_getfetsel("id_evenement", "spip_evenements", array(
397                "id_article=" . intval($id_article),
398                "id_evenement=" . intval($supp_evenement)));
399        if (intval($id_evenement) AND $id_evenement == $supp_evenement){
400                sql_delete("spip_mots_evenements", "id_evenement=".intval($id_evenement));
401                sql_delete("spip_evenements", "id_evenement=".intval($id_evenement));
402                agenda_action_supprime_repetitions($id_evenement);
403        }
404        include_spip('inc/invalideur');
405        suivre_invalideur("article/$id_article");
406        $id_evenement = 0;
407        return $id_evenement;
408}
409
410
411function agenda_action_insert_evenement($id_article,$id_evenement_source = 0){return evenement_inserer($id_article,$id_evenement_source);}
412function action_evenement_set($id_evenement, $set=null){return evenement_modifier($id_evenement, $set);}
413function agenda_action_instituer_evenement($id_evenement, $c) {return evenement_instituer($id_evenement,$c);}
414function agenda_action_revision_evenement_mots($id_evenement,$liste_mots){return evenement_associer_mots($id_evenement,$liste_mots);}
415?>
Note: See TracBrowser for help on using the repository browser.