Carnet dates et agendas

Gestion de dates et du calendrier

SPIP-Contrib :: Carnet Wiki :: Carnet dates et agendas :: Recherche :

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 :

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 :

[(#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 :

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