Import ICS — agenda distant

Le plugin “Import ICS” permet l’ajout automatique d’évènements distants dans la liste des évènements d’un site.

Le besoin

Le plugin Agenda permet de gérer des évènements. Il peut être utile de récupérer automatiquement des évènements d’un site distant qui fournirait un fichier .ics, afin de proposer un site agrégeant les calendriers de différents sites.

Exemple de cas d’application:

  • des séminaires de recherche de plusieurs organismes diffusés sur le même site;
  • un site d’information locale reprenant les évènements des associations et entreprises locales;
  • un site d’association affichant les évènements de ses partenaires.

Utilisation avec un site SPIP distant

Dans le cas d’un site distant sous SPIP utilisant le plugin agenda, le fichier .ics distant est disponible à la page http://url-du-site/spip.php?page=agenda-ical. Un paramètre &id_article=xxx ou &id_mot=xxx peut être ajouté pour filtre par article ou par mot clé.

Fonctionnement

Ce plugin permet de s’abonner à un calendrier distant. L’abonnement se fait via la création d’un nouvel objet “Almanach”. Celui-ci est lié à un fichier ics distant. Le plugin lira régulièrement ce fichier et ajoutera automatiquement des évènements dans la base de données du site SPIP local. Les évènements créés sont du même type que ceux gérés par le plugin Agenda.

Les évènements ainsi ajoutés seront liés:

  • à l’almanach;
  • à l’article choisi lors de la création de l’almanach;

Ce plugin ajoute donc une entrée “Almanachs” au menu “Édition” ainsi qu’un bouton d’ajout rapide d’almanach. Les évènements importés sont liés à ces objets.

La page {Almanachs} permet de lister les almanachs présents sur le site et de les administrer.

Configuration du plugin

Une fois le plugin installé, il existe deux possibilités de configurer le plugin:

  • soit à travers le formulaire accessible à travers le lien de configuration sur la page de gestion des plugins ;
  • soit par des constantes PHP mises dans le fichier mes_options.php – ou dans un fichier options.php d’un plugin. Ceci permet de déployer rapidement à grande échelle une configuration du plugin.

La configuration PHP l’emporte sur la configuration par formulaire.

Voici la liste des paramètres configurables:

  • Définir l’article par défaut. Pas de constante PHP.
  • Archiver automatiquement les évènements distants qui ne sont plus présents dans le fichier ics distant lors de la vérification de celui-ci. En PHP define ('_IMPORT_ICS_DEPUBLIER_ANCIENS_EVTS','on');.
  • Ne pas importer les évènements passés, utiles pour les sites qui se contente d’afficher les évènements à venir.
  • Permettre d’éditer certains champs manuellement

Ajouter un almanach

L’ajout d’un almanach est simple. Il suffit de remplir le formulaire d’ajout dans lequel tous les champs sont obligatoires.

Formulaire d’ajout d’almanach

L’url du flux peut être de la forme http, https ou webcal.

Une fois le formulaire validé, les évènements importés apparaissent dans la page récapitulative de l’almanach. Si ces évènements sont trop nombreux, la liste est paginée. Le plugin récupérera à intervalle régulier la nouvelle version du flux pour mettre à jour la liste des évènements.

À noter :

  • si un évènement apparaît dans plusieurs flux avec le même uid (identifiant unique distant), il ne sera pas réimporté ;
  • afin que la reconnaissance de l’heure d’été / d’hiver puisse fonctionner, il est nécessaire que la configuration PHP ait un timezone correspondant à un pays où le changement d’heure est effectué. SPIP permet de configurer si besoin le timezone.

Supprimer un almanach

Pour supprimer un almanach, le passer en statut “à la poubelle”. Tous les évènements liés sont alors basculés en “à la poubelle”.

Comme pour les articles, SPIP supprime régulièrement les évènements et les almanachs à la poubelle.

Statut des évènements

Les évènements possèdent le statut de l’almanach:

  • si l’almanach est publié, les évènements sont automatiquement publiés (modération a posteriori), à condition que l’article lui-même soit publié ;
  • si l’almanach est proposé, les évènements sont proposés, et il vous faut les publier manuellement (modération a priori).

Lorsque vous modifiez le statut d’un almanach, les évènements voient leurs statuts modifiés.

Lorsque vous modifiez le statut d’un article, les évènements et almanachs liés voient leurs statuts modifiés.

Le plugin ajoute également un statut “archivé” aux évènements, pour les évènements qui ne sont plus présents sur le flux distant. Une fois un évènement archivé, il n’est plus jamais désarchivé, sauf intervention manuel d’une rédacteurctrice.

Mots-clé

Dans la configuration des mots-clé, vous pouvez activer l’ajout de mots-clés aux almanachs.

Les évènements associés à un almanach reçoivent automatiquement les mots-clé de l’almanach. Si les mots-clé de l’almanach changent, les mots-clé des évènements sont automatiquement modifiés.

Outils pour squelette

Le plugin ajoute le critère {id_almanach} sur la boucle (EVENEMENTS) pour sélectionner les évènements liés à un almanach précis.

Usages avancés

Champs extras, adresse, gestion des inscriptions

Le flux ICAL du plugin peut agenda peut transmettre, sous forme de propriété supplémentaire :

  • l’adresse (et pas seulement le lieu)
  • le nombre de places et s’il faut gérer les inscriptions
  • les éventuels champs extras Pour ce faire il faut definir à true la constant PHP _EVENEMENT_ICAL_X_PROPERTIES.

Techniquement, ces champs sont passés dans le flux ICAL sous forme de propriétés préfixées par X. Dans l’exemple ci-dessous, est indiqué l’adresse, le nombre de place, la gestion de la réservation ainsi qu’un champ extra public.

X-ADRESSE:3 place Babel
X-INSCRIPTION:1
X-PLACES:10
X-PLACES-RESERVEES:6
X-PLACES-RESTANTES:4
X-PUBLIC:enfants

Un site SPIP peut abonné à flux distant peut également insérer la valeur de ces champs dans sa base de données. Les champs synchronisés sont :

  • adresse
  • nombre d’inscriptions
  • gestion des inscriptions
  • champs extra, s’ils existent sur le site receveur, L’identification se base par homonymie. Ainsi dans l’exemple précédent, X-PUBLIC alimentera le champ public.

Pipeline

Le principe du plugin est de convertir des champs d’un flux ICAL en champ SQL. Le plugin propose des équivalences par défaut. Mais il est possible de modifier cela, en utilisant le pipeline evenement_ical_to_sql. Ce pipeline reçoit en arguments:

  • data la valeur des champs SQL qui seront mis en base;
  • args un tableau regroupant différents paramètres :
    • objet_evenement un objet PHP décrivant l’évènement, généré par la librairie IcalCreator
    • decalage : les infos à propos du décalage horaire pour l’almanach courant
    • dtend_inclus : si le DTEND est inclus dans l’évènement pour l’almanach courant
    • xprops les propriétés ICAL d’évènements préfixées par X; qui sont difficiles à récupérer depuis objet_evenement
    • champs_x la liste des champs SQL ayant des équivalents potentiels dans les propriétés ICAL préfixées par X (champs extra, gestion des inscriptions, etc).

Exemple : pour un site, je souhaite que la synchronisation des évènements récupère dans le champ places le nombre de places restantes, et non pas le nombre de places totales. Après avoir déclarer dans paquet.xml l’emploi du pipeline, je le règle ainsi :

function formations_evenement_ical_to_sql($flux = array()) {
	if (isset($flux['data']['places'])) {
			$flux['data']['places'] = $flux['args']['xprops']['X-PLACES-RESTANTES'];
	}
	return $flux;
}

Fréquence d’actualisation

Toutes les 5 minutes, sous réserves que le site soit visités, le plugin :

  • recherche le flux dont l’actualisation est la plus ancienne, s’il a été actualisé il y a plus de 1,5 h ;
  • recherche un flux qui a (éventuellement) échoué à être actualisé, il y a plus de 1,5 h, en commencant par celui dont l’echec d’actualisation est le plus ancien ;
  • actualise les 1 ou 2 flux trouvés.

Il est possible de définir dans un fichier mes_options.php la constante _PERIODE_IMPORT_ICS pour régler le temps d’actualisation (en secondes, par défaut 5400 = 1,5h).

Attention à ne pas actualiser trop souvent : lire un flux ICAL et l’interpréter mobilise des ressources importantes.

Discussion

23 discussions

  • 8
    olivierlef

    Merci, merci et merci.

    Ce plugin tombe à point nommé pour pouvoir afficher des googles agenda sur notre site Spip.
    Ce qui est cool , c’est qu’en plus, lors d’une modif de l’agenda distant, sur le site Spip ça conserve les mots-clés rajoutés à la main sur l’évènement : que du bonheur.....

    Une petite question, avez-vous envisagé de traiter les répétitions d’événements, ou est-ce que la façon de les traiter par le plugin agenda, vous a dissuadé d’essayer ?

    a bientôt

    • dans un flux ical, il est précisé si un evenement est une répetition d’un autre. On pourrait donc envisager de gérer cela comme une répétition au sens du plugin agenda.

      Cependant, javoue ne pas trop saisir la plus value par rapport à x evenement indépendant.

      J’ajoute à la todolist.

    • olivierlef

      Super Merci,

      L’intérêt des répétions, est seulement du point de vue de l’utilisateur qui ne saisi dans son agenda qu’une répétition plustôt que x évènements (Par exemple si toute l’année il y a un accueil du public tous les lundis matin, tu saisi la première date et le type de répétitions et c’est fini...)

      A bientôt

    • dans ce cas la saisie étant distante, je ne vois pas ce que le plugin apporterait ;-)

    • olivierlef

      Ah, mes explications ne doivent pas être très claires ;(
      Le problème, c’est que j’ai besoin de mettre dans mon agenda Spip, un agenda Google dont l’utilisateur utilise la fonctionnalité des répétitions et à l’heure actuelle le plugins n’importe que l’évènement de départ des répétitions, mais pas les répétitions, donc il manque plein d’évènements ...
      Est-ce que ça répond à ta question ?

    • c’est plus clair.

      Pour voir si je peux gérer cela il me faut:
      -  l’url du flux ical
      -  un exemple d’evenement repété.

      je peux regarder ce week-end ce qu’il en serait.

    • olivierlef

      Voilà je t’ai mis un flux
      https://calendar.google.com/calendar/ical/fpu9hguercn80id2lsggh6i5as%40group.calendar.google.com/private-23ef905b3afddc43839c682f13046cda/basic.ics

      Les possibilités de répétions sont variées.... je crains que ça ne devienne monstrueux....
      J’ai été exhaustif en créant toutes les possibilités de type de répétitions :

      SUMMARY:Test répétition sans fin....
      RRULE:FREQ=WEEKLY;BYDAY=FR

      SUMMARY:Test répétition 10 fois
      RRULE:FREQ=WEEKLY;COUNT=10;BYDAY=FR

      SUMMARY:Test répétition avec fin le 13 janv. 2017
      RRULE:FREQ=WEEKLY;UNTIL=20170113T103000Z;BYDAY=FR

      SUMMARY:Test répétions tous les ans
      RRULE:FREQ=YEARLY

      SUMMARY:Test répétitions du lundi au vendredi
      RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR

      SUMMARY:Test répétition tous les jours
      RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TU,WE,TH,FR,SA

      SUMMARY:Test répétion tous les 2 mois le 15
      RRULE:FREQ=MONTHLY;INTERVAL=2;BYMONTHDAY=15

      SUMMARY:test répétitions Tous les 3 mois le troisième lundi
      RRULE:FREQ=MONTHLY;INTERVAL=3;BYDAY=3MO

      et voilà ....

      Bon Wek-end ;)

    • je suis un peu pris, mais je trouverai sans doute le temps de m’occuper de cela un jour

    • salut,

      j’ai un peu réfléchi à cette question. C’est assez complexe. En effet, la logique des répetitions en ical et dans SPIP n’est pas la même.

      Dans SPIP, il n’y a pas formellement de répetition, simplement les evenements sont dupliqués avec un lien établi entre eux qui dit “tel evenement est la répetition de tel autre evenement”.

      Du coup, il faudrait potentiellement créer une infinité d’evenement.

      On pourrait s’en sortir par deux biais:
      -  mettre une borne niveau SPIP
      -  utilisation la spécification de borne dans l’ICS

      mais cela ne résoudrait pas tout. Il y a un nombre relativement elevé de cas. cf
      http://www.kanzaki.com/docs/ical/recur.html

      bref, à mon avis j’en ai pour au moins 2 jours de boulot… et j’ai d’autre priorité.

    Reply to this message

  • 1

    «Les évènements sont marqués comme « publiés », sauf si l’article associé ne l’est pas. Dans ce cas, comme pour tous les évènements, les évènements seront automatiquement publiés à la publication de l’article.»

    Cette démarche fait du tout ou rien.
    Il me semble qu’il peut être intéressant d’importer les événements en statut ’proposé’, afin de permette une verification humaine avant publication.
    Je suggère que le statut prop de l’almanach permette de déclencher ce foncitonnement, au lieu d’une publication directe.
    (un paramètrage plus explicite serait sans doute possible mais plus lourd à developper)

    • ca fait parti des choses prévues, mais à plus long termes ;-) (sauf si quelqu’un le code entre temps)

      deja là j’ai un bug observé par thiébaut, que je corrigerai demain.

    Reply to this message

  • Merci pour ce plugin très utile à notre site de territoire http://www.valleeducousin.fr/.

    Cela permet d’intégrer automatiquement à notre agenda les événements de nos partenaires ayant des sites sous spip. Quel gain de temps !

    On va essayer avec d’autre sites ayant des flux iCalendar et on reviendra faire un retour sur cette page.

    A bientôt donc !

    Reply to this message

Add a comment

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Who are you?
[Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom