[SPIP] ~maj v3.2.9-->v3.2.11
[lhc/web/www.git] / www / plugins-dist / organiseur / inc / quete_calendrier.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2020 *
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 * Fonctions de quêtes pour les calendriers : obtient les listes
15 * des éléments à afficher dans des périodes données
16 *
17 * @package SPIP\Organiseur\Fonctions
18 **/
19
20 if (!defined('_ECRIRE_INC_VERSION')) {
21 return;
22 }
23
24 include_spip('inc/filtres');
25
26
27 /**
28 * Retourne un nom de classe CSS représentant la catégorie de l'événement
29 * dans le calendrier
30 *
31 * S'appuie soit sur une fonction PHP `generer_calendrier_class()` si elle
32 * existe, soit à défaut sur le numéro de rubrique.
33 *
34 * @param string $table
35 * Nom de la table SQL d'où provient l'événement
36 * @param int $num
37 * Identifiant dans la table
38 * @param string $objet
39 * Nom de la clé primaire
40 * @return string
41 * Nom de classe CSS
42 **/
43 function calendrier_categories($table, $num, $objet) {
44 if (function_exists('generer_calendrier_class')) {
45 return generer_calendrier_class($table, $num, $objet);
46 } else {
47 // cf agenda.css
48 $num = sql_getfetsel((($objet != 'id_breve') ? 'id_secteur' : 'id_rubrique') . ' AS id', $table, "$objet=$num");
49
50 return 'calendrier-couleur' . (($num % 14) + 1);
51 }
52 }
53
54 /**
55 * Pour une date donnée, retourne une période allant de la veille au lendemain
56 *
57 * @param int $annee
58 * @param int $mois
59 * @param int $jour
60 * @return array
61 * Liste (date de la veille à 0h, date du lendemain à 23h59:59)
62 **/
63 function quete_calendrier_jour($annee, $mois, $jour) {
64 $avant = "'" . date('Y-m-d', mktime(0, 0, 0, $mois, $jour - 1, $annee)) . "'";
65 $apres = "'" . date('Y-m-d', mktime(1, 1, 1, $mois, $jour + 1, $annee)) .
66 " 23:59:59'";
67
68 return array($avant, $apres);
69 }
70
71
72 /**
73 * Retourne les publications et les messages pour une période donnée
74 *
75 * Retourne un tableau de 2 tableaux indéxés par des dates :
76 * - le premier indique les événements du jour, sans indication de durée
77 * (par exemple les publications d'articles)
78 * - le deuxième indique les événements commençant ce jour, avec indication de durée
79 * (par exemple les rendez-vous)
80 *
81 * @uses quete_calendrier_interval_articles()
82 * @uses quete_calendrier_interval_breves()
83 * @uses quete_calendrier_interval_rubriques()
84 * @uses quete_calendrier_interval_rv()
85 *
86 * @param array $limites
87 * Liste (date de début, date de fin)
88 * @return array
89 * Liste (événements sans durée, événements avec durée)
90 **/
91 function quete_calendrier_interval($limites) {
92 include_spip('inc/urls');
93 list($avant, $apres) = $limites;
94 $evt = array();
95 quete_calendrier_interval_articles($avant, $apres, $evt);
96 quete_calendrier_interval_breves($avant, $apres, $evt);
97 quete_calendrier_interval_rubriques($avant, $apres, $evt);
98
99 return array($evt, quete_calendrier_interval_rv($avant, $apres));
100 }
101
102 # 4 fonctions retournant les evenements d'une periode
103 # le tableau retourne est indexe par les balises du format ics
104 # afin qu'il soit facile de produire de tels documents.
105 # L'URL de chacun de ces evenements est celle de l'espace prive
106 # pour faciliter la navigation, ce qu'on obtient utilisant
107 # le 4e argument des fonctions generer_url_ecrire_$table
108
109 /**
110 * Retourne la liste des messages de forum (format ICS) écrits dans une période donnée
111 *
112 * @param array $limites
113 * Liste (date de début, date de fin)
114 * @param array $evenements
115 * Tableau des événements déjà présents qui sera complété par la fonction.
116 * Format : `$evenements[$amj][] = Tableau de description ICS`
117 **/
118 function quete_calendrier_interval_forums($limites, &$evenements) {
119 list($avant, $apres) = $limites;
120 $result = sql_select(
121 'DISTINCT titre, date_heure, id_forum',
122 'spip_forum',
123 "date_heure >= $avant AND date_heure < $apres",
124 '',
125 'date_heure'
126 );
127 while ($row = sql_fetch($result)) {
128 $amj = date_anneemoisjour($row['date_heure']);
129 $id = $row['id_forum'];
130 if (autoriser('voir', 'forum', $id)) {
131 $evenements[$amj][] =
132 array(
133 'URL' => generer_url_entite($id, 'forum'),
134 'CATEGORIES' => 'calendrier-couleur7',
135 'SUMMARY' => $row['titre'],
136 'DTSTART' => date_ical($row['date_heure'])
137 );
138 }
139 }
140 }
141
142 /**
143 * Retourne la liste des articles (format ICS) publiés dans une période donnée
144 *
145 * @param string $avant
146 * Date de début
147 * @param string $apres
148 * Date de fin
149 * @param array $evenements
150 * Tableau des événements déjà présents qui sera complété par la fonction.
151 * Format : `$evenements[$amj][] = Tableau de description ICS`
152 **/
153 function quete_calendrier_interval_articles($avant, $apres, &$evenements) {
154
155 $result = sql_select(
156 'id_article, titre, date, descriptif, chapo, lang',
157 'spip_articles',
158 "statut='publie' AND date >= $avant AND date < $apres",
159 '',
160 'date'
161 );
162
163 // tables traduites
164 $objets = explode(',', $GLOBALS['meta']['multi_objets']);
165
166 if (in_array('spip_articles', $objets)) {
167 include_spip('inc/lang_liste');
168 $langues = $GLOBALS['codes_langues'];
169 } else {
170 $langues = array();
171 }
172
173 while ($row = sql_fetch($result)) {
174 $amj = date_anneemoisjour($row['date']);
175 $id = $row['id_article'];
176 if (autoriser('voir', 'article', $id)) {
177 $langue = isset($langues[$row['lang']]) ? $langues[$row['lang']] : "";
178 $evenements[$amj][] =
179 array(
180 'CATEGORIES' => calendrier_categories('spip_articles', $id, 'id_article'),
181 'DESCRIPTION' => $row['descriptif'] ?: $langue,
182 'SUMMARY' => $row['titre'],
183 'URL' => generer_url_ecrire_objet('article', $id, '', '', 'prop')
184 );
185 }
186 }
187 }
188
189 /**
190 * Retourne la liste des rubriques (format ICS) publiées dans une période donnée
191 *
192 * @param string $avant
193 * Date de début
194 * @param string $apres
195 * Date de fin
196 * @param array $evenements
197 * Tableau des événements déjà présents qui sera complété par la fonction.
198 * Format : `$evenements[$amj][] = Tableau de description ICS`
199 **/
200 function quete_calendrier_interval_rubriques($avant, $apres, &$evenements) {
201
202 $result = sql_select(
203 'DISTINCT R.id_rubrique, titre, descriptif, date',
204 'spip_rubriques AS R, spip_documents_liens AS L',
205 "statut='publie' AND date >= $avant AND date < $apres
206 AND R.id_rubrique = L.id_objet AND L.objet='rubrique'",
207 '',
208 'date'
209 );
210 while ($row = sql_fetch($result)) {
211 $amj = date_anneemoisjour($row['date']);
212 $id = $row['id_rubrique'];
213 if (autoriser('voir', 'rubrique', $id)) {
214 $evenements[$amj][] =
215 array(
216 'CATEGORIES' => calendrier_categories('spip_rubriques', $id, 'id_rubrique'),
217 'DESCRIPTION' => $row['descriptif'],
218 'SUMMARY' => $row['titre'],
219 'URL' => generer_url_ecrire_objet('rubrique', $id, '', '', 'prop')
220 );
221 }
222 }
223 }
224
225 /**
226 * Retourne la liste des brèves (format ICS) publiées dans une période donnée
227 *
228 * @param string $avant
229 * Date de début
230 * @param string $apres
231 * Date de fin
232 * @param array $evenements
233 * Tableau des événements déjà présents qui sera complété par la fonction.
234 * Format : `$evenements[$amj][] = Tableau de description ICS`
235 **/
236 function quete_calendrier_interval_breves($avant, $apres, &$evenements) {
237 $result = sql_select(
238 'id_breve, titre, date_heure, id_rubrique',
239 'spip_breves',
240 "statut='publie' AND date_heure >= $avant AND date_heure < $apres",
241 '',
242 'date_heure'
243 );
244 while ($row = sql_fetch($result)) {
245 $amj = date_anneemoisjour($row['date_heure']);
246 $id = $row['id_breve'];
247 $ir = $row['id_rubrique'];
248 if (autoriser('voir', 'breve', $id)) {
249 $evenements[$amj][] =
250 array(
251 'URL' => generer_url_ecrire_objet('breve', $id, '', '', 'prop'),
252 'CATEGORIES' => calendrier_categories('spip_breves', $ir, 'id_breve'),
253 'SUMMARY' => $row['titre']
254 );
255 }
256 }
257 }
258
259 /**
260 * Retourne la liste des messages (format ICS) de l'auteur connecté,
261 * pour une période donnée
262 *
263 * @param string $avant
264 * Date de début
265 * @param string $apres
266 * Date de fin
267 * @return array
268 * De la forme : `$evt[date][id_message] = Tableau des données ICS`
269 **/
270 function quete_calendrier_interval_rv($avant, $apres) {
271 include_spip('inc/session');
272 $connect_id_auteur = session_get('id_auteur');
273 $auteurs = array();
274
275 $evenements = array();
276 if (!$connect_id_auteur) {
277 return $evenements;
278 }
279 $result = sql_select(
280 'M.id_message, M.titre, M.texte, M.date_heure, M.date_fin, M.type',
281 'spip_messages AS M LEFT JOIN spip_auteurs_liens AS L ON (L.id_objet=M.id_message)',
282 "((L.objet='message' AND (L.id_auteur=$connect_id_auteur OR M.type='affich'))
283 OR (L.objet IS NULL AND M.id_auteur=$connect_id_auteur AND " . sql_in(
284 'M.type',
285 array('pb', 'affich')
286 ) . '))'
287 . " AND M.rv='oui'
288 AND ((M.date_fin >= $avant OR M.date_heure >= $avant)
289 AND M.date_heure <= $apres)
290 AND M.statut='publie'",
291 'M.id_message',
292 'M.date_heure'
293 );
294 while ($row = sql_fetch($result)) {
295 $date_heure = $row['date_heure'];
296 $date_fin = $row['date_fin'];
297 $type = $row['type'];
298 $id_message = $row['id_message'];
299
300 if ($type == 'pb') {
301 $cat = 'calendrier-couleur2';
302 } else {
303 if ($type == 'affich') {
304 $cat = 'calendrier-couleur4';
305 } else {
306 if ($type != 'normal') {
307 $cat = 'calendrier-couleur12';
308 } else {
309 $cat = 'calendrier-couleur9';
310 $auteurs = array_map(
311 'array_shift',
312 sql_allfetsel(
313 'nom',
314 'spip_auteurs AS A LEFT JOIN spip_auteurs_liens AS L ON L.id_auteur=A.id_auteur',
315 "(L.objet='message' AND L.id_objet=$id_message AND (A.id_auteur!=$connect_id_auteur))"
316 )
317 );
318 }
319 }
320 }
321
322 $jour_avant = substr($avant, 9, 2);
323 $mois_avant = substr($avant, 6, 2);
324 $annee_avant = substr($avant, 1, 4);
325 $jour_apres = substr($apres, 9, 2);
326 $mois_apres = substr($apres, 6, 2);
327 $annee_apres = substr($apres, 1, 4);
328 $ical_apres = date_anneemoisjour("$annee_apres-$mois_apres-" . sprintf('%02d', $jour_apres));
329
330 // Calcul pour les semaines a cheval sur deux mois
331 $j = 0;
332 $amj = date_anneemoisjour("$annee_avant-$mois_avant-" . sprintf('%02d', $j + ($jour_avant)));
333
334 while ($amj <= $ical_apres) {
335 if (!($amj == date_anneemoisjour($date_fin) and preg_match(
336 ',00:00:00,',
337 $date_fin
338 ))) {
339 // Ne pas prendre la fin a minuit sur jour precedent
340 $evenements[$amj][$id_message] =
341 array(
342 'URL' => generer_url_ecrire('message', "id_message=$id_message"),
343 'DTSTART' => date_ical($date_heure),
344 'DTEND' => date_ical($date_fin),
345 'DESCRIPTION' => $row['texte'],
346 'SUMMARY' => $row['titre'],
347 'CATEGORIES' => $cat,
348 'ATTENDEE' => (count($auteurs) == 0) ? '' : implode(', ', $auteurs)
349 );
350 }
351
352 $j++;
353 $ladate = date('Y-m-d', mktime(1, 1, 1, $mois_avant, ($j + $jour_avant), $annee_avant));
354
355 $amj = date_anneemoisjour($ladate);
356 }
357 }
358 return $evenements;
359 }
360
361 /**
362 * Retourne la liste des rendez-vous de l'auteur connecté pour le mois indiqué
363 *
364 * @param int $annee
365 * @param int $mois
366 * @return array
367 **/
368 function quete_calendrier_agenda($annee, $mois) {
369 include_spip('inc/session');
370 $connect_id_auteur = session_get('id_auteur');
371
372 $rv = array();
373 if (!$connect_id_auteur) {
374 return $rv;
375 }
376 $date = date('Y-m-d', mktime(0, 0, 0, $mois, 1, $annee));
377 $mois = mois($date);
378 $annee = annee($date);
379
380 // rendez-vous personnels dans le mois
381 $result_messages = sql_select(
382 'M.titre AS summary, M.texte AS description, M.id_message AS uid, M.date_heure',
383 'spip_messages AS M, spip_auteurs_liens AS L',
384 "((L.id_auteur=$connect_id_auteur AND L.id_objet=M.id_message AND L.objet='message') OR M.type='affich')
385 AND M.rv='oui'
386 AND M.date_heure >='$annee-$mois-1'
387 AND date_heure < DATE_ADD('$annee-$mois-1', INTERVAL 1 MONTH)
388 AND M.statut='publie'"
389 );
390 while ($row = sql_fetch($result_messages)) {
391 $rv[journum($row['date_heure'])] = $row;
392 }
393
394 return $rv;
395 }