8e3cd7b5b4661f5fbe842a709e4d6e9fb09bde09
[lhc/web/www.git] / www / plugins-dist / organiseur / action / quete_calendrier_prive.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 /**
14 * Gestion de l'action de quête des événements du calendrier
15 *
16 * @package SPIP\Organiseur\Action
17 **/
18
19 if (!defined('_ECRIRE_INC_VERSION')) {
20 return;
21 }
22
23 /**
24 * Fournir une liste d'"evenements" entre deux dates start et end
25 * au format json
26 *
27 * Utilisé pour l'affichage du calendrier privé et public
28 *
29 * @pipeline_appel quete_calendrier_prive
30 * @uses quete_calendrier_interval_rv()
31 * @uses quete_calendrier_interval()
32 * @uses convert_fullcalendar_quete_calendrier_interval_rv()
33 * @uses convert_fullcalendar_quete_calendrier_interval()
34 *
35 * @return void
36 */
37 function action_quete_calendrier_prive_dist() {
38 $securiser_action = charger_fonction('securiser_action', 'inc');
39 $securiser_action();
40
41 $start = strtotime(_request('start'));
42 $end = strtotime(_request('end'));
43 $quoi = _request('quoi');
44
45 include_spip('inc/quete_calendrier');
46
47 $evt = array();
48
49 // recuperer la liste des evenements au format ics
50 $start = date('Y-m-d H:i:s', $start);
51 $end = date('Y-m-d H:i:s', $end);
52 $limites = array(sql_quote($start), sql_quote($end));
53
54 // on fonction de quoi on récupère : tout (rv + publication) ou l'un ou l'autre.
55 $entier = $duree = array();
56
57 if (!$quoi or $quoi == 'rv') {
58 $duree = quete_calendrier_interval_rv(reset($limites), end($limites));
59 $evt = convert_fullcalendar_quete_calendrier_interval_rv($duree, $evt);
60 }
61
62 if (!$quoi or $quoi == 'publication') {
63 list($entier, ) = quete_calendrier_interval($limites);
64 $evt = convert_fullcalendar_quete_calendrier_interval($entier, $evt);
65 }
66
67
68 // permettre aux plugins d'afficher leurs evenements dans ce calendrier
69 $evt = pipeline(
70 'quete_calendrier_prive',
71 array(
72 'args' => array('start' => $start, 'end' => $end, 'quoi' => $quoi),
73 'data' => $evt,
74 )
75 );
76
77 // format json
78 include_spip('inc/json');
79 echo json_encode($evt);
80 }
81
82 /**
83 * Convertir une date au format ical renvoyée par quete_calendrier_interval
84 * dans le format attendu par fullcalendar : yyyy-mm-dd H:i:s
85 *
86 * @param $dateical
87 * @return string
88 */
89 function convert_dateical($dateical) {
90 $d = explode('T', $dateical);
91 $amj = reset($d);
92 $s = substr($amj, 0, 4) . '-' . substr($amj, 4, 2) . '-' . substr($amj, 6, 2);
93 if (count($d) > 1) {
94 $his = end($d);
95 $s .= ' ' . substr($his, 0, 2) . ':' . substr($his, 2, 2) . ':' . substr($his, 4, 2);
96 }
97
98 return $s;
99 }
100
101 /**
102 * Convertir une sortie événement de quète calendrier_interval
103 * dans le format attendu par fullcalendar
104 *
105 * @param array $messages
106 * Les événements / messages au format de la quete calendrier_interval
107 * @param array $evt
108 * Les événements au format fullcalendar déjà présents
109 * @return array
110 * Les événements au format fullcalendar
111 **/
112 function convert_fullcalendar_quete_calendrier_interval($messages, $evt = array()) {
113 if (!$messages) {
114 return $evt;
115 }
116
117 // la retransformer au format attendu par fullcalendar
118 // facile : chaque evt n'est mentionne qu'une fois, a une date
119 foreach ($messages as $amj => $l) {
120 $date = substr($amj, 0, 4) . '-' . substr($amj, 4, 2) . '-' . substr($amj, 6, 2);
121 foreach ($l as $e) {
122 $evt[] = array(
123 'id' => 0,
124 'title' => $e['SUMMARY'],
125 'allDay' => true,
126 'start' => $date,
127 'end' => $date,
128 'url' => str_replace('&amp;', '&', $e['URL']),
129 'className' => 'calendrier-event ' . $e['CATEGORIES'],
130 'description' => $e['DESCRIPTION'],
131 );
132 }
133 }
134
135 return $evt;
136 }
137
138 /**
139 * Convertir une sortie événement de quete calendrier_interval_rv
140 * dans le format attendu par fullcalendar
141 *
142 * @use convert_dateical()
143 *
144 * @param array $messages
145 * Les événements / messages au format issu de la quete calendrier_interval_rv
146 * @param array $evt
147 * Les événements au format fullcalendar déjà présents
148 * @return array
149 * Les événements au format fullcalendar
150 **/
151 function convert_fullcalendar_quete_calendrier_interval_rv($messages, $evt = array()) {
152 if (!$messages) {
153 return $evt;
154 }
155
156 // ici il faut faire attention : un evt apparait N fois
157 // mais on a son id
158 $seen = array();
159
160 // toutes les messages déjà inscrits qu'on ne remet pas
161 foreach ($evt as $e) {
162 $seen[$e['url']] = true;
163 }
164
165 foreach ($messages as $l) {
166 foreach ($l as $id => $e) {
167 $url = str_replace('&amp;', '&', $e['URL']);
168 if (!isset($seen[$url])) {
169 $evt[] = array(
170 'id' => $id,
171 'title' => $e['SUMMARY'],
172 'allDay' => false,
173 'start' => convert_dateical($e['DTSTART']), //Ymd\THis
174 'end' => convert_dateical($e['DTEND']), // Ymd\THis
175 'url' => $url,
176 'className' => 'calendrier-event ' . $e['CATEGORIES'],
177 'description' => $e['DESCRIPTION'],
178 );
179 $seen[$url] = true;
180 }
181 }
182 }
183
184 return $evt;
185 }