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

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

corriger le retour du formulaire
debut de refoactoring/modernisation de editer_evenement

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