source: spip-zone/_plugins_/agenda/trunk/agenda_pipelines.php

Last change on this file was 118287, checked in by maieul@…, 6 weeks ago

effacer régulièrement les inscriptions à des evenements qui ne sont plus en base

File size: 11.3 KB
Line 
1<?php
2/**
3 * Plugin Agenda 4 pour Spip 3.0
4 * Licence GPL 3
5 *
6 * 2006-2011
7 * Auteurs : cf paquet.xml
8 */
9
10if (!defined('_ECRIRE_INC_VERSION')) {
11        return;
12}
13
14/**
15 * Inserer la CSS de l'agenda si config cochee
16 * forcee par define('_AGENDA_INSERT_HEAD_CSS',false|true) par le squelette si besoin
17 *
18 * @param $flux
19 * @return mixed
20 */
21function agenda_insert_head_css($flux) {
22        if (!defined('_AGENDA_INSERT_HEAD_CSS')
23                or !_AGENDA_INSERT_HEAD_CSS) {
24                include_spip('inc/config');
25                $cfg = (defined('_AGENDA_INSERT_HEAD_CSS') ? _AGENDA_INSERT_HEAD_CSS : lire_config('agenda/insert_head_css'));
26                if ($cfg) {
27                        $flux .= '<link rel="stylesheet" type="text/css" href="'.find_in_path('css/spip.agenda.css').'" />';
28                }
29        }
30        return $flux;
31}
32
33function agenda_formulaire_fond($flux) {
34        if ($flux['args']['form'] == 'editer_rubrique') {
35                $contexte = $flux['args']['contexte'];
36                $form = recuperer_fond('prive/objets/editer/rubrique-agenda', $contexte);
37                if ($p = strpos($flux['data'], '<!--extra-->')) {
38                        $flux['data'] = substr_replace($flux['data'], $form, $p, 0);
39                }
40        }
41        return $flux;
42}
43
44/**
45 * Inserer les infos d'agenda sur les articles et rubriques
46 *
47 * @param array $flux
48 * @return array
49 */
50function agenda_affiche_milieu($flux) {
51
52        $e = trouver_objet_exec($flux['args']['exec']);
53        $out = '';
54        $rubrique_agenda_presente = NULL;
55        if ($e['type']=='rubrique'
56                and $e['edition']==false
57                and $id_rubrique = intval($flux['args']['id_rubrique'])
58                and $rubrique_agenda_presente = sql_countsel('spip_rubriques', 'agenda=1')) {
59
60                $actif = sql_getfetsel('agenda', 'spip_rubriques', 'id_rubrique='.intval($id_rubrique));
61                $statut = '-32';
62                $alt = '';
63                $voir = '';
64                include_spip('inc/rubriques');
65                if ($actif or sql_countsel('spip_rubriques', sql_in('id_rubrique', calcul_hierarchie_in($id_rubrique)).' AND agenda=1 AND id_rubrique<>'.intval($id_rubrique))) {
66                        $alt = ($actif ? _T('agenda:rubrique_mode_agenda') : _T('agenda:rubrique_dans_une_rubrique_mode_agenda'));
67                        $statut = '-ok-32';
68                        $voir = _T('agenda:voir_evenements_rubrique');
69                }
70
71                if ($voir) {
72                        $res = _T('agenda:agenda')
73                                . " <small>| <a href='".generer_url_ecrire('evenements', "id_rubrique=$id_rubrique")."'>$voir</a></small>"
74                                . http_img_pack("agenda$statut.png", $alt, "class='statut'", $alt);
75                        $out .= boite_ouvrir($res, 'simple agenda-statut')
76                                . boite_fermer();
77                }
78        }
79        elseif ($e['type']=='article'
80                and $e['edition']==false) {
81                $id_article = $flux['args']['id_article'];
82                $out .= recuperer_fond('prive/objets/contenu/article-evenements', $flux['args']);
83        }
84
85        if ($out) {
86                if ($p = strpos($flux['data'], '<!--affiche_milieu-->')) {
87                        $flux['data'] = substr_replace($flux['data'], $out, $p, 0);
88                } else {
89                        $flux['data'] .= $out;
90                }
91        }
92        return $flux;
93}
94
95/**
96 * Optimiser la base
97 * (evenements a la poubelle, lies a des articles disparus, ou liens mots sur evenements disparus)
98 *
99 * @param array $flux
100 * @return array
101 */
102function agenda_optimiser_base_disparus($flux) {
103
104        # passer a la poubelle
105        # les evenements lies a un article inexistant
106        $res = sql_select(
107                'DISTINCT evenements.id_article',
108                'spip_evenements AS evenements LEFT JOIN spip_articles AS articles ON evenements.id_article=articles.id_article',
109                'articles.id_article IS NULL'
110        );
111        while ($row = sql_fetch($res)) {
112                sql_updateq('spip_evenements', array('statut'=>'poubelle'), 'id_article='.$row['id_article']);
113        }
114
115        // Evenements a la poubelle
116        sql_delete('spip_evenements', "statut='poubelle' AND maj < ".$flux['args']['date']);
117
118        // Effacer les inscriptions à des evenement inexistants
119
120        $res = sql_select(
121                'DISTINCT evenements_participants.id_evenement',
122                'spip_evenements_participants AS evenements_participants LEFT JOIN spip_evenements AS evenements ON evenements_participants.id_evenement=evenements.id_evenement',
123                'evenements.id_evenement IS NULL'
124        );
125        while ($row = sql_fetch($res)) {
126                var_dump($row);
127                sql_delete('spip_evenements_participants','id_evenement='.$row['id_evenement']);
128        }
129
130        include_spip('action/editer_liens');
131        // optimiser les liens de tous les mots vers des objets effaces
132        // et depuis des mots effaces
133        $flux['data'] += objet_optimiser_liens(array('mot'=>'*'), array('evenement' => '*'));
134
135        return $flux;
136}
137
138
139/**
140 * Lister les evenements dans le calendrier de l'espace prive (extension organiseur)
141 *
142 * @param array $flux
143 * @return array
144 */
145function agenda_quete_calendrier_prive($flux) {
146        $quoi = $flux['args']['quoi'];
147        if (!$quoi or $quoi == 'evenements') {
148                $start = sql_quote($flux['args']['start']);
149                $end = sql_quote($flux['args']['end']);
150                $res = sql_select('*', 'spip_evenements AS E', "((E.date_fin >= $start OR E.date_debut >= $start) AND E.date_debut <= $end)");
151                while ($row = sql_fetch($res)) {
152                        $flux['data'][] = array(
153                                'id' => $row['id_evenement'],
154                                'title' => $row['titre'],
155                                'allDay' => false,
156                                'start' => $row['date_debut'],
157                                'end' => $row['date_fin'],
158                                'url' => str_replace('&amp;', '&', generer_url_entite($row['id_evenement'], 'evenement')),
159                                'className' => 'calendrier-event evenement calendrier-couleur5',
160                                'description' => $row['descriptif'],
161                        );
162                }
163        }
164        return $flux;
165}
166
167/**
168 * Synchroniser le statut des evenements lorsqu'on publie/depublie un article,
169 * si le plugin est configuré pour (par défaut)
170 * @param array $flux
171 * @return array
172 */
173function agenda_post_edition($flux) {
174        if (isset($flux['args']['table'])
175                and $flux['args']['table']=='spip_articles'
176                and $flux['args']['action'] == 'instituer'
177                and $id_article = $flux['args']['id_objet']
178                and isset($flux['data']['statut'])
179                and $statut = $flux['data']['statut']
180                and $statut_ancien = $flux['args']['statut_ancien']
181                and $statut != $statut_ancien
182                and lire_config('agenda/synchro_statut')) {
183                $set = array();
184                // les evenements principaux, associes a cet article
185                $where = array('id_article='.intval($id_article),'id_evenement_source=0');
186                switch ($statut) {
187                        case 'poubelle':
188                                // on passe aussi tous les evenements associes a la poubelle, sans distinction
189                                $set['statut'] = 'poubelle';
190                                break;
191                        case 'publie':
192                                // on passe aussi tous les evenements prop en publie
193                                $set['statut'] = 'publie';
194                                $where[] = "statut='prop'";
195                                break;
196                        default:
197                                if ($statut_ancien=='publie') {
198                                        // on depublie aussi tous les evenements publie
199                                        $set['statut'] = 'prop';
200                                        $where[] = "statut='publie'";
201                                }
202                                break;
203                }
204                if (count($set)) {
205                        include_spip('action/editer_evenement');
206                        $res = sql_select('id_evenement', 'spip_evenements', $where);
207                        // et on applique a tous les evenements lies a l'article
208                        while ($row = sql_fetch($res)) {
209                                evenement_modifier($row['id_evenement'], $set);
210                        }
211                }
212        }
213        return $flux;
214}
215
216/*
217 * Synchroniser les liaisons (mots, docs, gis, etc) de l'événement édité avec ses répétitions s'il en a
218 * @param array $flux
219 * @param array
220 */
221function agenda_post_edition_lien($flux) {
222        // Si on est en train de lier ou délier quelque chose a un événement
223        if ($flux['args']['objet'] == 'evenement') {
224                // On cherche si cet événement a des répétitions
225                if ($id_evenement = $flux['args']['id_objet']
226                        and $id_evenement > 0
227                        and $repetitions = sql_allfetsel('id_evenement', 'spip_evenements', 'id_evenement_source = '.$id_evenement)
228                        and is_array($repetitions)
229                ) {
230                        include_spip('action/editer_liens');
231
232                        // On a la liste des ids des répétitions
233                        $repetitions = array_map('reset', $repetitions);
234
235                        // Si c'est un ajout de lien, on l'ajoute à toutes les répétitions
236                        if ($flux['args']['action'] == 'insert') {
237                                objet_associer(
238                                        array($flux['args']['objet_source'] => $flux['args']['id_objet_source']),
239                                        array('evenement' => $repetitions)
240                                );
241                        } elseif ($flux['args']['action'] == 'delete') {
242                                // Si c'est une suppression de lien, on le supprime à toutes les répétitions
243                                objet_dissocier(
244                                        array($flux['args']['objet_source'] => $flux['args']['id_objet_source']),
245                                        array('evenement' => $repetitions)
246                                );
247                        }
248                }
249        }
250
251        return $flux;
252}
253
254/**
255 * Les evenements peuvent heriter des compositions des articles
256 * @param array $heritages
257 * @return array
258 */
259function agenda_compositions_declarer_heritage($heritages) {
260        $heritages['evenement'] = 'article';
261        return $heritages;
262}
263
264/**
265 * Insertion dans le pipeline revisions_chercher_label (Plugin révisions)
266 * Trouver le bon label à afficher sur les champs dans les listes de révisions
267 *
268 * Si un champ est un champ extra, son label correspond au label défini du champs extra
269 *
270 * @pipeline revisions_chercher_label
271 * @param array $flux Données du pipeline
272 * @return array      Données du pipeline
273**/
274function agenda_revisions_chercher_label($flux) {
275        foreach (array('date_debut', 'date_fin','horaire','lieu') as $champ) {
276                if ($flux['args']['champ'] == $champ) {
277                        $flux['data'] = _T('agenda:evenement_'.$champ);
278                        return $flux;
279                }
280        }
281
282        if ($flux['args']['champ'] == 'id_article') {
283                $flux['data'] = _T('agenda:evenement_article');
284        }
285
286        return $flux;
287}
288
289/**
290 * Insertion dans le pipeline accueil_encours (SPIP)
291 *
292 * Afficher les événements en attente de validation sur la page d'acceuil de l'espace privé
293 *
294 * @param array $flux Le contexte d'environnement du pipeline
295 * @return array $flux Le contexte d'environnement modifié
296 */
297function agenda_accueil_encours($flux){
298        $flux .= recuperer_fond('prive/objets/liste/evenements',
299                array(
300                        'statut' => array('prop'),
301                        'nb' => 5
302                ),
303                array('ajax' => true)
304        );
305        return $flux;
306}
307
308/** Déclarer les évènements
309 * au plugin corbeille
310 * @param array $flux;
311 * @return array $flux;
312**/
313function agenda_corbeille_table_infos($flux){
314        $flux['evenements']= array(
315                'statut'=>'poubelle',
316                'table'=>'evenements',
317                'tableliee'=>array('spip_evenements_participants')
318        );
319        return $flux;
320}
321
322/**
323 * Si on dit qu'il n'y pas de page spécifique pour un évènement, mais qu'on doit utiliser la page d'article,
324 * alors il n'y a pas lieu de générer une url propre pour un évènement
325 * qui pourrait prendre la place d'une url propre pour un autre objet.
326 * @param array $flux
327 * @return array $lux
328**/
329function agenda_propres_creer_chaine_url($flux) {
330        if ($flux['objet']['type'] == 'evenement' and lire_config('agenda/url_evenement_evenement') == 'article') {
331                $flux['data'] = 'evenement'.$flux['objet']['id_objet'];
332        }
333        return $flux;
334}
335
336/**
337 * Pour la saisie de type événement, indique si les données renvoyées sont tabulaire ou pas
338 * @param $flux
339 * @return $flux
340**/
341function agenda_saisie_est_tabulaire($flux) {
342        $args = $flux['args'];
343        if ($args['saisie'] != 'evenements') {
344                return $flux;
345        }
346        if ($args['options']['type_choix'] == 'checkbox') {
347                $flux['data'] = true;
348        }
349        return $flux;
350}
351
352
353/**
354 * Si on a une saisie de type événement, ajoute, si nécessaire, au tableau de déclaration de saisies la saisie _liste_attente correspondante.
355 * Utile pour les afficher_si
356 * @param $flux les saisies
357 * @return $flux les saisies modifier
358**/
359function agenda_saisies_afficher_si_js_saisies_form($flux) {
360
361        //Ne pas refaire 36 fois le calcul
362        static $old;
363        static $new;
364        if ($old == $flux) {
365                return $new;
366        }
367        $old = $flux;
368        include_spip('inc/saisies');
369        $saisies_par_type = saisies_lister_par_type($flux);
370        if (isset($saisies_par_type['evenements'])) {
371                foreach ($saisies_par_type['evenements'] as $saisie => $description) {
372                        $saisie_inserer = array(
373                                'saisie' => 'evenements_liste_attente',
374                                'options' => array('nom'=>$saisie.'_liste_attente')
375                        );
376                        $flux = saisies_inserer($flux, $saisie_inserer);
377                }
378        }
379        $new = $flux;
380        return $flux;
381}
382
Note: See TracBrowser for help on using the repository browser.