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

Last change on this file was 124653, checked in by Cerdic, 8 weeks ago

chaine de langue différente selon que l'on modifie liaisons d'évènement ou évènement lui-même

File size: 16.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/**
33 * Dans le formulaire d'édition de rubrique, ajout de la partie sur le mode agenda pour rubrique
34 * Dans les formulaires d'édition de lien pour les évènements, ajout du questionnement sur la synchro
35 * @param $flux
36 * @return $flux
37 **/
38function agenda_formulaire_fond($flux) {
39        if ($flux['args']['form'] == 'editer_rubrique') {
40                $contexte = $flux['args']['contexte'];
41                $form = recuperer_fond('prive/objets/editer/rubrique-agenda', $contexte);
42                if ($p = strpos($flux['data'], '<!--extra-->')) {
43                        $flux['data'] = substr_replace($flux['data'], $form, $p, 0);
44                }
45        }
46
47        if ($flux['args']['form'] == 'editer_liens' and $flux['args']['args'][1] == 'evenement') {
48                $contexte = $flux['args']['contexte'];
49                $form = '';
50                //Ne pas demander systmatiquement lorsqu'on fait des modifs en série
51                if ($m = _request('modif_synchro_source') !== null) {
52                        $form = "<input type='hidden' name='modif_synchro_source' value='$m' />";
53                }
54                $form .= recuperer_fond('formulaires/inc-modif_synchro_source', $contexte);
55                $flux['data'] = preg_replace('#<form.*>#U', "$0$form", $flux['data']);
56        }
57        return $flux;
58}
59
60/**
61 * Pour les formulaires de liaison,
62 * demande le cas échéant s'il faut que cela impact les répetitions
63 * @param $flux
64 * @return $flux
65**/
66function agenda_formulaire_verifier($flux) {
67        if ($flux['args']['form'] == 'editer_liens' and $flux['args']['args'][1] == 'evenement') {
68                $id_evenement = $flux['args']['args'][2];
69                $row_evenement = sql_fetsel('id_evenement_source, modif_synchro_source', 'spip_evenements', "id_evenement=$id_evenement");
70                $possede_repetition = sql_getfetsel('id_evenement','spip_evenements', "id_evenement_source=$id_evenement");
71                if (
72                        ($row_evenement['id_evenement_source'] or $possede_repetition)
73                        and $row_evenement['modif_synchro_source']
74                        and !count($flux['data'])
75                        and is_null(_request('modif_synchro_source'))
76                ) {
77                        $impact = $row_evenement['id_evenement_source'] ? 'est_une_repetition' : 'a_des_repetitions';
78                        $flux['data']['modif_synchro_source'] = _T('agenda:confirm_evenement_modifie_liaison_' . $impact);
79                        $flux['data']['message_erreur'] = '';
80                }
81        }
82        return $flux;
83}
84
85/**
86 * Pour les formulaires de liaison,
87 * modifie en base le paramètre de répetitions, le cas échéant
88 * @param $flux
89 * @return $flux
90**/
91function agenda_formulaire_receptionner($flux) {
92        if ($flux['args']['form'] == 'editer_liens'
93                and $flux['args']['args'][1] == 'evenement'
94                and _request('modif_synchro_source') !== null) {
95                $id_evenement = $flux['args']['args'][2];
96                include_spip('action/editer_evenement');
97                evenement_modifier($id_evenement, array('modif_synchro_source' => _request('modif_synchro_source')));
98        }
99        return $flux;
100}
101
102/**
103 * Inserer les infos d'agenda sur les articles et rubriques
104 *
105 * @param array $flux
106 * @return array
107 */
108function agenda_affiche_milieu($flux) {
109
110        $e = trouver_objet_exec($flux['args']['exec']);
111        $out = '';
112        $rubrique_agenda_presente = NULL;
113        if ($e
114                and $e['type'] === 'rubrique'
115                and $e['edition'] === false
116                and $id_rubrique = intval($flux['args']['id_rubrique'])
117                and $rubrique_agenda_presente = sql_countsel('spip_rubriques', 'agenda=1'))
118        {
119                $actif = sql_getfetsel('agenda', 'spip_rubriques', 'id_rubrique='.intval($id_rubrique));
120                $statut = '-32';
121                $alt = '';
122                $voir = '';
123                include_spip('inc/rubriques');
124                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))) {
125                        $alt = ($actif ? _T('agenda:rubrique_mode_agenda') : _T('agenda:rubrique_dans_une_rubrique_mode_agenda'));
126                        $statut = '-ok-32';
127                        $voir = _T('agenda:voir_evenements_rubrique');
128                }
129
130                if ($voir) {
131                        $res = _T('agenda:agenda')
132                                . " <small>| <a href='".generer_url_ecrire('evenements', "id_rubrique=$id_rubrique")."'>$voir</a></small>"
133                                . http_img_pack("agenda$statut.png", $alt, "class='statut'", $alt);
134                        $out .= boite_ouvrir($res, 'simple agenda-statut')
135                                . boite_fermer();
136                }
137        }
138        elseif ($e
139                and $e['type'] === 'article'
140                and $e['edition'] === false)
141        {
142                $id_article = $flux['args']['id_article'];
143                $out .= recuperer_fond('prive/objets/contenu/article-evenements', $flux['args']);
144        }
145
146        if ($out) {
147                if ($p = strpos($flux['data'], '<!--affiche_milieu-->')) {
148                        $flux['data'] = substr_replace($flux['data'], $out, $p, 0);
149                } else {
150                        $flux['data'] .= $out;
151                }
152        }
153        return $flux;
154}
155
156/**
157 * Optimiser la base
158 * (evenements a la poubelle, lies a des articles disparus, ou liens mots sur evenements disparus)
159 *
160 * @param array $flux
161 * @return array
162 */
163function agenda_optimiser_base_disparus($flux) {
164
165        # passer a la poubelle
166        # les evenements lies a un article inexistant
167        $res = sql_select(
168                'DISTINCT evenements.id_article',
169                'spip_evenements AS evenements LEFT JOIN spip_articles AS articles ON evenements.id_article=articles.id_article',
170                'articles.id_article IS NULL'
171        );
172        while ($row = sql_fetch($res)) {
173                sql_updateq('spip_evenements', array('statut'=>'poubelle'), 'id_article='.$row['id_article']);
174        }
175
176        // Evenements a la poubelle
177        sql_delete('spip_evenements', "statut='poubelle' AND maj < ".sql_quote($flux['args']['date']));
178
179        // Effacer les inscriptions à des evenement inexistants
180
181        $res = sql_select(
182                'DISTINCT evenements_participants.id_evenement',
183                'spip_evenements_participants AS evenements_participants LEFT JOIN spip_evenements AS evenements ON evenements_participants.id_evenement=evenements.id_evenement',
184                'evenements.id_evenement IS NULL'
185        );
186        while ($row = sql_fetch($res)) {
187                sql_delete('spip_evenements_participants','id_evenement='.intval($row['id_evenement']));
188        }
189
190        include_spip('action/editer_liens');
191        // optimiser les liens de tous les mots vers des objets effaces
192        // et depuis des mots effaces
193        $flux['data'] += objet_optimiser_liens(array('mot'=>'*'), array('evenement' => '*'));
194
195        return $flux;
196}
197
198
199/**
200 * Lister les evenements dans le calendrier de l'espace prive (extension organiseur)
201 *
202 * @param array $flux
203 * @return array
204 */
205function agenda_quete_calendrier_prive($flux) {
206        $quoi = $flux['args']['quoi'];
207        if (!$quoi or $quoi == 'evenements') {
208                $start = sql_quote($flux['args']['start']);
209                $end = sql_quote($flux['args']['end']);
210                $res = sql_select('*', 'spip_evenements AS E', "((E.date_fin >= $start OR E.date_debut >= $start) AND E.date_debut <= $end)");
211                while ($row = sql_fetch($res)) {
212                        $flux['data'][] = array(
213                                'id' => $row['id_evenement'],
214                                'title' => $row['titre'],
215                                'allDay' => false,
216                                'start' => $row['date_debut'],
217                                'end' => $row['date_fin'],
218                                'url' => str_replace('&amp;', '&', generer_url_entite($row['id_evenement'], 'evenement')),
219                                'className' => 'calendrier-event evenement calendrier-couleur5',
220                                'description' => $row['descriptif'],
221                        );
222                }
223        }
224        return $flux;
225}
226
227/**
228 * Synchroniser le statut des evenements lorsqu'on publie/depublie un article,
229 * si le plugin est configuré pour (par défaut)
230 * @param array $flux
231 * @return array
232 */
233function agenda_post_edition($flux) {
234        if (isset($flux['args']['table'])
235                and $flux['args']['table']=='spip_articles'
236                and $flux['args']['action'] == 'instituer'
237                and $id_article = $flux['args']['id_objet']
238                and isset($flux['data']['statut'])
239                and $statut = $flux['data']['statut']
240                and $statut_ancien = $flux['args']['statut_ancien']
241                and $statut != $statut_ancien
242                and lire_config('agenda/synchro_statut', 1)) {
243                $set = array();
244                // les evenements de cet article
245                $where = array('id_article='.intval($id_article));
246                switch ($statut) {
247                        case 'poubelle':
248                                // on passe aussi tous les evenements associes a la poubelle, sans distinction
249                                $set['statut'] = 'poubelle';
250                                break;
251                        case 'publie':
252                                // on passe aussi tous les evenements principaux prop en publie
253                                // (sera repercute sur les repetitions synchro automatiquement)
254                                $set['statut'] = 'publie';
255                                $where[] = "id_evenement_source=0";
256                                $where[] = "statut='prop'";
257                                break;
258                        default:
259                                if ($statut_ancien=='publie') {
260                                        // on depublie aussi tous les evenements source publie
261                                        $set['statut'] = 'prop';
262                                        $where[] = "id_evenement_source=0";
263                                        $where[] = "statut='publie'";
264                                }
265                                break;
266                }
267
268                if (count($set)) {
269                        include_spip('action/editer_evenement');
270                        $res = sql_select('id_evenement', 'spip_evenements', $where);
271                        // et on applique a tous les evenements lies a l'article
272                        while ($row = sql_fetch($res)) {
273                                autoriser_exception('instituer', 'evenement', $row['id_evenement']);
274                                evenement_modifier($row['id_evenement'], $set);
275                                autoriser_exception('instituer', 'evenement', $row['id_evenement'], false);
276                        }
277                }
278        }
279        return $flux;
280}
281
282/**
283 * Synchroniser les liaisons (mots, docs, gis, etc) de l'événement édité
284 * avec ses répétition sœurs/filles/mères
285 * @param array $flux
286 * @return array flux
287**/
288function agenda_post_edition_lien($flux) {
289        // Si on est en train de lier ou délier quelque chose a un événement
290        if ($flux['args']['objet'] == 'evenement'
291                and $id_evenement = $flux['args']['id_objet']
292                and $id_evenement > 0) {
293                $row = sql_fetsel('*', 'spip_evenements', 'id_evenement='.intval($id_evenement));
294
295                // Si on a désactivé la synchro, rien à faire
296                if ($row['modif_synchro_source'] == 0) {
297                        return $flux;
298                }
299
300                // Comme objet_associer/dissocier appelle le pipeline
301                // il ne faut executer cela qu'au premier appel du pipeline pour le meme evenement source
302                $id_evenement_source = intval($row['id_evenement_source'] ? $row['id_evenement_source'] : $id_evenement);
303                static $deja = array();
304                if (isset($deja[$id_evenement_source])) {
305                        return $flux;
306                }
307                $deja[$id_evenement_source] = true;
308
309                // Chercher les répetitions à modifier
310                $repetitions = array();
311                /* Cas 1. L'évènement est une répetition
312                 a. Chercher les évènement fille qui ont la synchro activé
313                 b. Ajouter aussi l'évènement source si lui même est en mode synchro
314                */
315                 if ($row['id_evenement_source']) {
316                        if ($source = sql_fetsel('*', 'spip_evenements', 'id_evenement='.intval($row['id_evenement_source']))) {
317                                $repetitions =  sql_allfetsel('id_evenement', 'spip_evenements',
318                                        array(
319                                                'modif_synchro_source=1',
320                                                'id_evenement_source='.intval($row['id_evenement_source']),
321                                                'id_evenement!='.intval($id_evenement)
322                                        )
323                                );
324                                $repetitions = array_column($repetitions, 'id_evenement');
325                                if ($source['modif_synchro_source']) {
326                                        $repetitions[] = $row['id_evenement_source'];// Ajouter l'évènement source lui même si il est synchro aussi
327                                }
328                        }
329                } else {
330                        /*
331                        Cas 2, l'évènement est lui-même une source,
332                        dans ce cas synchroniser tous les évènements fils qui sont synchro
333                        (on a déjà vérifié que c'était le cas pour l'évènement lui-même)
334                        */
335                        $repetitions =  sql_allfetsel('id_evenement', 'spip_evenements',
336                                array(
337                                        'modif_synchro_source=1',
338                                        'id_evenement_source='.intval($id_evenement)
339                                )
340                        );
341                        $repetitions = array_column($repetitions, 'id_evenement');
342                }
343                include_spip('action/editer_liens');
344                // Si c'est un ajout de lien, on l'ajoute à toutes les répétitions
345                if ($flux['args']['action'] == 'insert') {
346                        objet_associer(
347                                array($flux['args']['objet_source'] => $flux['args']['id_objet_source']),
348                                array('evenement' => $repetitions)
349                        );
350                } elseif ($flux['args']['action'] == 'delete') {
351                        // Si c'est une suppression de lien, on le supprime à toutes les répétitions
352                        objet_dissocier(
353                                array($flux['args']['objet_source'] => $flux['args']['id_objet_source']),
354                                array('evenement' => $repetitions)
355                        );
356                }
357                unset($deja[$id_evenement_source]);
358        }
359        return $flux;
360}
361
362/**
363 * Les evenements peuvent heriter des compositions des articles
364 * @param array $heritages
365 * @return array
366 */
367function agenda_compositions_declarer_heritage($heritages) {
368        $heritages['evenement'] = 'article';
369        return $heritages;
370}
371
372/**
373 * Insertion dans le pipeline revisions_chercher_label (Plugin révisions)
374 * Trouver le bon label à afficher sur les champs dans les listes de révisions
375 *
376 * Si un champ est un champ extra, son label correspond au label défini du champs extra
377 *
378 * @pipeline revisions_chercher_label
379 * @param array $flux Données du pipeline
380 * @return array      Données du pipeline
381**/
382function agenda_revisions_chercher_label($flux) {
383        foreach (array('date_debut', 'date_fin','horaire','lieu') as $champ) {
384                if ($flux['args']['champ'] == $champ) {
385                        $flux['data'] = _T('agenda:evenement_'.$champ);
386                        return $flux;
387                }
388        }
389
390        if ($flux['args']['champ'] == 'id_article') {
391                $flux['data'] = _T('agenda:evenement_article');
392        }
393
394        return $flux;
395}
396
397/**
398 * Insertion dans le pipeline accueil_encours (SPIP)
399 *
400 * Afficher les événements en attente de validation sur la page d'acceuil de l'espace privé
401 *
402 * @param array $flux Le contexte d'environnement du pipeline
403 * @return array $flux Le contexte d'environnement modifié
404 */
405function agenda_accueil_encours($flux){
406        $flux .= recuperer_fond('prive/objets/liste/evenements',
407                array(
408                        'statut' => array('prop'),
409                        'nb' => 5,
410                        'filtre_statut' => 'non',
411                ),
412                array('ajax' => true)
413        );
414        return $flux;
415}
416
417/** Déclarer les évènements
418 * au plugin corbeille
419 * @param array $flux;
420 * @return array $flux;
421**/
422function agenda_corbeille_table_infos($flux){
423        $flux['evenements']= array(
424                'statut'=>'poubelle',
425                'table'=>'evenements',
426                'tableliee'=>array('spip_evenements_participants')
427        );
428        return $flux;
429}
430
431/**
432 * 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,
433 * alors il n'y a pas lieu de générer une url propre pour un évènement
434 * qui pourrait prendre la place d'une url propre pour un autre objet.
435 * @param array $flux
436 * @return array $lux
437**/
438function agenda_propres_creer_chaine_url($flux) {
439        if ($flux['objet']['type'] == 'evenement' and lire_config('agenda/url_evenement_evenement') == 'article') {
440                $flux['data'] = 'evenement'.$flux['objet']['id_objet'];
441        }
442        return $flux;
443}
444
445/**
446 * Pour la saisie de type événement, indique si les données renvoyées sont tabulaires ou pas
447 * @param $flux
448 * @return $flux
449**/
450function agenda_saisie_est_tabulaire($flux) {
451        $args = $flux['args'];
452        if ($args['saisie'] != 'evenements') {
453                return $flux;
454        }
455        if ($args['options']['type_choix'] == 'checkbox') {
456                $flux['data'] = true;
457        }
458        return $flux;
459}
460
461
462/**
463 * 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.
464 * Utile pour les afficher_si
465 * @param $flux les saisies
466 * @return $flux les saisies modifier
467**/
468function agenda_saisies_afficher_si_js_saisies_form($flux) {
469
470        //Ne pas refaire 36 fois le calcul
471        static $old;
472        static $new;
473        if ($old == $flux) {
474                return $new;
475        }
476        $old = $flux;
477        include_spip('inc/saisies');
478        $saisies_par_type = saisies_lister_par_type($flux);
479        if (isset($saisies_par_type['evenements'])) {
480                foreach ($saisies_par_type['evenements'] as $saisie => $description) {
481                        $saisie_inserer = array(
482                                'saisie' => 'evenements_liste_attente',
483                                'options' => array('nom'=>$saisie.'_liste_attente')
484                        );
485                        $flux = saisies_inserer($flux, $saisie_inserer);
486                }
487        }
488        $new = $flux;
489        return $flux;
490}
491
492/**
493 * Effacer regulièrement les evenements de l'agenda si l'option est activee
494 * @param array $flux
495 * @return array
496 */
497function agenda_taches_generales_cron($flux) {
498        include_spip('inc/config');
499        if (lire_config('agenda/effacer_evenements_passes','')) {
500                $flux['agenda_effacer_evenements_passes'] = 24*3600;
501        }
502
503        return $flux;
504}
505
506/**
507 * Activer nospam sur le formulaire de participation
508 * @param array $formulaires
509 * @return array
510 */
511function agenda_nospam_lister_formulaires($formulaires) {
512        $formulaires[] = 'participer_evenement';
513        return $formulaires;
514}
Note: See TracBrowser for help on using the repository browser.