source: spip-zone/_core_/plugins/organiseur/inc/quete_calendrier.php

Last change on this file was 113294, checked in by spip.franck@…, 11 months ago

Il parait que le futur c'est maintenant :-D

File size: 12.0 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2019                                                *
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
20if (!defined('_ECRIRE_INC_VERSION')) {
21        return;
22}
23
24include_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 **/
43function 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 **/
63function 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 **/
91function 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 **/
118function 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 **/
153function 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        while ($row = sql_fetch($result)) {
173                $amj = date_anneemoisjour($row['date']);
174                $id = $row['id_article'];
175                if (autoriser('voir', 'article', $id)) {
176                        $evenements[$amj][] =
177                                array(
178                                        'CATEGORIES' => calendrier_categories('spip_articles', $id, 'id_article'),
179                                        'DESCRIPTION' => $row['descriptif'] ? $row['descriptif'] : $langues[$row['lang']],
180                                        'SUMMARY' => $row['titre'],
181                                        'URL' => generer_url_ecrire_objet('article', $id, '', '', 'prop')
182                                );
183                }
184        }
185}
186
187/**
188 * Retourne la liste des rubriques (format ICS) publiées dans une période donnée
189 *
190 * @param string $avant
191 *     Date de début
192 * @param string $apres
193 *     Date de fin
194 * @param array $evenements
195 *     Tableau des événements déjà présents qui sera complété par la fonction.
196 *     Format : `$evenements[$amj][] = Tableau de description ICS`
197 **/
198function quete_calendrier_interval_rubriques($avant, $apres, &$evenements) {
199
200        $result = sql_select(
201                'DISTINCT R.id_rubrique, titre, descriptif, date',
202                'spip_rubriques AS R, spip_documents_liens AS L',
203                "statut='publie' AND    date >= $avant AND      date < $apres
204                        AND R.id_rubrique = L.id_objet AND L.objet='rubrique'",
205                '',
206                'date'
207        );
208        while ($row = sql_fetch($result)) {
209                $amj = date_anneemoisjour($row['date']);
210                $id = $row['id_rubrique'];
211                if (autoriser('voir', 'rubrique', $id)) {
212                        $evenements[$amj][] =
213                                array(
214                                        'CATEGORIES' => calendrier_categories('spip_rubriques', $id, 'id_rubrique'),
215                                        'DESCRIPTION' => $row['descriptif'],
216                                        'SUMMARY' => $row['titre'],
217                                        'URL' => generer_url_ecrire_objet('rubrique', $id, '', '', 'prop')
218                                );
219                }
220        }
221}
222
223/**
224 * Retourne la liste des brèves (format ICS) publiées dans une période donnée
225 *
226 * @param string $avant
227 *     Date de début
228 * @param string $apres
229 *     Date de fin
230 * @param array $evenements
231 *     Tableau des événements déjà présents qui sera complété par la fonction.
232 *     Format : `$evenements[$amj][] = Tableau de description ICS`
233 **/
234function quete_calendrier_interval_breves($avant, $apres, &$evenements) {
235        $result = sql_select(
236                'id_breve, titre, date_heure, id_rubrique',
237                'spip_breves',
238                "statut='publie' AND date_heure >= $avant AND date_heure < $apres",
239                '',
240                'date_heure'
241        );
242        while ($row = sql_fetch($result)) {
243                $amj = date_anneemoisjour($row['date_heure']);
244                $id = $row['id_breve'];
245                $ir = $row['id_rubrique'];
246                if (autoriser('voir', 'breve', $id)) {
247                        $evenements[$amj][] =
248                                array(
249                                        'URL' => generer_url_ecrire_objet('breve', $id, '', '', 'prop'),
250                                        'CATEGORIES' => calendrier_categories('spip_breves', $ir, 'id_breve'),
251                                        'SUMMARY' => $row['titre']
252                                );
253                }
254        }
255}
256
257/**
258 * Retourne la liste des messages (format ICS) de l'auteur connecté,
259 * pour une période donnée
260 *
261 * @param string $avant
262 *     Date de début
263 * @param string $apres
264 *     Date de fin
265 * @return array
266 *     De la forme : `$evt[date][id_message] = Tableau des données ICS`
267 **/
268function quete_calendrier_interval_rv($avant, $apres) {
269        include_spip('inc/session');
270        $connect_id_auteur = session_get('id_auteur');
271        $auteurs = array();
272
273        $evenements = array();
274        if (!$connect_id_auteur) {
275                return $evenements;
276        }
277        $result = sql_select(
278                'M.id_message, M.titre, M.texte, M.date_heure, M.date_fin, M.type',
279                'spip_messages AS M LEFT JOIN spip_auteurs_liens AS L ON (L.id_objet=M.id_message)',
280                "((L.objet='message' AND (L.id_auteur=$connect_id_auteur OR M.type='affich'))
281                        OR (L.objet IS NULL AND M.id_auteur=$connect_id_auteur AND " . sql_in(
282                                'M.type',
283                                array('pb', 'affich')
284                        ) . '))'
285                        . " AND M.rv='oui'
286                                AND ((M.date_fin >= $avant OR M.date_heure >= $avant)
287                                AND M.date_heure <= $apres)
288                                AND M.statut='publie'",
289                'M.id_message',
290                'M.date_heure'
291        );
292        while ($row = sql_fetch($result)) {
293                $date_heure = $row['date_heure'];
294                $date_fin = $row['date_fin'];
295                $type = $row['type'];
296                $id_message = $row['id_message'];
297
298                if ($type == 'pb') {
299                        $cat = 'calendrier-couleur2';
300                } else {
301                        if ($type == 'affich') {
302                                $cat = 'calendrier-couleur4';
303                        } else {
304                                if ($type != 'normal') {
305                                        $cat = 'calendrier-couleur12';
306                                } else {
307                                        $cat = 'calendrier-couleur9';
308                                        $auteurs = array_column(
309                                                sql_allfetsel(
310                                                        'nom',
311                                                        'spip_auteurs AS A LEFT JOIN spip_auteurs_liens AS L ON L.id_auteur=A.id_auteur',
312                                                        "(L.objet='message' AND L.id_objet=$id_message AND (A.id_auteur!=$connect_id_auteur))"
313                                                ),
314                                                'nom'
315                                        );
316                                }
317                        }
318                }
319
320                $jour_avant = substr($avant, 9, 2);
321                $mois_avant = substr($avant, 6, 2);
322                $annee_avant = substr($avant, 1, 4);
323                $jour_apres = substr($apres, 9, 2);
324                $mois_apres = substr($apres, 6, 2);
325                $annee_apres = substr($apres, 1, 4);
326                $ical_apres = date_anneemoisjour("$annee_apres-$mois_apres-" . sprintf('%02d', $jour_apres));
327
328                // Calcul pour les semaines a cheval sur deux mois
329                $j = 0;
330                $amj = date_anneemoisjour("$annee_avant-$mois_avant-" . sprintf('%02d', $j + ($jour_avant)));
331
332                while ($amj <= $ical_apres) {
333                        if (!($amj == date_anneemoisjour($date_fin) and preg_match(
334                                ',00:00:00,',
335                                $date_fin
336                        ))) {
337                                // Ne pas prendre la fin a minuit sur jour precedent
338                                $evenements[$amj][$id_message] =
339                                        array(
340                                                'URL' => generer_url_ecrire('message', "id_message=$id_message"),
341                                                'DTSTART' => date_ical($date_heure),
342                                                'DTEND' => date_ical($date_fin),
343                                                'DESCRIPTION' => $row['texte'],
344                                                'SUMMARY' => $row['titre'],
345                                                'CATEGORIES' => $cat,
346                                                'ATTENDEE' => (count($auteurs) == 0) ? '' : join($auteurs, ', ')
347                                        );
348                        }
349
350                        $j++;
351                        $ladate = date('Y-m-d', mktime(1, 1, 1, $mois_avant, ($j + $jour_avant), $annee_avant));
352
353                        $amj = date_anneemoisjour($ladate);
354                }
355        }
356        return $evenements;
357}
358
359/**
360 * Retourne la liste des rendez-vous de l'auteur connecté pour le mois indiqué
361 *
362 * @param int $annee
363 * @param int $mois
364 * @return array
365 **/
366function quete_calendrier_agenda($annee, $mois) {
367        include_spip('inc/session');
368        $connect_id_auteur = session_get('id_auteur');
369
370        $rv = array();
371        if (!$connect_id_auteur) {
372                return $rv;
373        }
374        $date = date('Y-m-d', mktime(0, 0, 0, $mois, 1, $annee));
375        $mois = mois($date);
376        $annee = annee($date);
377
378        // rendez-vous personnels dans le mois
379        $result_messages = sql_select(
380                'M.titre AS summary, M.texte AS description, M.id_message AS uid, M.date_heure',
381                'spip_messages AS M, spip_auteurs_liens AS L',
382                "((L.id_auteur=$connect_id_auteur AND L.id_objet=M.id_message AND L.objet='message') OR M.type='affich')
383                        AND M.rv='oui'
384                        AND M.date_heure >='$annee-$mois-1'
385                        AND date_heure < DATE_ADD('$annee-$mois-1', INTERVAL 1 MONTH)
386                        AND M.statut='publie'"
387        );
388        while ($row = sql_fetch($result_messages)) {
389                $rv[journum($row['date_heure'])] = $row;
390        }
391
392        return $rv;
393}
Note: See TracBrowser for help on using the repository browser.