Réaliser un agenda avec SPIP 1.4.2 (Archive)

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

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.

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.

Exemple d’agenda
L’agenda de Gastero Prod

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.

Utilisation de la date de publication antérieure

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.

Une hiérarchie de rubriques pour les thèmes
Le rendu de la sélection thématique

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 :

agenda.zip
Les fichiers pour mettre en place l’agenda

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

Notes

[1Vérifiez que vous avez configuré votre site pour gérer ce type de date supplémentaire.

[2Voir la documentation de INCLURE : http://www.uzine.net/article1828.html

Discussion

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

  • 3

    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

    • Nicolas Hoizey

      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.

      C’est en tout cas ce que je fais.

      Mais ne pourrait-on pas faire comme le propose robert dans son calendrier séquentiel. cf http://www.uzine.net/spip_contrib/a... C’est-à-dire utiliser les deux dates : #DATE et #DATE_RUB comme date de début et date de fin ?

      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

  • 2

    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

    • Nicolas Hoizey

      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.

      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 ?

      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.

      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

  • 1

    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

  • 1

    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

    Répondre à ce message

  • 8
    Nicolas Hoizey

    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

    • Nicolas Hoizey

      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

    • Nicolas Hoizey

      As-tu lu l’article au moins ???

    • Nicolas Hoizey écrivait (un peu agacé, quand même) :
      « 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.

    • Nicolas Hoizey

      Nicolas Hoizey écrivait (un peu agacé, quand même) : « As-tu lu l’article au moins ? ? ? »

      Moi agacé ? Bon, oui ... ;)

      Non. Je l’avoue. Pas en détails.

      Ah bin je vais expliquer à nouveau ici ce qui y est déjà alors ...

      J’utilise ce chouette script depuis un moment déjà

      Bin oui, mais justement, il y a eu des modifications.

      et en y regardant en diagonale, tout me paraissait « entendu »...

      L’article est là depuis un certain temps, non ?

      Depuis le 9 décembre seulement !

      Je rappelle l’URL à tout hasard : http://www.gasteroprod.com/2003/12/09/320.html

    • Nicolas Hoizey

      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

  • 7
    Olivier F

    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)

    • Nicolas Hoizey

      As-tu bien utilisé la date de publication antérieure ?

    • Olivier

      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.

    • Nicolas Hoizey

      Et tu as bien mis l’id de ta rubrique (15 donc) partout où nécessaire ?

    • olivier

      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)

    • Nicolas Hoizey

      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 :

  • 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