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

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.
#SET{tableauprochainement,#ARRAY}
<BOUCLE_prochainementselection(EVENEMENTS){age_fin>=-365}{age_debut<=0}{par date_debut}>
[(#ID_EVENEMENT_SOURCE|=={0}|?{				
	#SET{tableauprochainement,#GET{tableauprochainement}|push{#ID_EVENEMENT}},				
	#SET{tableauprochainement,#GET{tableauprochainement}|push{#ID_EVENEMENT_SOURCE}}
})]
</BOUCLE_prochainementselection>

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.
<B_prochainement>
<ul> 	
<BOUCLE_prochainement(EVENEMENTS){id_evenement IN #GET{tableauprochainement}}>
<li>
<h4>#TITRE</h4>
<BOUCLE_dateevenement(EVENEMENTS){id_evenement}{age_fin>=-365}{age_debut<=0}>
<p>[(#DATE_DEBUT|Agenda_affdate_debut_fin{#DATE_FIN)]</p>
</BOUCLE_deteevenement>
<BOUCLE_daterepetition(EVENEMENTS){id_evenement_source=#ID_EVENEMENT}{age_fin>=-365}{age_debut<=0}>
<p>[(#DATE_DEBUT|Agenda_affdate_debut_fin{#DATE_FIN,#HORAIRE})]</p>
</BOUCLE_daterepetition>
<p>#LIEU</p>	
</li>
</BOUCLE_prochainement>	
</ul>
</B_prochainement>	

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é...

Discussion

Aucune discussion

Ajouter un commentaire

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.

Qui êtes-vous ?
[Se connecter]

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

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom