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

Last change on this file since 111860 was 111860, checked in by cedric@…, 17 months ago

Corriger r110827 qui cassait tout le cartouche dans le cas normal d'utilisation

File size: 9.6 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
33/**
34 * Inserer les infos d'agenda sur les articles et rubriques
35 *
36 * @param array $flux
37 * @return array
38 */
39function agenda_affiche_milieu($flux) {
40        //
41        if (!defined('_AGENDA_CHOIX_RUBRIQUE_OUVERT'))
42                define('_AGENDA_CHOIX_RUBRIQUE_OUVERT',true);
43        $e = trouver_objet_exec($flux['args']['exec']);
44        $out = '';
45        $rubrique_agenda_presente = NULL;
46        if ($e['type']=='rubrique'
47                and autoriser('configurer')
48                and $e['edition']==false
49                and $id_rubrique = intval($flux['args']['id_rubrique'])
50                and autoriser('modifier', 'rubrique', $id_rubrique)
51                and (($rubrique_agenda_presente = sql_countsel('spip_rubriques', 'agenda=1')) or (_AGENDA_CHOIX_RUBRIQUE_OUVERT))) {
52                $activer = true;
53                $res = '';
54                $actif = sql_getfetsel('agenda', 'spip_rubriques', 'id_rubrique='.intval($id_rubrique));
55                $statut = '-32';
56                $alt = '';
57                $voir = '';
58                if (!$rubrique_agenda_presente) {
59                        $res .= "<span class='small'>" . _T('agenda:aucune_rubrique_mode_agenda') . '</span><br />';
60                } else {
61                        include_spip('inc/rubriques');
62                        if (sql_countsel('spip_rubriques', sql_in('id_rubrique', calcul_hierarchie_in($id_rubrique)).' AND agenda=1 AND id_rubrique<>'.intval($id_rubrique))) {
63                                $alt = _T('agenda:rubrique_dans_une_rubrique_mode_agenda');
64                                $activer = false;
65                                $statut = '-ok-32';
66                                $voir = _T('agenda:voir_evenements_rubrique');
67                        } elseif (!$actif) {
68                                $alt = _T('agenda:rubrique_sans_gestion_evenement').'<br />';
69                                $statut = '-non-32';
70                        }
71                        if ($actif) {
72                                $alt = _T('agenda:rubrique_mode_agenda').'<br />';
73                                $statut = '-ok-32';
74                                $voir = _T('agenda:voir_evenements_rubrique');
75                        }
76                }
77
78                if (!$actif) {
79                        if ($activer) {
80                                $res .= bouton_action(_T('agenda:rubrique_activer_agenda'), generer_action_auteur('activer_agenda_rubrique', $id_rubrique, self()), 'ajax');
81                        }
82                } else {
83                        $res .= bouton_action(_T('agenda:rubrique_desactiver_agenda'), generer_action_auteur('activer_agenda_rubrique', "-$id_rubrique", self()), 'ajax');
84                }
85                if ($voir) {
86                        $res .= " | <a href='".generer_url_ecrire('evenements', "id_rubrique=$id_rubrique")."'>$voir</a>";
87                }
88                if ($res) {
89                        $out .= boite_ouvrir(_T('agenda:agenda').http_img_pack("agenda$statut.png", $alt, "class='statut'", $alt), 'simple agenda-statut')
90                                . $res
91                                . boite_fermer();
92                }
93        } elseif ($e['type']=='article'
94                and $e['edition']==false) {
95                $id_article = $flux['args']['id_article'];
96                $out .= recuperer_fond('prive/objets/contenu/article-evenements', $flux['args']);
97        }
98
99        if ($out) {
100                if ($p = strpos($flux['data'], '<!--affiche_milieu-->')) {
101                        $flux['data'] = substr_replace($flux['data'], $out, $p, 0);
102                } else {
103                        $flux['data'] .= $out;
104                }
105        }
106        return $flux;
107}
108
109/**
110 * Optimiser la base
111 * (evenements a la poubelle, lies a des articles disparus, ou liens mots sur evenements disparus)
112 *
113 * @param array $flux
114 * @return array
115 */
116function agenda_optimiser_base_disparus($flux) {
117
118        # passer a la poubelle
119        # les evenements lies a un article inexistant
120        $res = sql_select(
121                'DISTINCT evenements.id_article',
122                'spip_evenements AS evenements LEFT JOIN spip_articles AS articles ON evenements.id_article=articles.id_article',
123                'articles.id_article IS NULL'
124        );
125        while ($row = sql_fetch($res)) {
126                sql_updateq('spip_evenements', array('statut'=>'poubelle'), 'id_article='.$row['id_article']);
127        }
128
129        // Evenements a la poubelle
130        sql_delete('spip_evenements', "statut='poubelle' AND maj < ".$flux['args']['date']);
131
132        include_spip('action/editer_liens');
133        // optimiser les liens de tous les mots vers des objets effaces
134        // et depuis des mots effaces
135        $flux['data'] += objet_optimiser_liens(array('mot'=>'*'), array('evenement' => '*'));
136
137        return $flux;
138}
139
140
141/**
142 * Lister les evenements dans le calendrier de l'espace prive (extension organiseur)
143 *
144 * @param array $flux
145 * @return array
146 */
147function agenda_quete_calendrier_prive($flux) {
148        $quoi = $flux['args']['quoi'];
149        if (!$quoi or $quoi == 'evenements') {
150                $start = sql_quote($flux['args']['start']);
151                $end = sql_quote($flux['args']['end']);
152                $res = sql_select('*', 'spip_evenements AS E', "((E.date_fin >= $start OR E.date_debut >= $start) AND E.date_debut <= $end)");
153                while ($row = sql_fetch($res)) {
154                        $flux['data'][] = array(
155                                'id' => $row['id_evenement'],
156                                'title' => $row['titre'],
157                                'allDay' => false,
158                                'start' => $row['date_debut'],
159                                'end' => $row['date_fin'],
160                                'url' => str_replace('&amp;', '&', generer_url_entite($row['id_evenement'], 'evenement')),
161                                'className' => 'calendrier-event evenement calendrier-couleur5',
162                                'description' => $row['descriptif'],
163                        );
164                }
165        }
166        return $flux;
167}
168
169/**
170 * Synchroniser le statut des evenements lorsqu'on publie/depublie un article
171 * @param array $flux
172 * @return array
173 */
174function agenda_post_edition($flux) {
175        if (isset($flux['args']['table'])
176                and $flux['args']['table']=='spip_articles'
177                and $flux['args']['action'] == 'instituer'
178                and $id_article = $flux['args']['id_objet']
179                and isset($flux['data']['statut'])
180                and $statut = $flux['data']['statut']
181                and $statut_ancien = $flux['args']['statut_ancien']
182                and $statut != $statut_ancien) {
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}
Note: See TracBrowser for help on using the repository browser.