Gestion de dates et du calendrier

On liste ici toutes les idées, les concepts, et les réalisations permettant d’améliorer et de faciliter la mise en oeuvre de calendriers dans l’espace public (pour l’instant) avec SPIP.

Il existe déjà de nombreuses contributions sur les dates : Agendas-et-Dates

Objectifs

  1. Proposer une alternative de navigation chronologique
  2. Poposer des outils pour simplifier la gestion de dates de début et de fin
  3. Exposer et grouper par date.
  4. un système très légér de publication d’annonces/évènements

1-Navigation chronologique

Le critère agenda, le plugin calendrier_mini ont atteint leur limite, tant dans leur dévelopement que dans leurs usages. Sans doute parce qu’ils sont difficiles à utliser dans des cas simples ou jugés comme tels.

CalendrierEspacePublic rappelle l’utilisation du critère standard agenda. Son défaut, c’est de fournir une navigation dans une intrerface graphique figée et de fonctionner sur la base de manipulation de plusieurs critères.

Le plugin calendrier_mini n’est pas documenté et n’est connu qu’à travers le squelette Spip-Clear et son fork dans le plugin Agenda. Son défaut, c’est de ne fonctionner que pour un seul objet éditorial à la fois, et de s’appuyer sur le critère ci-dessus.

Le chantier proposé ici est de fournir un, ou un ensemble de modèles SPIP, faciles à modifier, pour l’affichage, quelques fonctions en php, ainsi que, dans un second temps, un critère et une balise pour fournir une pagination chronologique aux boucles.

Code

Sur la zone : http://trac.rezo.net/trac/spip-zone... et sur la liste de discut’ http://listes.rezo.net/mailman/list...

Pour apporter un peu de souplesse sur l’affichage du calendrier, on s’appuie sur quelques métas, accessible via la balise #CONFIG et éditables avec le plugin CFG, qui est donc requis pour que le squlette fonctionne.

On calcule le premier jour de la semaine affiché dans le mini calendrier en fonction de la langue de navigation (dimanche si la langue est l’anglais ou le japonais, lundi sinon). Il y a un moyen de débrayer ce calcul (voir les paramètres plus bas)

à faire : un beau formulaire CFG, internationaliser (fichier de langues), on utilise le filtre « find » qui n’est pas dans la version 1.9.2, à ajouter dans le plugin.

Documentation

On affiche un mini calendrier directement dans un squelette : [(#MODELE{minical/mois})].
Ecrit comme, ça, il ne fera pas grand chose, mais ça s’affiche et ça permet de vérifier que les liens de navigation par mois ou par année fonctionne.

Dans la page CFG du plugin, on peut paramétrer les points suivants :

  • Afficher les liens de navigation par mois (mois précédent, mois suivant), actif par défaut,
  • Afficher des liens de navigation par année en plus de ceux ci-dessus, désactivé par défaut,
  • Forcer le choix du premier jour de la semaine, quelquesoit la langue de navigation, désactivé par défaut,
  • Choisir la forme des noms des jours dans l’entète (abrégés, initiales ou complets), complets par défaut, devrait être ’abbr’,
  • Afficher un lien permanent pour revenir au mois courant, actif par défaut.

En fait, il faut systématiquement mettre un paramètre de date dans l’appel au modèle : [(#MODELE{minical/mois}{date})], pour que la date soit prise en compte dans la gestion du cache de ce modèle.

le paramètre jours est une liste de jour formatté AAAA-MM-JJ, dans la page d’exemple :
{jours=#ARRAY{0,1999-02-02,1,2007-10-04,3,2007-10-07,4,2007-10-12,5,2007-09-19,6,2007-11-22}}. Il s’agit d’un tableau de dates statique. Contenant le 2 février 1999, le 22 novembre 2007. On voit que l’ordre chronologique n’a pas d’importance dans cette liste, c’est le modèle qui va trier.

On peut aussi construire le tableau des jours avec une boucle :

  • On calcule ici la liste des jours cliquables à partir d’une boucle ARTICLES
  • Le critère lang_select=non permet de ne pas distinquer les articles (et donc leurs dates) dans le calendrier
  • Le critere date est une expression régulière qui compare le champ date des articles avec le paramètre de date de l’url
  • Tout article dont la date commence par AAAA-MM (soit publié le mois MM de l’année AAAA) voit sa date de publication entrer dans la liste des jours sur lesquels faire un lien dans le mini calendrier.
  • Emploi du filtre unique pour éviter d’ajouter plusieurs fois une même date dans la liste.
[(#SET{jours,#ARRAY{0,0}})]
<BOUCLE_minical(ARTICLES){date==^((#ENV{date_liste}|debut_mois|affdate{Y-m}))}{lang_select=non}>[
[(#SET{jours,[(#GET{jours}|push{[(#DATE|affdate{Y-m-d})]})]})]
(#DATE|affdate{Y-m-d}|unique|?{' '})
]</BOUCLE_minical>[
<div class="menu">
	<h2><:cal_par_mois:></h2>
	(#MODELE{minical/mois}
		{var_date=date_liste}
		{date=#ENV{date_liste}}
		{jours=#GET{jours}})
</div>]

Une autre boucle affichera les articles correspondants au minical résultant du code précédent :

<BOUCLE_liste(ARTICLES){date==^(#ENV{date_liste})}{par date}{inverse}>
<div>
    [<h2>(#DATE|affdate|unique)</h2>]
    <h3>#TITRE</h3>
    #INTRODUCTION
</div>
</BOUCLE_liste>

On voit ici qu’il faut être vigilant quant aux critères employés dans les deux boucles et les valeurs des paramètres, qui doivent être rigoureusement les mêmes. L’étape suivante serait donc de raccourcir l’écriture des boucles ci-dessus à un système critère/balise, comme la pagination SPIP :

<B_liste>
#CALENDRIER
<BOUCLE_liste(ARTICLES){calendrier}{par date}{inverse}>
<div>
    [<h2>(#DATE|affdate|unique)</h2>]
    <h3>#TITRE</h3>
    #INTRODUCTION
</div>
</BOUCLE_liste>

le critère calendrier est assez simple à coder (<http://trac.rezo.net/trac/spip-zone...>). Le gros soucis, c’est la balise #CALENDRIER.

En effet, la date qui sert de critère pour afficher les éléments peut-être une année, un mois ou un jour (valeurs 2007, 2007-10 ou 2007-10-26), mais le calendrier affiche un mois et dans ce mois, des liens vers les jours qui répondent aux critères de la boucles. ça signifie qu’il faudrait que #CALENDRIER exécute sa propre requête SQL, mais en tenant compte du de la boucle dans laquelle elle se trouve.

à développer aussi, des modèles de navigation basés sur une journée, une semaine, une année etc...

2-Date début/Date de fin

Le but ici, c’est de fournir une convention assez générique sur les dates de début et de fin. On se sert souvent de la date de publication d’un article pour définir le « début » d’un évènement et par convention, la date de publication antérieure est détournée de son usage pour représenter la date de « fin ».

pour commencer, #DATE (ou #DATE_DEBUT) peuvent désigner la même chose, on met en place une balise standard #DATE_FIN en s’appuyant sur la même technique de variables globales :

$table_dates['articles'] = 'date'; désigne le champ date pour la table articles dans le cadre des calculs avec les critères age, mois_relatif etc...

Il existe aussi la globale $exceptions_des_tables, utile pour associer des #BALISES à des champs dont les noms ne sont pas « standards », et appliquer des critères associés à des nom de champs particuliers (id_parent, date, branche...)

on pourrait faire de même avec une table des dates de fin :

  • $table_dates_fin['articles'] = 'date_fin'; désigne un champ date_fin qu’on ajoutera à la table articles,
  • $table_dates_fin['articles'] = 'date_redac'; par exemple, pour signifier qu’avec les filtres et critères ci-dessous, on utilsera le champ détourné date_redac (et assuré la compatibilité avec d’anciens usages ou des vieilles contribs)

on peut alors imaginer des critères {encours}, {avenir} et {revolus} qui sélectionnerait les éléments d’une boucle en fonction des deux dates.

une balise #DUREE, etc... (voir le filtre duree => Filtre durée)

voir aussi : http://spipnantes.free.fr/spip.php?...

3- Exposer et grouper par date

plugin de développement : dates et archives

Le but ici, c’est d’exposer, comme on le fait avec la balise #EXPOSE pour les rubriques, facilement en fonction de dates. Le principe retenu, c’est qu’on « expose » si la date courante est contenu dans la date du contexte.

Par date du contexte, il faut comprendre celle passée en paramètre d’url (&date=2008-01), ou bien, celle passée en paramètre d’un INCLURE.

D’autre part, on a besoin de faire une liste de dates de publication, ou bien de début d’évènements, etc... On va donc chercher dans une boucle et n’afficher qu’une seule fois une date dans un format donné. Par exemple, comme dans le bloc « Archives » du site spip . blog. On utilise le filtre |unique mais lorsqu’on se retrouve avec une douzaine de date à afficher et qu’il faut boucler sur plus de 400 éléments, ça n’est plus très performant.

Il est possible d’utiliser le critère fusion, mais le champ date est trop précis. on veut grouper par mois et non à la seconde près. D’où une copie du critère fusion en fusion_date_mois.

4-Annonces Publiques

Mettre en ligne des événements très simples en se basant sur le système de messagerie personnelle du site.
Annonces-Publiques

5-Gestion des répétitions et des exceptions conformément à iCal

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