SPIP-Contrib

SPIP-Contrib

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

288 Plugins, 197 contribs sur SPIP-Zone, 232 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

14 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 28 décembre 2016

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

  • Serveur HTTP abstrait

    25 novembre 2013 – commentaires

    Un plugin-outil pour aider les développeurs à implémenter des API orientées REST, basées sur les méthodes HTTP (get, post, put, delete). Ce plugin a pour but premier de normaliser des URL que l’on pourra appeler pour manipuler les données du site. À (...)

  • Agenda Fullcalendar facile

    29 octobre 2016 – 33 commentaires

    Dans un précédent article, nous expliquions comment afficher un agenda Fullcalendar sur son site avec le plugin agenda. Cependant, ceci nécessite des manipulation de squelettes, ce qui n’est pas toujours évident lorsqu’on débute. La présente (...)

  • LinkCheck : vérificateur de liens

    13 février 2015 – 93 commentaires

    Ce plugin permet de chercher et tester l’ensemble des liens présents dans les objets. Vous pourrez donc en quelques clics connaître les liens brisés ou défectueux qui se sont immiscés dans le contenu de votre site SPIP. La vérification s’effectue en (...)

  • Acces Restreint 3.0

    11 décembre 2008 – 804 commentaires

    Le plugin accès restreint permet de définir et de gérer des zones de l’espace public en accès restreint. Cette version du plugin a été redévelopée et optimisée tout spécialement pour SPIP 2.0. Il en découle une amélioration des performances sur les gros (...)

  • Abonnements

    31 janvier 2015 – 18 commentaires

    Gérer des abonnements à des offres, et uniquement cela. Ce plugin a pour but de regrouper tout ce qui est commun aux différents types d’abonnements possibles (à des zones restreintes, à des contenus précis, à une version papier pourquoi pas (...)

Ça spipe par là