La documentation de la partie Agenda de spip est éparse et quelquefois difficile à suivre, principalement on la retrouve sur spip.net (Pour le calendrier original, qui se sert uniquement de la date de l’article) et sur spip-contrib (Plugin Agenda, versions 1.9 et 2.1 ).
Si la partie privée est largement développée, facile à utiliser, la partie publique est beaucoup plus délicate. Pour les besoins d’un site associatif j’avais développé une première version qui obligeait à des forks [1] multiples et qui est visible sur l’ancien site du comité de lutte contre le sida.
L’évolution du site m’a obligé à replonger et les discussions sur le forum et la liste ont conduit à ce que je propose sur le nouveau site et qui est utilisé en routine pour gérer les activités de l’association.
Le but est de présenter dans la partie publique un calendrier (cases de jours) qui reprend les événements du site, et permet de les modifier ou d’en ajouter toujours depuis la partie publique.
Prérequis
Ces squelettes nécessitent le plugin agenda, donc le plugin Bonux.
Ils peuvent être utilisés avec ou sans Zpip, et Zen-Garden le thème de base est Arclite.
Principes des agendas de spip
Pour se comprendre il faut poser des bases qui viennent de la doc du plugin Agenda original :
- Les événements sont associés à un article de spip, donc à une rubrique. Pas d’événement sans article associé.
- Ils peuvent être munis de mots-clefs
- La structure d’un événement et les balises associées sont bien décrites toujours dans la doc du Plugin Agenda
On suppose donc que des événements sont créés et associés à un ou plusieurs articles (j’ai pris l’option d’un seul article pour tous les événements, mais ça ne change pas le fonctionnement des squelettes).
Pour afficher les événements, sous forme de calendrier il faut deux choses (les boucles complètes sont dans les squelettes).
- Il faut d’abord une boucle qui balaye ces événements et les « stocke pour affichage » grâce au filtre Agenda_memo_full
sous la forme
[(#DATE_DEBUT|Agenda_memo_full{#DATE_FIN,#TITRE,#DESCRIPTIF,#LIEU,#URL_ARTICLE, 'couleur'})]
-
#DATE_DEBUT
et#DATE_FIN
seront affichés comme les dates/heures de l’événement -
#TITRE
et#LIEU
seront visibles dans la case du jour de l’événement -
#DESCRIPTIF
sera visible au survol -
#URL_ARTICLE
sera l’Url pointée lors d’un click sur le texte de l’événement (on peut préférer#URL_EVENEMENT
) -
'couleur'
est un style css appliqué à la div de l’événement.
Cette boucle peut utiliser tous les critères généraux de spip, des critères d’âge, et des critères d’agenda expliqués dans la doc du plugin Agenda pour afficher seulement les événements d’un secteur, d’un article,....
Il est crucial que la boucle utilise le critère agendafull
qui permet de ne retenir dans les événements que ceux qui sont concernés par le mois/jour/semaine que l’on affiche.
La syntaxe est
{agendafull date_debut, date_fin, type, AAAA, MM, JJ}
où
-
date_debut
etdate_fin
sont les champs dans la base qui contiennent les dates de début et fin de l’événement -
type
est ’mois’, ’semaine’ ou ’jour’ selon ce qu’on veut afficher comme calendrier - AAAA MM et JJ sont les années, mois et jour du calendrier que l’on voudra afficher.
- Deuxièmement, en fin de boucle, il nous faut le filtre d’affichage [(#TOTAL_BOUCLE|Agenda_affiche_full{<:aucun_article:>, 'mois'})]
-
<:aucun_article:>
est affiché si rien n’est stocké dans cet agenda -
'mois'
est le type de l’agenda à afficher,ça pourrait être'jour' 'semaine' 'période' 'mois'
, ce qui affichera des calendriers correspondants.
Cette contribution concerne les événements du plugin Agenda. Spip fournit des squelettes prêts à l’emploi agenda_jour, agenda_semaine, agenda_mois MAIS ils concernent le calendrier « original » de spip donc sont hors sujet.
Le Plugin Agenda fournit des squelettes de même nom mais que nous avons modifiés
- pour pointer sur #URL_EVENEMENT
- pour être compatible avec Zpip.
Les morceaux de squelette pour affichage
On souhaite obtenir un calendrier par jour, semaine et mois qui présente les événements du site. On reprend pour ce faire le principe des squelettes agenda.
#SET{tt,#EVAL{$_GET['type']}}
[(#INCLURE{fond=inclure/agenda_#GET{tt,"mois"}} {ajax}{annee=#ENV{annee,#DATE|annee}} {mois=#ENV{mois,#DATE|mois}}{type=#GET{tt}}{env})]
Le 'type'
de l’agenda est récupéré par un #EVAL
car dans le cas de squelettes Zpip, #ENV{type}
est utilisé pour autre chose.
Exemple d’agenda_mois
<BOUCLE_mois(EVENEMENTS)
{agendafull date_debut,date_fin, mois, #ENV{annee}, #ENV{mois}}
>[(#DATE_DEBUT|affdate{'Y-m'}|=={[(#ENV{annee})]-[(#ENV{mois})]}|?{#DATE_DEBUT,[(#ENV{annee})]-[(#ENV{mois})]-01 00:00:00}
|agenda_memo_full
{#DATE_FIN,
[(#TITRE)], [(#REM) ce qui apparait et qui pointe <a>]
#DESCRIPTIF,[(#REM) ce qui apparait au survol]
#LIEU, [(#REM) ce qui apparait sous le <a>]
[(#URL_EVENEMENT|parametre_url{id_evenement,#ID_EVENEMENT})] [(#REM) l'url pointée)]
calendrier-couleur[(#ID_SECTEUR|modulo{14,1})]})]
</BOUCLE_mois>[(#DATE|agenda_affiche_full{<:aucun_article:>, 'mois'})]<//B_mois>
Les critères
[(#DATE_DEBUT|affdate{'Y-m'}|=={[(#ENV{annee})]-[(#ENV{mois})]}|?{#DATE_DEBUT,[(#ENV{annee})]-[(#ENV{mois})]-01 00:00:00}
servent à gérer les évènements dont le début est avant le mois en cours, et la fin après.Cette phrase se lit : si le mois et l’année de la date de début de l’évènement sont les mêmes que celles de l’environnement, alors passe la date de début de l’évènement, sinon passe la date du premier jour du mois demandé par l’environnement.
C’est aussi simple dans le cas d’un squelette « jour » où il faut remplacer « mois et annee » par « mois, jour et annee ».
Par contre, dans le cas d’un squelette semaine, ca se complique un peu. L’idée est que si la date de début est antérieure au début de la semaine, il faut passer la date du début de la semaine. Pas simple, il a fallu développer un filtre pour cela.
Si on ne gère pas ces cas « étranges » générés par les évènements longs qui commencent avant la date demandée, on s’expose à un bug de blocage bien expliqué dans ce post de forum de REM (Merci à lui...)(le zip a été modifié le 8/01)
Les classes ’calendrier-couleur’ de 1 à 14 sont utilisées pour colorer différemment les évènements selon le secteur dans cet exemple.
Ces squelettes vont donc fonctionner « tels que » dans un site.
Reste à être compatible avec Zpip
Zpip comporte des méthodes de fourniture de page extrêmement élégantes, il suffit dans notre cas de mettre notre squelette dans contenu/page-agenda
, pour que tout se passe bien. C’est a dire que notre agenda s’affichera dans le « contenu » de zpip, et que Zpip gérera le reste autour.
SAUF que Zpip utilise la variable #ENV{type}
que l’agenda utilise aussi. D’où l’écriture #SET{tt,#EVAL{$_GET['type']}}
qui permet de contourner l’affaire.
Un peu de jquery ne nuit pas
Pour obtenir un affichage « plus sympa », ou « à la google agenda » des évènements, j’ai utilisé « cluetip » qui au survol d’un évènement va chercher en ajax un squelette « pop_event » qui se charge de fournir une vue de l’évènement. (Je n’ai pas trouvé de plugin Jquery qui serait « standard » par exemple avec spip-bonux ou avec Mediabox, pour réaliser la même chose, ce qui allègerait grandement l’affaire...)
Il devenait inutile de cliquer sur l’évènement pour le voir, j’en ai profité pour utiliser le clic pour modifier l’évènement. Cela donne le squelette agenda_mois comme suit :
<BOUCLE_mois(EVENEMENTS)
{agendafull date_debut,date_fin, mois, #ENV{annee}, #ENV{mois}}
>[(#DATE_DEBUT|affdate{'Y-m'}|=={[(#ENV{annee})]-[(#ENV{mois})]}|?{#DATE_DEBUT,[(#ENV{annee})]-[(#ENV{mois})]-01 00:00:00}
|agenda_memo_full
{#DATE_FIN,
[(#TITRE)], [(#REM) ce qui apparait et qui pointe <a>]
#DESCRIPTIF,[(#REM) ce qui apparait au survol]
#LIEU, [(#REM) ce qui apparait]
[(#URL_PAGE{mod_evenement}|parametre_url{id_evenement,#ID_EVENEMENT})],
calendrier-couleur[(#ID_SECTEUR|modulo{14,1})]})]</BOUCLE_mois>[(#DATE|
agenda_affiche_full{<:aucun_article:>, 'mois'}
)]<//B_mois>
On va utiliser #FORMULAIRE_EDITER_EVENEMENT
dont la syntaxe est :
#FORMULAIRE_EDITER_EVENEMENT{id_evenement,id_article,url,lier_trad,config_fonc,row}
-
id_evenement
est l’évènement à éditer, ou zéro pour en faire un nouveau, -
id_article
est l’article associé, -
url
est l’url où retourner après avoir validé le formulaire (dans mon cas, c’est la page appelante), - je suis moins savant sur
-
lier_trad
, -
config_fonc
, -
row
qui ne m’ont pas livré leur secrets....
-
Le squelette mod_evenement se présente comme cela.
<BOUCLE_event(spip_evenements){id_evenement}>
<BOUCLE_A(ARTICLES){id_article}>
<div class='cadre-formulaire-editer'>
<div class="entete-formulaire">
#ENV**{icone_retour}
[<p>(#ENV{id_evenement}|intval|?{<:agenda:titre_cadre_modifier_evenement:>,<:agenda:titre_cadre_ajouter_evenement:>})</p>]
[<h1>(#ENV{id_evenement}|intval|?{##ENV{id_evenement}})</h1>]
</div>
#FORMULAIRE_EDITER_EVENEMENT{#ENV{id_evenement},#ENV{id_article},
#EVAL{$GLOBALS[_SERVER][HTTP_REFERER]}, [(#REM) La page d'où on vient]
#ENV{lier_trad},#ENV{config_fonc},#ENV{row}}
</div>
</BOUCLE_A>
</BOUCLE_event>
</B_event>
[(#REM) pas d'evenement, on le rajoute donc il faut trouver un article
on prend celui du premier evenement de la base]
<BOUCLE_e2(spip_evenements){tout}{par date_debut}{0,1}>
<div class='cadre-formulaire-editer'>
<div class="entete-formulaire">
#ENV**{icone_retour}
<p><:agenda:titre_cadre_ajouter_evenement:></p>
</div>
#FORMULAIRE_EDITER_EVENEMENT{0,#ID_ARTICLE,#EVAL{$GLOBALS[_SERVER][HTTP_REFERER]},#ENV{lier_trad},#ENV{config_fonc},#ENV{row}}
</div>
</BOUCLE_e2>
<//B_event>
Il faut une boucle article autour du #FORMULAIRE_EDITER_EVENEMENT (pas d’évènement sans article associé) même si l’évènement est à créer.
Conclusion
L’agenda du plugin Agenda de spip est très puissant, mais pas si simple à utiliser dans la partie publique des sites. L’apport du plugin Zpip et des squelettes Zpip-dist ainsi que des thèmes a été extrêmement précieux. Il reste encore quelques mystères autour de #FORMULAIRE_EVENEMENT, mais je suis sur que tout cela va s’éclaircir, d’autant qu’un Agenda 2.1 est sur la zone en train de s’améliorer.
Merci à tous les développeurs et aux contributeurs qui débroussaillent pour nous la jungle du php....
Aucune discussion
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
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.
Suivre les commentaires : |