SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano | Nederlands

286 Plugins, 197 contribs sur SPIP-Zone, 293 visiteurs en ce moment

Accueil > Dates, calendriers et agendas > Plugin Agenda > Répétitions et Événement source du plugin Agenda : comment éviter les (...)

Répétitions et Événement source du plugin Agenda : comment éviter les redondances ?

8 avril 2015 – par Thiébaut – commentaires

9 votes

Solution perfectible mais réponse fonctionnelle à une demande récurrente et pertinente concernant le plugin Agenda : regrouper les dates des répétitions, sous le titre de leur événement source, afin d’éviter les redondances. Exemple à l’appui.

Le problème

L’excellent plugin Agenda permet en effet d’attribuer plusieurs dates à un seul et même événement dont les autres champs ne changeraient pas. C’est très pratique côté rédaction...

Côté public, les champs de l’événement sont affichés autant de fois qu’il y a de répétitions :

  • Tant que ces dernières sont suffisamment espacées dans le temps, ou mélangées à d’autres événements différents, tout va bien...
  • Mais quand elles se retrouvent les unes contre les autres, le pléonasme est flagrant : « les répétitions sont vraiment redondantes » !

Ce problème a été évoqué plusieurs fois sur les listes et les forums, sans réponse vraiment satisfaisante.

Un exemple concret

Nous sommes le 2 avril et nous avons trois enregistré trois événements dans l’agenda, dont deux contiennent des répétitions.
-  Un concert prévu le 6 avril à 20h30 au Zénith de Saint-Agnan ;
-  Un cycle d’apéro-spip à l’Open Software Club de Saint-Brisson, qui a démarré le 1er avril et dont les répétitions sont programmées les 8, 15, 22 et 29 avril de 11h à 12h ;
-  Deux projections du superbe film "El Chino" les 12 et 14 avril à 20h00 au Cinéma Vauban ;

En l’état actuel, avec une simple boucle d’événements à venir, on obtiendrait ceci :

  • Concert, le 6 avril à 20h30 au Zénith de Saint-Agnan ;
  • Apéro-spip à l’Open Software Club de Saint-Brisson le 8 avril 2015 de 11h à 12h00 ;
  • Projection du superbe film "El Chino" au Cinéma Vauban le 12 avril 2015 à 20h00 ;
  • Projection du superbe film "El Chino" au Cinéma Vauban le 14 avril 2015 à 20h00 ;
  • Apéro-spip à l’Open Software Club de Saint-Brisson le 15 avril 2015 de 11h à 12h00 ;
  • Apéro-spip à l’Open Software Club de Saint-Brisson le 22 avril 2015 de 11h à 12h00 ;
  • Apéro-spip à l’Open Software Club de Saint-Brisson le 29 avril 2015 de 11h à 12h00 ;

Quelques observations

  • Un événement source est à la fois indépendant et initial :
    • ayant sa propre date, il est totalement indépendant de ses répétitions ;
    • la date d’un événement source est antérieure à ses répétitions ;
  • A l’exception de leur ID et de leur date, les répétitions sont dépendantes de l’événement source, auquel elles sont liées par un champ id_evenement_source ;
  • Les événements qui n’ont pas de source (id_evenement_source=0) peuvent être :
    • soit des événements sans répétitions ;
    • soit des événements sources ayant une ou plusieurs répétitions.
  • Le champ id_evenement_source permet de distinguer un événement source (valeur=0) d’un événement répété (valeur !=0).

Objectifs

Sur l’agenda d’un site annonçant des événements à venir avec et sans répétitions :

  • on désire afficher une seule fois le titre d’un événement répété ;
  • on aimerait regrouper, sous le titre d’un événement répété, les dates de ses répétitions futures, en commençant par la prochaine ;
  • on souhaiterait pouvoir trier tous les événements, répétés ou non, par la date de début de leur prochaine occurrence :
    • dans le cas d’un événement non répété, il s’agira de sa date de début ;
    • dans le cas d’un événement répété, il s’agira de la date de début de sa prochaine répétition.

Concrètement, sur la base de notre exemple, voilà ce qu’on aimerait afficher le 2 avril :

  • Concert, le 6 avril à 20h30 au Zénith de Saint-Agnan ;
  • Apéro-spip à l’Open Software Club de Saint-Brisson : 8 avril, 15 avril, 22 avril, 29 avril - De 11h à 12h00
  • Projection du superbe film "El Chino" au Cinéma Vauban : 12 avril, 14 avril - 20h00 ;

Toujours sur la base de notre exemple, voilà ce qu’on aimerait afficher le 9 avril :

  • Projection du superbe film "El Chino" au Cinéma Vauban : 12 avril, 14 avril - 20h00 ;
  • Apéro-spip à l’Open Software Club de Saint-Brisson : 15 avril, 22 avril, 29 avril - De 11h à 12h00

Première étape : sélectionner les dates à venir

Les dates des répétitions seront affichées sous leur événement source. A priori, dans un premier temps, seuls les événements sources et les événements sans répétitions nous intéressent. C’est à dire, uniquement les événements à venir ayant un id_evenement_source=0.

Mais comment faire pour les événements sources dont la date initiale serait passée... et l’une de ses répétitions à venir ? Une seule possibilité : les sélectionner via le champ id_evenement_source de leurs répétitions...

Pour cela, nous allons créer un tableau via #ARRAY, que nous appellerons « tableauprochainement ».

Puis nous allons remplir ce tableau avec les ID des événements qui nous intéressent :

  • Si l’id_evenement_source est égal zéro, il s’agit d’un événement source ou d’un événement non répété : on prend donc directement l’#ID_EVENEMENT ;
  • Si l’id_evenement_source est différent de zéro, il s’agit d’une répétition : dans ce cas, c’est l’#ID_EVENEMENT_SOURCE qui nous intéresse.
  1. #SET{tableauprochainement,#ARRAY}
  2. <BOUCLE_prochainementselection(EVENEMENTS){age_fin>=-365}{age_debut<=0}{par date_debut}>
  3. [(#ID_EVENEMENT_SOURCE|=={0}|?{
  4. #SET{tableauprochainement,#GET{tableauprochainement}|push{#ID_EVENEMENT}},
  5. #SET{tableauprochainement,#GET{tableauprochainement}|push{#ID_EVENEMENT_SOURCE}}
  6. })]
  7. </BOUCLE_prochainementselection>

Télécharger

Remarque : le tri d’affichage, par date de début, se fait ici, au moment du remplissage du tableau.

Deuxième étape : afficher les dates à venir sous leurs événements respectifs

Dans une boucle principale, on appelle les événements sélectionnés dans notre tableau, qui peut contenir, par date de début de la prochaine occurrence :

  • des événements à venir sans répétitions ;
  • des événements source avec répétitions ;

On commence par afficher, dans l’ordre du tableau, le titre de ces événements. Puis, à l’aide de deux autres boucles internes, on cherche les dates :

  1. La première boucle de date affichera la date de l’événement dont on a affiché le titre si les conditions suivantes sont remplies, :
    • si l’événement en question n’a aucune répétition ;
    • si l’événement en question contient des répétitions mais que sa date initiale n’est pas encore passée.
  2. La deuxième boucle de date affichera les dates des prochaines répétitions de l’événement dont on a affiché le titre.
  1. <B_prochainement>
  2. <ul>
  3. <BOUCLE_prochainement(EVENEMENTS){id_evenement IN #GET{tableauprochainement}}>
  4. <li>
  5. <h4>#TITRE</h4>
  6. <BOUCLE_dateevenement(EVENEMENTS){id_evenement}{age_fin>=-365}{age_debut<=0}>
  7. <p>[(#DATE_DEBUT|Agenda_affdate_debut_fin{#DATE_FIN)]</p>
  8. </BOUCLE_deteevenement>
  9. <BOUCLE_daterepetition(EVENEMENTS){id_evenement_source=#ID_EVENEMENT}{age_fin>=-365}{age_debut<=0}>
  10. <p>[(#DATE_DEBUT|Agenda_affdate_debut_fin{#DATE_FIN,#HORAIRE})]</p>
  11. </BOUCLE_daterepetition>
  12. <p>#LIEU</p>
  13. </li>
  14. </BOUCLE_prochainement>
  15. </ul>
  16. </B_prochainement>

Télécharger

Remarque : pour ne pas compliquer la boucle, je ne suis volontairement pas allé jusqu’au bout des critères de date, qui permettent notamment d’afficher les horaires qu’une seule fois (ceux d’une répétition ne sont pour le moment pas réglables : c’est l’événement source qui les définit... donc aucun intérêt de les dupliquer à chaque fois). Une fois qu’on est arrivé là, c’est une formalité...

Dernière modification de cette page le 8 avril 2015

Retour en haut de la page

Vos commentaires

Répondre à cet article

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici Les choses à faire avant de poser une question (Prolégomènes aux rapports de bugs. )
Ajouter un document

Retour en haut de la page

Ça discute par ici

  • Mailsubscribers

    16 janvier 2013 – 274 commentaires

    Ce plugin permet de gérer les inscriptions (ou abonnements) à la diffusion de contenu par email. Mailsubscribers permet de gérer les inscriptions par Opt-in simple ou double et la désinscription par URL. Ce plugin gère également plusieurs listes (...)

  • noiZetier v2

    9 novembre 2012 – 36 commentaires

    Le noiZetier offre une interface d’administration permettant d’insérer au choix des éléments modulaires de squelettes (noisettes) et de les ajouter ainsi à ses squelettes. Compatibilité La version 2 du noizetier fonctionne sous SPIP 3. Elle est (...)

  • cirr : plugin « rédacteur restreint »

    29 octobre 2010 – 60 commentaires

    Ce plugin « cirr : rédacteur restreint » permet d’affecter des rubriques aux rédacteurs et modifie les droits afin qu’un rédacteur restreint (ou un administrateur restreint) voit dans l’espace privé uniquement les rubriques qui lui sont affectées (et leur (...)

  • Un retour d’expérience d’utilisation de Formidable

    26 octobre – commentaires

    Il s’agissait de créer un formulaire d’inscription à un évènement modérer les inscriptions dans le privé publier les inscriptions dans le public Nous avons discuté de cette présentation lors de l’apéro SPIP du 15 février 2016 à la Cantine (...)

  • Métas +

    3 décembre – 14 commentaires

    Améliorez l’indexation de vos articles dans les moteurs et leur affichage sur les réseaux sociaux grâce aux métadonnées Dublin Core, Open Graph et Twitter Card. Installation Activer le plugin dans le menu dédié. Dans le panel de configuration, (...)

Ça spipe par là