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

  • 5

    La contrib ne marchant pas chez moi (mkdate), je l’ai modifié. Après pas mal de galère, ça marche.
    Voici le code que j’ai mis à la place de la boucle evenements

    <BOUCLE_evenements(ARTICLES){branche}>
    	<?php
    	$date = ereg_replace("^([0-9]{4})-([0-9]{2})-([0-9]{2}).*$", "\\1\\2\\3", '#DATE_REDAC');
    	$az=substr($date,0,4);
    	$mz=substr($date,4,2);
    	$jz=substr($date,6,2);
    
    	if ($date > date("Ymd", mktime(0, 0, 0, $M, -7, $Y)) && $date < date("Ymd", mktime(0, 0, 0, $M + 1, 7, $Y))) {
    		if (!isset($events[$date])) {
    			$events[$date] = array();
    		}
    		$events[$date][] = array('link' => '#URL_ARTICLE', 'title' => '[(#TITRE|texte_script)]', 'logo' => "#LOGO_ARTICLE_RUBRIQUE");
    		$chapo=intval('#CHAPO');
    		while ($chapo>1) {
    	$chapo=$chapo-1;
    	$datezzz=date("Ymd",mktime(0, 0, 0, $mz,$jz+$chapo,$az));
    	$events[$datezzz][] = array('link' => '#URL_ARTICLE', 'title' => '[(#TITRE|texte_script)]', 'logo' => "[(#LOGO_ARTICLE_RUBRIQUE|left)]");
    	}
    	}
    	?>
    </BOUCLE_evenements>

    Cela permets d’afficher 1 article sur plusieurs jours. Il suffit d’indiquer le nombre de jours à afficher dans le champ Chapeau.

    Merci Mr Michel Lo pour cette modif en tout cas.
    Il faut noter qu’elle ne fonctionne pas sur la nouvelle version du calendrier.

    • Bravo pour ce superbe agenda !

      J’ai juste un souci lorsque mon événement de plusieurs jours (définit dans le chapeau) couvre plusieurs mois, il ne s’affiche dans l’agenda que le premier mois et à partir du mois suivant plus rien... Est-ce aussi le cas chez vous ou un plutot un bug chez moi ??? Merci d’avance

    • Un petit complément / cette contrib qui m’a bien servie : il est possible de préciser dans le chapo les jours précis de l’affichage des événement du calendrier, simplement en indiquant chaque jour en plus de la date du début de l’événement, séparé d’une virgule.
      Le code (dans la boucle événements) :

      <?php<br>
          $date = ereg_replace("^([0-9]{4})-([0-9]{2})-([0-9]{2}).*$", "\\1\\2\\3", '#DATE');<br>
          $az=substr($date,0,4);<br>
          $mz=substr($date,4,2);<br>
          $jz=substr($date,6,2);<br>
      <br>
          if ($date > date("Ymd", mktime(0, 0, 0, $M, -7, $Y)) && $date < date("Ymd", mktime(0, 0, 0, $M + 1, 7, $Y))) {<br>
              if (!isset($events[$date])) {
                  $events[$date] = array();
              }<br><br>
              $events[$date][] = array('link' => '#URL_ARTICLE', 'title' => '[(#TITRE|texte_script)]', 'logo' => "#LOGO_ARTICLE_RUBRIQUE");<br><br>
              $chaine= ('#CHAPO');<br>
              if (strlen($chaine)!=0) {  <br>
                  $tableau=explode(",", $chaine);<br>
                  for($i=0;$i<sizeof($tableau);$i++){<br>
                      $tableau[$i] = intval($tableau[$i]);
                  }<br><br>
                  for ( $i=0; $i < sizeof($tableau); $i++ ) {<br>
                      $datechapo= $tableau[$i] ;<br>
                      $datezzz=date("Ymd",mktime(0, 0, 0, $mz,$datechapo,$az));<br>
                      $events[$datezzz][] = array('link' => '#URL_ARTICLE', 'title' => '[(#TITRE|texte_script)]', 'logo' => "[(#LOGO_ARTICLE_RUBRIQUE|left)]");<br>
                  }<br>
              }<br>
          }<br>
          ?>
    • Bon, perso, un événement ne s’affiche pas pendant plus d’1 mois. Un peu contraignant mais bon.

      Sinon, pour ce que tu proposes, si on pase en mode « réalité concrète », que faut il mettre dans le champ chapo alors ???

    • il suffit de mettre le jour de chaque événement, séparé par une virgule.
      ex : 15,16,21,22,26
      Inutile de préciser la première date qui est déja dans la première partie du code (#DATE). Par contre, ça ne résout pas le pb des événements qui chevauchent plusieurs mois.

    • Bonjour :
      j’aimerai pouvoir utiliser cet astuce, mais j’obtiens ce message :
      Parse error : parse error, unexpected T_LNUMBER in c :\archivos de programa\easyphp\www\spip\CACHE\2\agenda-12.c1483b.NEW on line 21

      Merci d’avance et vive SPIP :))

    Répondre à ce message

  • Excellente contrib’ ... que j’utilise, depuis peu sur mon site (en 1.8 beta 2), en l’ayant au préalable modifiée pour mes besoins persos (essentiellement l’apparence).

    Juste une question en passant, dans le cas, où l’agenda sert uniquement à écrire des articles « en masse » avec simplement Titre + Sous Titre. Il s’avère laborieux de vouloir remplir l’agenda d’une quinzaine de rendez vous en quelques minutes.
    Quelqu’un aurait-il quelques contribs à ce sujet ? Sinon, et bien, je m’en occupe, ça s’avère impératif pour la bonne marche de mon site.

    Merci nicolas pour cet agenda.

    Répondre à ce message

  • J’ai installé l’agenda dans mon site spip en construction, lorsque je clique sur la rubrique agenda, la page s’ouvre, mais...il n’y a que l’agenda, plus de menu à gauche, plus rien exepté l’agenda. Alors j’en déduis qu’il me manque une instruction qqpart, mais où ? Où sont passés mes menus si bien alignés, il faut faire « retour » pour atteindre à nouveau la page d’accueil...

    Répondre à ce message

  • Bravo pour ce superbe agenda !

    J’ai juste un souci lorsque mon événement de plusieurs jours (définit dans le chapeau) couvre plusieurs mois, il ne s’affiche dans l’agenda que le premier mois et à partir du mois suivant plus rien...
    Est-ce aussi le cas chez vous ou un plutot un bug chez moi ???
    Merci d’avance

    Répondre à ce message

  • Bonjour,
    J’ai installé d’abord cet agenda en local pour l’essayer : Pas de problème, ça marche très bien.
    Seulement, quand je veux le publier sur mon site, ça ne marche plus :
    -  Le tableau s’affiche bien, mais pas les évènements.
    -  Les sous-rubriques s’affichent également(dans le menu sur le côté, pas sur le tableau) sauf si les articles qu’elles contiennent sont publiés avec une date postérieure à la date courante.

    Je ne comprend vraiment pas pourquoi,est-ce que quelqu’un pourrait m’aider ?

    Je serait vraiment désolé de ne pas pouvoir utiliser une si bonne contrib.

    Merci d’avance pour vos réponses.

    Répondre à ce message

  • Enooooorme merci à nicolas, cette agenda est vraiment très pratique !
    Merci également à Michèle Lo qui m’a permis d’avoir les évenements sur plusieurs jours !
    Continuez, c’est vraiment super ce que vous faîtes !

    Répondre à ce message

  • 9
    Michel Lo

    Bravo à Nicolas pour ce calendrier qui est une très bonne idée.

    Je l’ai installé et cela a l’air de fonctionner magnifiquement bien, mais en pratique, il y avait deux défauts qui m’ont amené à devoir ajuster mon spip pour avoir un fonctionnement qui correspondait à mes besoins.

    1. Lorsque j’ajoute une date dans le calendrier, je ne veux pas obligatoirement que cela crée un article dans le sommaire.
    Pour éviter cela, j’ai ajouté un filtre dans la boucle sommaire {age>60} qui fait que tous les articles vieux de plus de deux mois ne sont pas affichés. Il me suffit de demander une publication avec une date antérieure de plus de deux mois pour qu’elle apparaisse dans le calendrier (à la « date de publication antérieure » comme le prévoit le squelette de Nicolas) mais pas dans la page sommaire.

    2. Je suis tombé sur un truc plus emmerdant qui est l’événement qui dure plusieurs jours. Le cas typique est celui des vacances...

    Pour ça, j’ai décidé d’utiliser le chapo, puisque je peux décrire tous les événements par le texte.

    Donc, il faut que le chapo commence par le nombre de jours de durée. Mais il peut ensuite comporter d’autres caractères, la durée est prise uniquement au premier chiffre (par exemple « 3 jours d’absence »). ATTENTION, il faut bien que le chapeau commence par le chiffre (« durée de 3 jours » est équivalent à 0 jour, ce qui fait donc un événement de 1 jour).

    Et puis bien sûr, pour que cela fonctionne, il faut modifier un peu le squelette de Nicolas : la boucle BOUCLE_evenements doit être remplacée par

    <BOUCLE_evenements(ARTICLES){branche}>
    <?php
      $date = ereg_replace("^([0-9]{4})-([0-9]{2})-([0-9]{2}).*$", "\\1\\2\\3", '#DATE_REDAC');
      $az=substr($date,0,4);
      $mz=substr($date,4,2);
      $jz=substr($date,6,2);
    
      if ($date > date("Ymd", mkdate($M, $D - 31, $Y)) && $date < date("Ymd", mkdate($M, $D + 31,$Y)))    {
          if (!isset($events[$date])) {
             $events[$date] = array();
          }
          $events[$date][] = array('link' => '#URL_ARTICLE', 'title' => '[(#TITRE|texte_script)]', 'logo' => "[(#LOGO_ARTICLE_RUBRIQUE|left)]");
          $chapo=intval('#CHAPO');
         while ($chapo>1) {
            $chapo=$chapo-1;
            $datezzz=date("Ymd",mkdate($mz,$jz+$chapo,$az));
            $events[$datezzz][] = array('link' => '#URL_ARTICLE', 'title' => '[(#TITRE|texte_script)]', 'logo' => "[(#LOGO_ARTICLE_RUBRIQUE|left)]");
         }
      }
    ?>
    </BOUCLE_evenements> 

    Bon amusement

    Michel Lo

    • mkdate n’est pas connu de mon heasyphp.

    • Nicolas Hoizey

      mkdate était une fonctions que j’avais créée dans l’ancienne version de l’agenda.

      La nouvelle utilise mktime.

      En gros, ces deux instructions sont équivalentes :

      $t = mktime(0, 0, 0, $mois, $jour, $annee);
      $t = mkdate($mois, $jour, $annee);
    • Nicolas Hoizey

      1. Lorsque j’ajoute une date dans le calendrier, je ne veux pas obligatoirement que cela crée un article dans le sommaire. Pour éviter cela, j’ai ajouté un filtre dans la boucle sommaire age>60 qui fait que tous les articles vieux de plus de deux mois ne sont pas affichés.

      Il serait à mon avis plus simple de filtrer le secteur de l’agenda, comme je le fait sur Gastero Prod ...

      2. Je suis tombé sur un truc plus emmerdant qui est l’événement qui dure plusieurs jours.

      Avec les champs EXTRA qui viennent d’être ajoutés, on peut faire mieux.

      Je ne suis pas trop pour ces champs, ou plutôt pour la méthode d’implémentation, mais s’ils existent, autant les utiliser.

    • Philippe Rousselot

      Bonjour,

      mon agenda avance, c’est super !

      je revient sur le filtrage des message
      pourriez vous être plus explicite.
      comment faire pour avoir une date ne correspondant pas à un article et avoir une date ne correspondant pas à un article ?

      ou ce trouve cette boucle sommaire ?
      comment se fait le fltrage dans l’agenda ?
      merci d’avance

      Philippe Rousselot

       
      1. Lorsque j’ajoute une date dans le calendrier, je ne veux pas obligatoirement que cela crée un article dans le sommaire. Pour éviter cela, j’ai ajouté un filtre dans la boucle sommaire age>60 qui fait que tous les articles vieux de plus de deux mois ne sont pas affichés.

      Il serait à mon avis plus simple de filtrer le secteur de l’agenda, comme je le fait sur Gastero Prod ...
       

    • comment faire pour avoir une date ne correspondant pas à un article et avoir une date ne correspondant pas à un article ?

      Euh ... moi pas comprendre la question ... ;-)

    • hoops !!

      comment faire pour avoir une date ne correspondant pas à un article et avoir une date correspondant à un article ?

      ex : les RMLL de Metz meritent un article associé à la date sur l’agenda, le fait que j’avertisse que je parts en vacances ne le merite pas. donc je veux seulement voir le RMLL parmis les articles

      et le coup des 60 jours, j’ai compris mais je ne sais pas quoi en faire

      Merci

      Philippe R.

    • Nicolas Hoizey

      comment faire pour avoir une date ne correspondant pas à un article et avoir une date correspondant à un article ?

      C’est pas franchement plus clair ...

      ex : les RMLL de Metz meritent un article associé à la date sur l’agenda, le fait que j’avertisse que je parts en vacances ne le merite pas. donc je veux seulement voir le RMLL parmis les articles

      Bin il suffit de mettre le premier dans l’agenda mais pas le second.

      Je ne vois vraiment pas où est le problème ...

      et le coup des 60 jours, j’ai compris mais je ne sais pas quoi en faire

       ???

    • cbondesign

      Bonjour. J’ai installé la nouvelle version de l’agenda. Cela marche sans problème.
      Par contre, mettre 1 événement sur plusieurs jours est pour mon client assez important.
      Votre modification utilisant le champ Chapo ne semble pas fonctionner avec la nouvelle version de l’agenda. Ou alors, je n’ai pas su quoi remplacer par quoi.

      Auriez vous une idée permettant d’implémenter cette fonction sur la nouvelle version du calendrier ?

      Merci pour votre réponse

    • Ca marche pas. J’ai essayé avec les 2 versions du callendrier (qui fonctionne), cette modif ne marche pas chez moi.
      Erreur à la ligne if ($date > date(« Ymd », mkdate($M, $D - 31, $Y)) && $date < date(« Ymd », mkdate($M,

      Si je mets mktime à la place, y a plus d’erreur, mais l’article qui devrait être affiché sur 10 jours (chiffre 10 dans le chapo) reste affiché sur 1 jour.
      Cette fonction est très importante pour mes clients. Si vous avez une idée, ce serait super.
      Merci d’avance

    Répondre à ce message

  • Bonjour,

    Les dates avec cet agenda s’affichent ’ 1 janvier 1970 ’ pourquoi ? :(
    http://www.caj-flc.org

    QQ’un pourrait-il me dire c’est koi ki marche pas.

    Merci d’avance et vive SPIP :))

    Siegfried - siegfried.burgeot@free.fr

    Répondre à ce message

  • Siegfried

    Bonjour à tous,
    J’ai un gros petit problème avec les dates sur mon site, les dates s’affichent comme ça :
    « 1 janvier 1970 » je crois savoir que c’est la date la + vieille en PHP, mais en tous les cas aucun événement ne date de 1970 ... lol ....

    Pourriez vous m’aider, merci d’avance et @ bientôt.

    - siegfried.burgeot@free.fr

    http://www.caj-flc.org

    Répondre à ce message

  • j’ai un pb...

    Apres avoir fait ce que je pense etre corect, j’ai deux messages d’erreurs :

    Parse error : parse error, unexpected ’ ?’ in c :\easyphp1-7\www\biospip\CACHE\a\agenda-1.5895cb.NEW on line 350

    Parse error : parse error, unexpected ’ ?’ in c :\easyphp1-7\www\biospip\CACHE\9\agenda-2.d13ca7.NEW on line 350

    pouvez vous m’aider !!!!!

    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