/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
- * Copyright (c) 2001-2016 *
+ * Copyright (c) 2001-2020 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
-if (!defined('_ECRIRE_INC_VERSION')) return;
+/**
+ * Fonctions de quêtes pour les calendriers : obtient les listes
+ * des éléments à afficher dans des périodes données
+ *
+ * @package SPIP\Organiseur\Fonctions
+ **/
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+ return;
+}
include_spip('inc/filtres');
-// https://code.spip.net/@calendrier_categories
-function calendrier_categories($table, $num, $objet)
-{
- if (function_exists('generer_calendrier_class'))
- return generer_calendrier_class($table, $num, $objet);
- else {
- // cf agenda.css
- $num= sql_getfetsel((($objet != 'id_breve') ? 'id_secteur' : 'id_rubrique') . " AS id", $table, "$objet=$num");
-
- return 'calendrier-couleur' . (($num%14)+1);
- }
+
+
+/**
+ * Retourne un nom de classe CSS représentant la catégorie de l'événement
+ * dans le calendrier
+ *
+ * S'appuie soit sur une fonction PHP `generer_calendrier_class()` si elle
+ * existe, soit à défaut sur le numéro de rubrique.
+ *
+ * @param string $table
+ * Nom de la table SQL d'où provient l'événement
+ * @param int $num
+ * Identifiant dans la table
+ * @param string $objet
+ * Nom de la clé primaire
+ * @return string
+ * Nom de classe CSS
+ **/
+function calendrier_categories($table, $num, $objet) {
+ if (function_exists('generer_calendrier_class')) {
+ return generer_calendrier_class($table, $num, $objet);
+ } else {
+ // cf agenda.css
+ $num = sql_getfetsel((($objet != 'id_breve') ? 'id_secteur' : 'id_rubrique') . ' AS id', $table, "$objet=$num");
+
+ return 'calendrier-couleur' . (($num % 14) + 1);
+ }
}
-// ici on prend en fait le jour, la veille et le lendemain
+/**
+ * Pour une date donnée, retourne une période allant de la veille au lendemain
+ *
+ * @param int $annee
+ * @param int $mois
+ * @param int $jour
+ * @return array
+ * Liste (date de la veille à 0h, date du lendemain à 23h59:59)
+ **/
+function quete_calendrier_jour($annee, $mois, $jour) {
+ $avant = "'" . date('Y-m-d', mktime(0, 0, 0, $mois, $jour - 1, $annee)) . "'";
+ $apres = "'" . date('Y-m-d', mktime(1, 1, 1, $mois, $jour + 1, $annee)) .
+ " 23:59:59'";
-// https://code.spip.net/@quete_calendrier_jour
-function quete_calendrier_jour($annee,$mois,$jour) {
- $avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,$jour-1,$annee)) . "'";
- $apres = "'" . date("Y-m-d", mktime(1,1,1,$mois,$jour+1,$annee)) .
- " 23:59:59'";
return array($avant, $apres);
}
-// retourne un tableau de 2 tableaux indexes par des dates
-// - le premier indique les evenements du jour, sans indication de duree
-// - le deuxime indique les evenements commencant ce jour, avec indication de duree
-// https://code.spip.net/@quete_calendrier_interval
+/**
+ * Retourne les publications et les messages pour une période donnée
+ *
+ * Retourne un tableau de 2 tableaux indéxés par des dates :
+ * - le premier indique les événements du jour, sans indication de durée
+ * (par exemple les publications d'articles)
+ * - le deuxième indique les événements commençant ce jour, avec indication de durée
+ * (par exemple les rendez-vous)
+ *
+ * @uses quete_calendrier_interval_articles()
+ * @uses quete_calendrier_interval_breves()
+ * @uses quete_calendrier_interval_rubriques()
+ * @uses quete_calendrier_interval_rv()
+ *
+ * @param array $limites
+ * Liste (date de début, date de fin)
+ * @return array
+ * Liste (événements sans durée, événements avec durée)
+ **/
function quete_calendrier_interval($limites) {
include_spip('inc/urls');
list($avant, $apres) = $limites;
quete_calendrier_interval_articles($avant, $apres, $evt);
quete_calendrier_interval_breves($avant, $apres, $evt);
quete_calendrier_interval_rubriques($avant, $apres, $evt);
- return array($evt, quete_calendrier_interval_rv($avant, $apres));
-}
-// https://code.spip.net/@quete_calendrier_interval_forums
-function quete_calendrier_interval_forums($limites, &$evenements) {
- list($avant, $apres) = $limites;
- $result=sql_select("DISTINCT titre, date_heure, id_forum", "spip_forum", "date_heure >= $avant AND date_heure < $apres", '', "date_heure");
- while($row=sql_fetch($result)){
- $amj = date_anneemoisjour($row['date_heure']);
- $id = $row['id_forum'];
- if (autoriser('voir','forum',$id))
- $evenements[$amj][]=
- array(
- 'URL' => generer_url_entite($id, 'forum'),
- 'CATEGORIES' => 'calendrier-couleur7',
- 'SUMMARY' => $row['titre'],
- 'DTSTART' => date_ical($row['date_heure']));
- }
+ return array($evt, quete_calendrier_interval_rv($avant, $apres));
}
-# 3 fonctions retournant les evenements d'une periode
+# 4 fonctions retournant les evenements d'une periode
# le tableau retourne est indexe par les balises du format ics
# afin qu'il soit facile de produire de tels documents.
# L'URL de chacun de ces evenements est celle de l'espace prive
# pour faciliter la navigation, ce qu'on obtient utilisant
# le 4e argument des fonctions generer_url_ecrire_$table
-// https://code.spip.net/@quete_calendrier_interval_articles
+/**
+ * Retourne la liste des messages de forum (format ICS) écrits dans une période donnée
+ *
+ * @param array $limites
+ * Liste (date de début, date de fin)
+ * @param array $evenements
+ * Tableau des événements déjà présents qui sera complété par la fonction.
+ * Format : `$evenements[$amj][] = Tableau de description ICS`
+ **/
+function quete_calendrier_interval_forums($limites, &$evenements) {
+ list($avant, $apres) = $limites;
+ $result = sql_select(
+ 'DISTINCT titre, date_heure, id_forum',
+ 'spip_forum',
+ "date_heure >= $avant AND date_heure < $apres",
+ '',
+ 'date_heure'
+ );
+ while ($row = sql_fetch($result)) {
+ $amj = date_anneemoisjour($row['date_heure']);
+ $id = $row['id_forum'];
+ if (autoriser('voir', 'forum', $id)) {
+ $evenements[$amj][] =
+ array(
+ 'URL' => generer_url_entite($id, 'forum'),
+ 'CATEGORIES' => 'calendrier-couleur7',
+ 'SUMMARY' => $row['titre'],
+ 'DTSTART' => date_ical($row['date_heure'])
+ );
+ }
+ }
+}
+
+/**
+ * Retourne la liste des articles (format ICS) publiés dans une période donnée
+ *
+ * @param string $avant
+ * Date de début
+ * @param string $apres
+ * Date de fin
+ * @param array $evenements
+ * Tableau des événements déjà présents qui sera complété par la fonction.
+ * Format : `$evenements[$amj][] = Tableau de description ICS`
+ **/
function quete_calendrier_interval_articles($avant, $apres, &$evenements) {
- $result=sql_select('id_article, titre, date, descriptif, chapo, lang', 'spip_articles', "statut='publie' AND date >= $avant AND date < $apres", '', "date");
+ $result = sql_select(
+ 'id_article, titre, date, descriptif, chapo, lang',
+ 'spip_articles',
+ "statut='publie' AND date >= $avant AND date < $apres",
+ '',
+ 'date'
+ );
// tables traduites
$objets = explode(',', $GLOBALS['meta']['multi_objets']);
if (in_array('spip_articles', $objets)) {
- include_spip('inc/lang_liste');
- $langues = $GLOBALS['codes_langues'];
- } else $langues = array();
- while($row=sql_fetch($result)){
+ include_spip('inc/lang_liste');
+ $langues = $GLOBALS['codes_langues'];
+ } else {
+ $langues = array();
+ }
+
+ while ($row = sql_fetch($result)) {
$amj = date_anneemoisjour($row['date']);
$id = $row['id_article'];
- if (autoriser('voir','article',$id))
- $evenements[$amj][]=
- array(
- 'CATEGORIES' => calendrier_categories('spip_articles', $id, 'id_article'),
- 'DESCRIPTION' => $row['descriptif'] ? $row['descriptif'] : $langues[$row['lang']],
- 'SUMMARY' => $row['titre'],
- 'URL' => generer_url_ecrire_objet('article',$id, '','','prop'));
+ if (autoriser('voir', 'article', $id)) {
+ $langue = isset($langues[$row['lang']]) ? $langues[$row['lang']] : "";
+ $evenements[$amj][] =
+ array(
+ 'CATEGORIES' => calendrier_categories('spip_articles', $id, 'id_article'),
+ 'DESCRIPTION' => $row['descriptif'] ?: $langue,
+ 'SUMMARY' => $row['titre'],
+ 'URL' => generer_url_ecrire_objet('article', $id, '', '', 'prop')
+ );
+ }
}
}
-// https://code.spip.net/@quete_calendrier_interval_rubriques
+/**
+ * Retourne la liste des rubriques (format ICS) publiées dans une période donnée
+ *
+ * @param string $avant
+ * Date de début
+ * @param string $apres
+ * Date de fin
+ * @param array $evenements
+ * Tableau des événements déjà présents qui sera complété par la fonction.
+ * Format : `$evenements[$amj][] = Tableau de description ICS`
+ **/
function quete_calendrier_interval_rubriques($avant, $apres, &$evenements) {
- $result=sql_select('DISTINCT R.id_rubrique, titre, descriptif, date', 'spip_rubriques AS R, spip_documents_liens AS L', "statut='publie' AND date >= $avant AND date < $apres AND R.id_rubrique = L.id_objet AND L.objet='rubrique'",'', "date");
- while($row=sql_fetch($result)){
+ $result = sql_select(
+ 'DISTINCT R.id_rubrique, titre, descriptif, date',
+ 'spip_rubriques AS R, spip_documents_liens AS L',
+ "statut='publie' AND date >= $avant AND date < $apres
+ AND R.id_rubrique = L.id_objet AND L.objet='rubrique'",
+ '',
+ 'date'
+ );
+ while ($row = sql_fetch($result)) {
$amj = date_anneemoisjour($row['date']);
$id = $row['id_rubrique'];
- if (autoriser('voir','rubrique',$id))
- $evenements[$amj][]=
- array(
- 'CATEGORIES' => calendrier_categories('spip_rubriques', $id, 'id_rubrique'),
- 'DESCRIPTION' => $row['descriptif'],
- 'SUMMARY' => $row['titre'],
- 'URL' => generer_url_ecrire_objet('rubrique',$id, '','', 'prop'));
+ if (autoriser('voir', 'rubrique', $id)) {
+ $evenements[$amj][] =
+ array(
+ 'CATEGORIES' => calendrier_categories('spip_rubriques', $id, 'id_rubrique'),
+ 'DESCRIPTION' => $row['descriptif'],
+ 'SUMMARY' => $row['titre'],
+ 'URL' => generer_url_ecrire_objet('rubrique', $id, '', '', 'prop')
+ );
+ }
}
}
-// https://code.spip.net/@quete_calendrier_interval_breves
+/**
+ * Retourne la liste des brèves (format ICS) publiées dans une période donnée
+ *
+ * @param string $avant
+ * Date de début
+ * @param string $apres
+ * Date de fin
+ * @param array $evenements
+ * Tableau des événements déjà présents qui sera complété par la fonction.
+ * Format : `$evenements[$amj][] = Tableau de description ICS`
+ **/
function quete_calendrier_interval_breves($avant, $apres, &$evenements) {
- $result=sql_select("id_breve, titre, date_heure, id_rubrique", 'spip_breves', "statut='publie' AND date_heure >= $avant AND date_heure < $apres", '', "date_heure");
- while($row=sql_fetch($result)){
+ $result = sql_select(
+ 'id_breve, titre, date_heure, id_rubrique',
+ 'spip_breves',
+ "statut='publie' AND date_heure >= $avant AND date_heure < $apres",
+ '',
+ 'date_heure'
+ );
+ while ($row = sql_fetch($result)) {
$amj = date_anneemoisjour($row['date_heure']);
$id = $row['id_breve'];
$ir = $row['id_rubrique'];
- if (autoriser('voir','breve',$id))
- $evenements[$amj][]=
- array(
- 'URL' => generer_url_ecrire_objet('breve',$id, '','', 'prop'),
- 'CATEGORIES' => calendrier_categories('spip_breves', $ir, 'id_breve'),
- 'SUMMARY' => $row['titre']);
+ if (autoriser('voir', 'breve', $id)) {
+ $evenements[$amj][] =
+ array(
+ 'URL' => generer_url_ecrire_objet('breve', $id, '', '', 'prop'),
+ 'CATEGORIES' => calendrier_categories('spip_breves', $ir, 'id_breve'),
+ 'SUMMARY' => $row['titre']
+ );
+ }
}
}
-// https://code.spip.net/@quete_calendrier_interval_rv
+/**
+ * Retourne la liste des messages (format ICS) de l'auteur connecté,
+ * pour une période donnée
+ *
+ * @param string $avant
+ * Date de début
+ * @param string $apres
+ * Date de fin
+ * @return array
+ * De la forme : `$evt[date][id_message] = Tableau des données ICS`
+ **/
function quete_calendrier_interval_rv($avant, $apres) {
include_spip('inc/session');
$connect_id_auteur = session_get('id_auteur');
+ $auteurs = array();
- $evenements= array();
- if (!$connect_id_auteur) return $evenements;
- $result=sql_select("M.id_message, M.titre, M.texte, M.date_heure, M.date_fin, M.type",
- "spip_messages AS M LEFT JOIN spip_auteurs_liens AS L ON (L.id_objet=M.id_message)",
- "((L.objet='message' AND (L.id_auteur=$connect_id_auteur OR M.type='affich')) OR (L.objet IS NULL AND M.id_auteur=$connect_id_auteur AND ".sql_in('M.type',array('pb','affich'))."))"
- ." AND M.rv='oui' AND ((M.date_fin >= $avant OR M.date_heure >= $avant) AND M.date_heure <= $apres) AND M.statut='publie'",
- "M.id_message", "M.date_heure");
- while($row=sql_fetch($result)){
- $date_heure=$row["date_heure"];
- $date_fin=$row["date_fin"];
- $type=$row["type"];
- $id_message=$row['id_message'];
-
- if ($type=="pb")
- $cat = 'calendrier-couleur2';
- else {
- if ($type=="affich")
- $cat = 'calendrier-couleur4';
- else {
- if ($type!="normal")
- $cat = 'calendrier-couleur12';
- else {
- $cat = 'calendrier-couleur9';
- $auteurs = array_map('array_shift', sql_allfetsel("nom", "spip_auteurs AS A LEFT JOIN spip_auteurs_liens AS L ON L.id_auteur=A.id_auteur", "(L.objet='message' AND L.id_objet=$id_message AND (A.id_auteur!=$connect_id_auteur))"));
- }
- }
+ $evenements = array();
+ if (!$connect_id_auteur) {
+ return $evenements;
+ }
+ $result = sql_select(
+ 'M.id_message, M.titre, M.texte, M.date_heure, M.date_fin, M.type',
+ 'spip_messages AS M LEFT JOIN spip_auteurs_liens AS L ON (L.id_objet=M.id_message)',
+ "((L.objet='message' AND (L.id_auteur=$connect_id_auteur OR M.type='affich'))
+ OR (L.objet IS NULL AND M.id_auteur=$connect_id_auteur AND " . sql_in(
+ 'M.type',
+ array('pb', 'affich')
+ ) . '))'
+ . " AND M.rv='oui'
+ AND ((M.date_fin >= $avant OR M.date_heure >= $avant)
+ AND M.date_heure <= $apres)
+ AND M.statut='publie'",
+ 'M.id_message',
+ 'M.date_heure'
+ );
+ while ($row = sql_fetch($result)) {
+ $date_heure = $row['date_heure'];
+ $date_fin = $row['date_fin'];
+ $type = $row['type'];
+ $id_message = $row['id_message'];
+
+ if ($type == 'pb') {
+ $cat = 'calendrier-couleur2';
+ } else {
+ if ($type == 'affich') {
+ $cat = 'calendrier-couleur4';
+ } else {
+ if ($type != 'normal') {
+ $cat = 'calendrier-couleur12';
+ } else {
+ $cat = 'calendrier-couleur9';
+ $auteurs = array_map(
+ 'array_shift',
+ sql_allfetsel(
+ 'nom',
+ 'spip_auteurs AS A LEFT JOIN spip_auteurs_liens AS L ON L.id_auteur=A.id_auteur',
+ "(L.objet='message' AND L.id_objet=$id_message AND (A.id_auteur!=$connect_id_auteur))"
+ )
+ );
+ }
+ }
}
- $jour_avant = substr($avant, 9,2);
- $mois_avant = substr($avant, 6,2);
- $annee_avant = substr($avant, 1,4);
- $jour_apres = substr($apres, 9,2);
- $mois_apres = substr($apres, 6,2);
- $annee_apres = substr($apres, 1,4);
- $ical_apres = date_anneemoisjour("$annee_apres-$mois_apres-".sprintf("%02d",$jour_apres));
+ $jour_avant = substr($avant, 9, 2);
+ $mois_avant = substr($avant, 6, 2);
+ $annee_avant = substr($avant, 1, 4);
+ $jour_apres = substr($apres, 9, 2);
+ $mois_apres = substr($apres, 6, 2);
+ $annee_apres = substr($apres, 1, 4);
+ $ical_apres = date_anneemoisjour("$annee_apres-$mois_apres-" . sprintf('%02d', $jour_apres));
// Calcul pour les semaines a cheval sur deux mois
- $j = 0;
- $amj = date_anneemoisjour("$annee_avant-$mois_avant-".sprintf("%02d", $j+($jour_avant)));
+ $j = 0;
+ $amj = date_anneemoisjour("$annee_avant-$mois_avant-" . sprintf('%02d', $j + ($jour_avant)));
while ($amj <= $ical_apres) {
- if (!($amj == date_anneemoisjour($date_fin) AND preg_match(",00:00:00,", $date_fin))) // Ne pas prendre la fin a minuit sur jour precedent
- $evenements[$amj][$id_message]=
- array(
- 'URL' => generer_url_ecrire("message","id_message=$id_message"),
- 'DTSTART' => date_ical($date_heure),
- 'DTEND' => date_ical($date_fin),
- 'DESCRIPTION' => $row['texte'],
- 'SUMMARY' => $row['titre'],
- 'CATEGORIES' => $cat,
- 'ATTENDEE' => (count($auteurs) == 0) ? '' : join($auteurs,", "));
-
- $j ++;
- $ladate = date("Y-m-d",mktime (1,1,1,$mois_avant, ($j + $jour_avant), $annee_avant));
+ if (!($amj == date_anneemoisjour($date_fin) and preg_match(
+ ',00:00:00,',
+ $date_fin
+ ))) {
+ // Ne pas prendre la fin a minuit sur jour precedent
+ $evenements[$amj][$id_message] =
+ array(
+ 'URL' => generer_url_ecrire('message', "id_message=$id_message"),
+ 'DTSTART' => date_ical($date_heure),
+ 'DTEND' => date_ical($date_fin),
+ 'DESCRIPTION' => $row['texte'],
+ 'SUMMARY' => $row['titre'],
+ 'CATEGORIES' => $cat,
+ 'ATTENDEE' => (count($auteurs) == 0) ? '' : join($auteurs, ', ')
+ );
+ }
- $amj = date_anneemoisjour($ladate);
+ $j++;
+ $ladate = date('Y-m-d', mktime(1, 1, 1, $mois_avant, ($j + $jour_avant), $annee_avant));
+ $amj = date_anneemoisjour($ladate);
}
-
}
- return $evenements;
+ return $evenements;
}
-// https://code.spip.net/@quete_calendrier_agenda
-function quete_calendrier_agenda ($annee, $mois) {
+/**
+ * Retourne la liste des rendez-vous de l'auteur connecté pour le mois indiqué
+ *
+ * @param int $annee
+ * @param int $mois
+ * @return array
+ **/
+function quete_calendrier_agenda($annee, $mois) {
include_spip('inc/session');
$connect_id_auteur = session_get('id_auteur');
$rv = array();
- if (!$connect_id_auteur) return $rv;
- $date = date("Y-m-d", mktime(0,0,0,$mois, 1, $annee));
+ if (!$connect_id_auteur) {
+ return $rv;
+ }
+ $date = date('Y-m-d', mktime(0, 0, 0, $mois, 1, $annee));
$mois = mois($date);
$annee = annee($date);
// rendez-vous personnels dans le mois
- $result_messages = sql_select("M.titre AS summary, M.texte AS description, M.id_message AS uid, M.date_heure", "spip_messages AS M, spip_auteurs_liens AS L", "((L.id_auteur=$connect_id_auteur AND L.id_objet=M.id_message AND L.objet='message') OR M.type='affich') AND M.rv='oui' AND M.date_heure >='$annee-$mois-1' AND date_heure < DATE_ADD('$annee-$mois-1', INTERVAL 1 MONTH) AND M.statut='publie'");
- while($row=sql_fetch($result_messages)) {
+ $result_messages = sql_select(
+ 'M.titre AS summary, M.texte AS description, M.id_message AS uid, M.date_heure',
+ 'spip_messages AS M, spip_auteurs_liens AS L',
+ "((L.id_auteur=$connect_id_auteur AND L.id_objet=M.id_message AND L.objet='message') OR M.type='affich')
+ AND M.rv='oui'
+ AND M.date_heure >='$annee-$mois-1'
+ AND date_heure < DATE_ADD('$annee-$mois-1', INTERVAL 1 MONTH)
+ AND M.statut='publie'"
+ );
+ while ($row = sql_fetch($result_messages)) {
$rv[journum($row['date_heure'])] = $row;
}
+
return $rv;
}
-
-?>