REMARQUE : Cet article présente une très ancienne manière de faire un agenda, pour SPIP 1.4.2. Il y a désormais un plugin Agenda qui permet de faire un agenda de manière plus propre et plus efficace.
ATTENTION : Cet article présente une ancienne version du mécanisme utilisé sur le site Gastero Prod, sur lequel est disponible un article de présentation du nouveau système plus performant.
[SPIP 1.4.2] Il peut être tentant d’utiliser SPIP pour présenter un agenda d’événements sous forme de calendrier. Plutôt que devoir intégrer un logiciel externe spécialisé, et en attendant que SPIP intègre un nouveau type de données, voici un squelette mêlant boucles SPIP et code PHP.
De quelles informations avons-nous besoin ?
La première étape consiste à déterminer comment les informations seront stockées dans SPIP, et donc saisies par les rédacteurs.
L’objectif principal étant qu’un rédacteur puisse définir une date à laquelle un événement donné doit avoir lieu, nous avons besoin des éléments suivants :
- Au moins un champ de type texte ;
- Un champ de type date.
Pour le champ texte, c’est simple, et nous allons même pouvoir nous régaler. SPIP nous en propose au moins 3 très utiles et systématiquement présents quel que soit le paramétrage du site : le titre, le descriptif et le texte.
La date de publication antérieure ou la vraie date de publication ?
La date de publication d’un article est déterminée automatiquement lors de sa validation, ce qui signifie que l’auteur ne peut pas la préciser à l’avance. Elle peut en revanche être modifiée par le valideur, mais elle n’est donc pas vraiment utile pour indiquer une date d’événement - surtout si on a configuré son site pour que SPIP ne publie pas les articles post-datés.
Heureusement, SPIP propose aussi une date de publication antérieure, normalement utilisée pour indiquer à quelle date a été publié un article repris ultérieurement dans SPIP, et qui peut être définie librement par le rédacteur [1].
C’est cette date que nous allons utiliser pour définir les événements de l’agenda.
Organiser les événements
Si l’agenda doit contenir beaucoup d’informations de nature diverse, il peut s’avérer utile de les qualifier (concert, film, réunion ?) pour les mettre en évidence et éventuellement ensuite les afficher de manière sélective.
Dans SPIP deux méthodes de classement viennent immédiatement à l’esprit :
- Classement par rubrique (et éventuellement sous-rubriques) ;
- Classement par mot-clé.
Dans cet exemple, nous allons utiliser les rubriques, ce qui nous permettra de constituer toute une arborescence pour stocker les articles événements ; cela va nous permettre de filtrer les types d’événements avec une notion de granularité progressive (c’est pas chic ça ?).
Dans l’agenda de Gastero Prod, le rubriquage n’est pas très développé, mais il est déjà possible de sélectionner uniquement les événements musicaux, et éventuellement de filtrer encore plus en ne considérant que les concerts.
Notez au passage que les logos des rubriques sont utilisés pour illustrer les événements.
Intégrer l’agenda dans la partie publique
Voilà, les événements sont créés dans une arborescence de rubriques thématiques et sont positionnés à une date, passons aux choses sérieuses, l’intégration de l’agenda résultant dans les pages du site.
Première chose à faire, télécharger le package qui va grandement vous simplifier la tâche :
Ce package contient les fichiers suivants :
agenda.css |
La feuille de style permettant de personnaliser l’affichage de l’agenda |
agenda.html/php3 |
Le squelette de l’agenda, à inclure dans vos propres squelettes, et son .php3 associé |
agenda_themes.html/php3 |
Le squelette des thèmes de l’agenda, à inclure dans vos propres squelettes, et son .php3 associé |
Pour insérer l’agenda dans votre site, le plus simple est de créer un squelette particulier pour la rubrique de votre agenda. J’ai par exemple créé le squelette rubrique-43.html
sur Gastero Prod puisque la rubrique d’agenda porte l’identifiant 43.
Dans ce squelette, les éléments suivant sont à ajouter. Tout d’abord, dans l’entête, il faut ajouter la référence de la feuille de style supplémentaire à utiliser :
<link rel="stylesheet" href="agenda.css" type="text/css" />
Ensuite, il faut ajouter l’agenda lui-même, grâce à un simple INCLURE
[2] placé à l’intérieur de la boucle principale RUBRIQUE
:
<INCLURE(agenda.php3){id_rubrique}>
Enfin, il faut ajouter la sélection de l’arborescence thématique :
<INCLURE(agenda_themes.php3){id_rubrique=43}>
Notez que pour cette fois-ci, il faut préciser l’identifiant de la rubrique de l’agenda. C’est pour que l’arborescence thématique soit toujours complète, même si l’on n’affiche qu’une thématique particulière.
Quelques remarques techniques
Les paramètres de navigation d’un mois à l’autre sont passés dans l’URL au travers des variables var_nav_month
et var_nav_year
. On utilise la notation var_xxx
pour indiquer à SPIP de ne pas prendre en compte ces variables pour le calcul du cache de la page, ce qui permet à la fois de limiter l’impact sur le cache (un seul fichier cache traitera toutes les pages de l’agenda) et d’accélérer l’affichage (puisque SPIP n’aura besoin d’aller chercher les données dans la base qu’une seule fois pour toutes ces pages).
La sélection des événements à afficher se fait en PHP car il n’est pas possible de sélectionner une plage de dates dans une boucle SPIP. Une boucle avec pour seul critère la restriction thématique éventuelle est donc utilisée, et une variable PHP de type tableau nommée $events
est remplie avec la liste des événements susceptibles d’être affichés dans le calendrier du mois demandé.
Discussions par date d’activité
64 discussions
bonjour, apres avoir fait toutes les modifs, je me retrouve avec l’agenda vide qui s’affiche (j’ai bien mis publication anterieure)... des que je clique sur un lien (precedent, aujourd’hui, ou une rubrique de l’arbo) il m’affiche une page d’erreur avec
The requested URL /monsite/agenda/2004/02/6.html was not found on this server.
02 est le mois que je demande, 6 est le nom de mon secteur...
quelqu’un a une idée ??
ps :je suis en local sous easy php
Répondre à ce message
Bonjour,
Merci Nicolas pour cette contribution que j’ai plaisir à utiliser.
Je reviens sur ce que demandait Coyotte dans les commentaires.
Il demande s’il est possible de mettre un évènement qui porte sur une période.
Tu lui répond que non : il faut saisisir la date plusieurs fois.
Mais ne pourrait-on pas faire comme le propose robert dans son calendrier séquentiel.
cf ’http://www.uzine.net/spip_contrib/article.php3?id_article=153’
C’est-à-dire utiliser les deux dates : #DATE et #DATE_RUB comme date de début et date de fin ?
En particulier, il m’a semblé que dans le script il y avait une boucle qui interpréait la date pour mettre plusieurs items dans une table ??
Le problème est que je n’y connais plus grand chose en programmation...
Merci,
Vincent
C’est en tout cas ce que je fais.
Bien sûr que si, mais cela ne me convient pas, je veux savoir à quelle date un événement a été ajouté, donc je ne peux pas détourner la date de publication.
Je comprends ton point de vue, mais comment faudrait-il faire ?
Bien sûr : juste pour voir... :-)
Merci
Vincent
Nicolas,
J’ai essayé de modifier ton script (boucle évènement) pour essayer d’integrer les dates séquentielles :
j’ai fait ceci à partir de la ligne 80 :
$datedeb = ereg_replace(« ^([0-9]4)-([0-9]2)-([0-9]2).*$ », « \1\2\3 », ’#DATE’) ;
$datefin = ereg_replace(« ^([0-9]4)-([0-9]2)-([0-9]2).*$ », « \1\2\3 », ’#DATE_REDAC’) ;
for($date = $datedeb ; $datefin ; $date++)
if ($date > date(« Ymd », mkdate($M, $J - 31, $A)) && $date < date("Ymd", mkdate($M, $J + 31, $A)))
if (!isset($events[$date]))
$events[$date] = array() ;
$events[$date][] = array(’link’ => ’#URL_ARTICLE’, ’title’ => ’(#TITRE’, ’logo’ => « #LOGO_ARTICLE_RUBRIQUE ») ;
Conclusion :
j’ai une erreur du type :
Fatal error : Maximum execution time exceeded in your script on line 87
c’est-à-dire sur la ligne :
$events[$date] = array() ;
Qu’est-ce cela veut dire ?
Je pense que c’est parce que ma boucle contient trop d’éléments, mais je ne vois pas pourquoi cela ne marche pas.
Merci bcp
Vincent
Répondre à ce message
Bonjour Nicolas et à tous,
Deuxième question pour des champions !
L’agenda marche avec des rubriques.
Comment peut-on faire pour qu’une variable locale spip, par exemple <:loue :> affiche dans l’agenda soit loué, soit rented (us) soit affito (italien) en fonction de la rubrique d’où serait issue la demande.
Sachant bien évidemment que je n’ai qu’une seule rubrique agenda, et que celle-ci se trouve dans le secteur français...
Comme je sais que tu es à l’origine de phplang, je pense que tu vas me dire de voir le script de phplang... mais là je cale.
Merci par avance,
Vincent
Peut-être en faisant un sous-squelette pour l’élément (un article je suppose) que tu veux mettre en multiples langues, avec effectivement
<:loue:>
dedans, et un<INCLURE(sous_squelette.php){id_article}>
, non ?Euh ... non, ça ne te sera pas vraiment utile, là, à priori ...
Merci Nicolas pour ta réponse ;.
Ou je n’ai pas compris ta réponse (bouu..) :-(
ou je me suis mal exprimé.
http://www.annecyrent.com/rubrique.php3?id_rubrique=10
En fait j’ai le masque de la rubrique qui affiche tout l’agenda.
Les items (articles) sont intégrés dans l’agenda complet.
Je n’affiche pas article par article.
Merci,
Vincent
Répondre à ce message
Peut-on envisager de modifier l’agenda afin d’afficher le menu de navigation et le corps de l’agenda dans deux frames différentes ?
Si oui, comment ?
quentin
Répondre à ce message
Il convient de préciser que la rubrique de l’agenda NE doit PAS avoir de logo de survol. Lorsqu’on en met un le script PHP fait des erreurs.
Sinon, bravo pour cet utile développement et merci de le partager !
Répondre à ce message
Bonjour,
Tout d’abord, merci pour cette contribution et le temps de conception qu’elle a du représenter.
Apparemment, l’agenda récupère les articles écris dans la rubrique créée à cet effet.
J’ai essayé sans succès de lui faire faire autre chose : afficher tous les articles des autres rubriques du site, dont une date de publication antérieure aurait été fixée. Mon objectif était de bloquer la rubrique agenda à une simple consultation, et que celui-ci aille prendre ses infos dans les autres rubrique.
Pour l’auteur, et quelque soit la rubrique dans laquelle il publie, il lui suffirait alors d’indiquer une date de publication antérieure pour qu’elle apparaisse dans l’agenda.
J’ai bien essayé de jouer sur les boucles de ’agenda.htm’ mais j’obtiens autant d’agendas affichés que de rubriques. Je n’ai pas suffisamment compris la logique de ces boucles pour m’en sortir seul
Merci de m’indiquer si le fonctionnement décrit ci-dessus est envisageable.
Bonjour,
J’ai fini par trouver ce que je voulais.
En mettant un critère tout dans la boucle de sélection des articles, j’arrive à faire apparaître les événements publiés dans les autres rubriques.
Répondre à ce message
bonjour et bravo pour ce développement qui me donne quand même des sueurs. j’ai installé la première version de l’agenda sans trop de problème. Compte tenu des remarques glannées sur la liste je souhaitais installer la nouvelle version mais je rencontre qq difficultés ...
visiblement le squellette ne fonctionne que si la rubrique agenda se trouve a la racine du site, mais ca c’est un detail. En revanche je ne comprends pas le fonctionnement de la navigation par date !!!!
la hiérarchie des dossiers est elle créée avant ???? car je ne vois comment spip peut afficher l’url
’agenda/2004/02/39.html’ si la page n’a pas été calculée au préalable ????.
j’avoue que je suis totalement perdu avec ce systeme qui me renvoie inexarablement un
The requested URL /php/avrille_local/agenda/2004/02/39.html was not found on this server.
si qq peut éclairer ma lanterne
merci jacques
Répondre à ce message
J’ai l’impression (ou est-ce que je fatigue ?) que l’agenda se calle sur l’heure du serveur où il est hébergé, n’est-ce pas ?
Comment fait-on pour compenser ce décalage ?
Mon serveur est sur GMT-7
Encore merci pour ce superbe script.
Yiannis
je cale tu cale il cale nous calons vous calez ils calent
Répondre à ce message
Voilà, j’ai (enfin) publié un article expliquant la mise en place de la nouvelle version de cet agenda tel qu’il est maintenant utilisé sur Gastero Prod :
- L’agenda : http://www.gasteroprod.com/agenda/
- L’article : http://www.gasteroprod.com/2003/12/...
Cela merite bien une breve ;-)
Quoi de neuf par rapport à l’ancienne ?
Encore merci, c’est vraiment un script canon !
Yiannis
Principalement l’usage des dates ...
Hum. Oui, c’est le principe d’un agenda, en général.
;-)
Et en plus précis, s-il-te-plaît-aïe-pas-sur-la-tête ?
:-D
As-tu lu l’article au moins ???
Non. Je l’avoue. Pas en détails. J’utilise ce chouette script depuis un moment déjà et en y regardant en diagonale, tout me paraissait « entendu »...
L’article est là depuis un certain temps, non ?
Merci quand même.
Moi agacé ? Bon, oui ... ;)
Ah bin je vais expliquer à nouveau ici ce qui y est déjà alors ...
Bin oui, mais justement, il y a eu des modifications.
Depuis le 9 décembre seulement !
Je rappelle l’URL à tout hasard : http://www.gasteroprod.com/2003/12/09/320.html
Je note au passage qu’il faudrait mieux mettre en évidence les
<blockquote class="spip">
dans les squelettes de spip_contrib ... ;)Répondre à ce message
B-) J’ai suivi les instructions, quoi qu’assez difficilement.
:o) Cela semble fonctionner, du moins en partie...
:-/ Les cases du calendrier reste vide malgré l’enregistrement de plusieurs articles.
Peut-on me donner un coup de main ?
le site en question est www.lannion.infogreve.org
rubrique agenda (numero 15)
As-tu bien utilisé la date de publication antérieure ?
benh voui, de plus j’ai autant essayé de publier des articles daté d’avant-hier que daté d’après demain.
rien ne s’affiche.
Et tu as bien mis l’id de ta rubrique (15 donc) partout où nécessaire ?
cela, je n’en suis pas certain.
j’ai bien nommé le squelette rubrique-15.html
et avec une ligne <INCLURE(agenda_themes.php3)id_rubrique=15>
mais, avec tout le respect et la sympathie que je vous accorde, cet article n’est pas des plus clairs, du moins pour les débutants ;o)
je peux eventuellement ouvrir un ftp temporairement pour acceder aux sources... ;o)
Allez, je veux bien jeter un oeil vite fait, donne moi par mail tes paramètres FTP temporaires ... ;)
Merci pour le boulot mais j’ai moi aussi des cases vides :-)
Je suis en local, j’ai mis des logos à mes rubriques, j’ai fait des articles datant de la semaine dernière.
Bref c’est joli, c’est bleu, et il y a des cases. mais...
Quelqu’un aurait une idée ?
mh,
Il m’est arrivé la même chose et après 2h de recherche, j’ai compris que je confondais date antèrieure et date de publication.
Je dis ça au cas où quelqu’un aurait à nouveau ce pb et, comme moi, chercherai la réponse ici sans la trouvé explicitement.
snejanko
Répondre à ce message
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 : |