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

Last change on this file was 122455, checked in by Cerdic, 13 days ago

Gestion du statut des repetitions : par defaut interdit de le modifier et c'est le statut de la repetition source qui s'applique, sauf si on desynchronise l'evenement, auquel cas on peut ensuite le publier/depublier independamment

File size: 12.1 KB
Line 
1<?php
2/**
3 * Plugin Agenda 4 pour Spip 3.2
4 * Licence GPL 3
5 *
6 * 2006-2020
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 < ".sql_quote($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                sql_delete('spip_evenements_participants','id_evenement='.intval($row['id_evenement']));
127        }
128
129        include_spip('action/editer_liens');
130        // optimiser les liens de tous les mots vers des objets effaces
131        // et depuis des mots effaces
132        $flux['data'] += objet_optimiser_liens(array('mot'=>'*'), array('evenement' => '*'));
133
134        return $flux;
135}
136
137
138/**
139 * Lister les evenements dans le calendrier de l'espace prive (extension organiseur)
140 *
141 * @param array $flux
142 * @return array
143 */
144function agenda_quete_calendrier_prive($flux) {
145        $quoi = $flux['args']['quoi'];
146        if (!$quoi or $quoi == 'evenements') {
147                $start = sql_quote($flux['args']['start']);
148                $end = sql_quote($flux['args']['end']);
149                $res = sql_select('*', 'spip_evenements AS E', "((E.date_fin >= $start OR E.date_debut >= $start) AND E.date_debut <= $end)");
150                while ($row = sql_fetch($res)) {
151                        $flux['data'][] = array(
152                                'id' => $row['id_evenement'],
153                                'title' => $row['titre'],
154                                'allDay' => false,
155                                'start' => $row['date_debut'],
156                                'end' => $row['date_fin'],
157                                'url' => str_replace('&amp;', '&', generer_url_entite($row['id_evenement'], 'evenement')),
158                                'className' => 'calendrier-event evenement calendrier-couleur5',
159                                'description' => $row['descriptif'],
160                        );
161                }
162        }
163        return $flux;
164}
165
166/**
167 * Synchroniser le statut des evenements lorsqu'on publie/depublie un article,
168 * si le plugin est configuré pour (par défaut)
169 * @param array $flux
170 * @return array
171 */
172function agenda_post_edition($flux) {
173        if (isset($flux['args']['table'])
174                and $flux['args']['table']=='spip_articles'
175                and $flux['args']['action'] == 'instituer'
176                and $id_article = $flux['args']['id_objet']
177                and isset($flux['data']['statut'])
178                and $statut = $flux['data']['statut']
179                and $statut_ancien = $flux['args']['statut_ancien']
180                and $statut != $statut_ancien
181                and lire_config('agenda/synchro_statut', 1)) {
182                $set = array();
183                // les evenements de cet article
184                $where = array('id_article='.intval($id_article));
185                switch ($statut) {
186                        case 'poubelle':
187                                // on passe aussi tous les evenements associes a la poubelle, sans distinction
188                                $set['statut'] = 'poubelle';
189                                break;
190                        case 'publie':
191                                // on passe aussi tous les evenements principaux prop en publie
192                                // (sera repercute sur les repetitions synchro automatiquement)
193                                $set['statut'] = 'publie';
194                                $where[] = "id_evenement_source=0";
195                                $where[] = "statut='prop'";
196                                break;
197                        default:
198                                if ($statut_ancien=='publie') {
199                                        // on depublie aussi tous les evenements source publie
200                                        $set['statut'] = 'prop';
201                                        $where[] = "id_evenement_source=0";
202                                        $where[] = "statut='publie'";
203                                }
204                                break;
205                }
206
207                if (count($set)) {
208                        include_spip('action/editer_evenement');
209                        $res = sql_select('id_evenement', 'spip_evenements', $where);
210                        // et on applique a tous les evenements lies a l'article
211                        while ($row = sql_fetch($res)) {
212                                autoriser_exception('instituer', 'evenement', $row['id_evenement']);
213                                evenement_modifier($row['id_evenement'], $set);
214                                autoriser_exception('instituer', 'evenement', $row['id_evenement'], false);
215                        }
216                }
217        }
218        return $flux;
219}
220
221/*
222 * Synchroniser les liaisons (mots, docs, gis, etc) de l'événement édité avec ses répétitions s'il en a
223 * @param array $flux
224 * @param array
225 */
226function agenda_post_edition_lien($flux) {
227        // Si on est en train de lier ou délier quelque chose a un événement
228        if ($flux['args']['objet'] == 'evenement') {
229                // On cherche si cet événement a des répétitions
230                if ($id_evenement = $flux['args']['id_objet']
231                        and $id_evenement > 0
232                        and $repetitions = sql_allfetsel('id_evenement', 'spip_evenements', 'id_evenement_source = '.$id_evenement)
233                        and is_array($repetitions)
234                ) {
235                        include_spip('action/editer_liens');
236
237                        // On a la liste des ids des répétitions
238                        $repetitions = array_map('reset', $repetitions);
239
240                        // Si c'est un ajout de lien, on l'ajoute à toutes les répétitions
241                        if ($flux['args']['action'] == 'insert') {
242                                objet_associer(
243                                        array($flux['args']['objet_source'] => $flux['args']['id_objet_source']),
244                                        array('evenement' => $repetitions)
245                                );
246                        } elseif ($flux['args']['action'] == 'delete') {
247                                // Si c'est une suppression de lien, on le supprime à toutes les répétitions
248                                objet_dissocier(
249                                        array($flux['args']['objet_source'] => $flux['args']['id_objet_source']),
250                                        array('evenement' => $repetitions)
251                                );
252                        }
253                }
254        }
255
256        return $flux;
257}
258
259/**
260 * Les evenements peuvent heriter des compositions des articles
261 * @param array $heritages
262 * @return array
263 */
264function agenda_compositions_declarer_heritage($heritages) {
265        $heritages['evenement'] = 'article';
266        return $heritages;
267}
268
269/**
270 * Insertion dans le pipeline revisions_chercher_label (Plugin révisions)
271 * Trouver le bon label à afficher sur les champs dans les listes de révisions
272 *
273 * Si un champ est un champ extra, son label correspond au label défini du champs extra
274 *
275 * @pipeline revisions_chercher_label
276 * @param array $flux Données du pipeline
277 * @return array      Données du pipeline
278**/
279function agenda_revisions_chercher_label($flux) {
280        foreach (array('date_debut', 'date_fin','horaire','lieu') as $champ) {
281                if ($flux['args']['champ'] == $champ) {
282                        $flux['data'] = _T('agenda:evenement_'.$champ);
283                        return $flux;
284                }
285        }
286
287        if ($flux['args']['champ'] == 'id_article') {
288                $flux['data'] = _T('agenda:evenement_article');
289        }
290
291        return $flux;
292}
293
294/**
295 * Insertion dans le pipeline accueil_encours (SPIP)
296 *
297 * Afficher les événements en attente de validation sur la page d'acceuil de l'espace privé
298 *
299 * @param array $flux Le contexte d'environnement du pipeline
300 * @return array $flux Le contexte d'environnement modifié
301 */
302function agenda_accueil_encours($flux){
303        $flux .= recuperer_fond('prive/objets/liste/evenements',
304                array(
305                        'statut' => array('prop'),
306                        'nb' => 5,
307                        'filtre_statut' => 'non',
308                ),
309                array('ajax' => true)
310        );
311        return $flux;
312}
313
314/** Déclarer les évènements
315 * au plugin corbeille
316 * @param array $flux;
317 * @return array $flux;
318**/
319function agenda_corbeille_table_infos($flux){
320        $flux['evenements']= array(
321                'statut'=>'poubelle',
322                'table'=>'evenements',
323                'tableliee'=>array('spip_evenements_participants')
324        );
325        return $flux;
326}
327
328/**
329 * 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,
330 * alors il n'y a pas lieu de générer une url propre pour un évènement
331 * qui pourrait prendre la place d'une url propre pour un autre objet.
332 * @param array $flux
333 * @return array $lux
334**/
335function agenda_propres_creer_chaine_url($flux) {
336        if ($flux['objet']['type'] == 'evenement' and lire_config('agenda/url_evenement_evenement') == 'article') {
337                $flux['data'] = 'evenement'.$flux['objet']['id_objet'];
338        }
339        return $flux;
340}
341
342/**
343 * Pour la saisie de type événement, indique si les données renvoyées sont tabulaire ou pas
344 * @param $flux
345 * @return $flux
346**/
347function agenda_saisie_est_tabulaire($flux) {
348        $args = $flux['args'];
349        if ($args['saisie'] != 'evenements') {
350                return $flux;
351        }
352        if ($args['options']['type_choix'] == 'checkbox') {
353                $flux['data'] = true;
354        }
355        return $flux;
356}
357
358
359/**
360 * 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.
361 * Utile pour les afficher_si
362 * @param $flux les saisies
363 * @return $flux les saisies modifier
364**/
365function agenda_saisies_afficher_si_js_saisies_form($flux) {
366
367        //Ne pas refaire 36 fois le calcul
368        static $old;
369        static $new;
370        if ($old == $flux) {
371                return $new;
372        }
373        $old = $flux;
374        include_spip('inc/saisies');
375        $saisies_par_type = saisies_lister_par_type($flux);
376        if (isset($saisies_par_type['evenements'])) {
377                foreach ($saisies_par_type['evenements'] as $saisie => $description) {
378                        $saisie_inserer = array(
379                                'saisie' => 'evenements_liste_attente',
380                                'options' => array('nom'=>$saisie.'_liste_attente')
381                        );
382                        $flux = saisies_inserer($flux, $saisie_inserer);
383                }
384        }
385        $new = $flux;
386        return $flux;
387}
388
389/**
390 * Effacer regulièrement les evenements de l'agenda si l'option est activee
391 * @param array $flux
392 * @return array
393 */
394function agenda_taches_generales_cron($flux) {
395        include_spip('inc/config');
396        if (lire_config('agenda/effacer_evenements_passes','')) {
397                $flux['agenda_effacer_evenements_passes'] = 24*3600;
398        }
399
400        return $flux;
401}
402
403/**
404 * Activer nospam sur le formulaire de participation
405 * @param array $formulaires
406 * @return array
407 */
408function agenda_nospam_lister_formulaires($formulaires) {
409        $formulaires[] = 'participer_evenement';
410        return $formulaires;
411}
Note: See TracBrowser for help on using the repository browser.