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

  • BRAVO !

    que dire de plus, ah oui que spip est un merveilleux outil.

    sinon que l’agenda intégré avec bloOg, c’est plutôt sympa.

    Répondre à ce message

  • zamanika

    Merci pour cette contribution ! beau travail !!!

    Répondre à ce message

  • 1

    Bonjour,
    Je reste (malgré un week-end entier à tester !) scotché sur le problème des évènements multidates.
    J’ai modifié la boucle évenement comme suit :

    <?php
    
    $datedeb = ereg_replace("^([0-9]{4})-([0-9]{2})-([0-9]{2}).*$", "\\1\\2\\3", '#DATE');
    
    $ADEB = intval(substr($datedeb,0,4));
    
    $MDEB = intval(substr($datedeb,4,2));
    
    $JDEB = intval(substr($datedeb,6,2));
        $datefin = ereg_replace("^([0-9]{4})-([0-9]{2})-([0-9]{2}).*$", "\\1\\2\\3", '#DATE_REDAC');
    
    $AFIN = intval(substr($datefin,0,4));
    
    $MFIN = intval(substr($datefin,4,2));
    
    $JFIN = intval(substr($datefin,6,2));
    
    if ($MFIN=="") {
    
    $MFIN = $MDEB;
    
    $JFIN = $JDEB;
    
    $AFIN = $ADEB;
    
    }
    
    $AP= $ADEB;
    
    $MP= $MDEB;
    
    $JP = $JDEB;
    
    while($AP<$AFIN+1) {
    
    while($MP<$MFIN+1) {
    
    while($JP<$JFIN+1) {
    
    $date=date("Ymd", mkdate($MP, $JP, $A));
    
        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|texte_script)]', 'logo' => "#LOGO_ARTICLE_RUBRIQUE");
    
        }
    
        }
    
        $JP++;
    
    }
    
    $MP++;
    
    }
    
    $AP++;
    
    }
    
        ?>

    J’ai toujours la même erreur « time exceeded ».
    J’en déduis donc que la boucle est erronéee, mais je ne sais pas d’où vient l’erreur.
    Qui pourrait m’aider (PAF autorisée... :-).
    Merci par avance,

    Vincent

    • Bonjour,
      J’ai eu le même problème que toi, et je l’ai résolu en supprimant la boucle récursive du fichier agenda_themes.html

      J’espère que cela pourra t’aider ;

      @+

      Stephanie

    Répondre à ce message

  • 1
    Fabrice WANG

    Super cet agenda, toutefois je n’arrive pas assez à bidouiller pour afficher un petit agenda (comme sur le site de gasteroprod).

    En fait je bloque sur l’affichage en lien du jour où j’ai des événements. J’ai comme affichage la date du jour générée par le calendrier et celle du jour de la publication.

    @@$case .= ’@@br />’.$event[’logo’].’@@a href=« ’.$event[’link’].’ »>’.$event[’title’].’@@/a>’ ;

    Cette ligne en fait ne devrait m’afficher en lien que la date du jour.

    Si quelqu’un a une réponse ou un bout de code pour m’aider ce serait sympa.

    Ce script est trop génial !

    • pascal-emmanuel

      Salut,

      Je n’arrive pas à faire apparaître dans ma page sommaire le petit agenda comme sous gasteroprod. Néophyte, quelqu’un peut-il me donner un coup de main. Merci

    Répondre à ce message

  • FAUTRERO Pascal

    Génial cet agenda...!!!!Bravo aux auteurs de cette petite merveille. Je vous encourage fortement à développer cet outil. Merci Beaucoup. Je m’en sers sur le site de mon collège pour fixer voyages, commissions, conseils...

    Répondre à ce message

  • 1
    Ph Matet

    Bonjour,

    j’ai installé un site avec spip 1.7 et bio-squelettes 2.6, avec agenda - excellent d’ailleurs.

    Je voudrais pouvoir signaler dans l’agenda un évènement décrit par un article dans une autre rubrique : actuellement, il me faut 2 articles ; un dans l’agenda, un dans la rubrique où je veux que l’article figure ; je voudrais donc que le module de recherche des dates de publication antérieures balaie TOUTE la base et pas seulement la rubrique Agenda... mais j’y arrive pas, parce que la routine php qui affiche le calendrier est à l’intérieur de la boucle principale ; c’est ok quand cete boucle est effectuée 1 fois (pour la rubrique Agenda) mais quand elle est effectuée pour chaque rubrique... ca ne marche plus.
    Est-ce quelqu’un a une idée ??? merci d’avance .

    au passage, je n’ai pas trouvé de doc sur le critère de boucle {branch} ?

    Répondre à ce message

  • Ph Matet

    Bonjour,

    j’ai installé un site avec spip 1.7 et bio-squelettes 2.6, avec agenda - excellent d’ailleurs.

    Je voudrais pouvoir signaler dans l’agenda un évènement décrit par un article dans une autre rubrique : actuellement, il me faut 2 articles ; un dans l’agenda, un dans la rubrique où je veux que l’article figure ; je voudrais donc que le module de recherche des dates de publication antérieures balaie TOUTE la base et pas seulement la rubrique Agenda... mais j’y arrive pas, parce que la routine php qui affiche le calendrier est à l’intérieur de la boucle principale ; c’est ok quand cete boucle est effectuée 1 fois (pour la rubrique Agenda) mais quand elle est effectuée pour chaque rubrique... ca ne marche plus.
    Est-ce quelqu’un a une idée ??? merci d’avance .

    au passage, je n’ai pas trouvé de doc sur le critère de boucle branch ?

    Répondre à ce message

  • 5

    Bonjour

    Je viens de me mettre en place un agenda en suivant les conseils délivrés ici-même (voir le lien vers le site de test en dessous)

    J’ai donc une rubrique « Agenda » à la racine de mon site, rubrique divisée en sous-rubriques : « Musique », « Cirque », « Multimédia », etc etc

    Pour insérer un événement je rédige un nouvel article que je place dans une sous-rubrique et que je publie en indiquant un date de publication antérieure. Pas de problème lorsque je rentre mon premier événement...

    Le hic apparaît lorsque je rentre un deuxième événement : je me retrouve avec deux tableaux sur ma page agenda, l’un et l’autre ne contenant qu’un événement !

    Quelqu’un aurait-il une idée pour régler ce problème ?
    Merci beaucoup !

    ps : j’utilise SPIP 1.6 et je suis hébergé chez OVH

    • Salut,

      J’ai rencontré le même problème lors de mes premiers pas avec les fichiers. J’intégrai et l’include et le code de l’agenda dans la même page. Mal m’en a pris car il est bien décris que l’on ne place que @@INCLURE(agenda.php3)id_rubrique>

      Ceci expliquerai la présence de tes agendas.

    • Heu je vois pas trop ce qu’il faut modifier dans le code de ma page rubrique-10.html... Comme le copié/collé de ce code donnerait des trucs pas très catholiques dans ce message (tout est interprété par le site ! :os), est-il possible que je t’envoye un aperçu de la chose via ton mail ?

    • Fabrice WANG

      Bien sûr ! Envoie ton fichier

    • Je suis allée voir ton squelette rubrique-10.html

      Je ne comprends pas pourquoi tu as inclu les deux lignes
      INCLURE
      à l’intérieur d’une boucle (RUBRIQUES) ???

      En faisant ça, il est normal que tu aies autant d’agendas que d’événements...

      Regarde le code proposé dans le squelette : les boucles se situent avant les INCLURE
      (j’ai voulu te recopier le bon code dans ce message, mais mon navigateur interprète ça comme du code, et ça ne passe pas).

    • Ah oui effectivement il suffisait de déplacer les INCLURE pour n’obtenir qu’un agenda... (je débute en SPIP et ne comprends pas forcément tout très bien ;)

      Merci beaucoup pour votre aide commune, et pour pour faire écho aux autres posts encore chapeau pour cette super contrib’ !!!

    Répondre à ce message

  • Répondre à ce message

  • Vraiment super, et simple à installer, cet agenda. Un très grand merci.

    Juste une question : certaines des dates renvoient sur un article, mais pour d’autres, je voudrais juste qu’elles soient mentionnées, sans que cela fasse de lien sur l’article.
    Est-ce qu’il est possible que le lien n’apparaisse pas lorsque le champ « texte » de l’article est vide ?

    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