SPIP 3, Agenda et FullCalendar

Ceci est une « contribution pédagogique », qui montre par l’exemple comment développer une nouvelle fonctionnalité pour SPIP.

Depuis SPIP 3, l’affichage d’un agenda sous forme de calendrier par jour/semaine/mois à changé. Les filtres |agenda_memo et apparentés sont désormais obsolètes. Il en est de même pour les filtres agendafull_memo et apparentés du plugin Agenda.

Désormais, l’affichage d’un calendrier s’appuie sur la librairie javascript FullCalendar. Voici un tutoriel pour comprendre comment s’en servir avec Agenda 3.0.

Pour une première approche, vous pouvez utiliser le plugin Agenda Fullcalendar facile.

Attention : le présent tutoriel n’est plus adapté aux version de SPIP > 3.2, car cette dernière change la version de fullcalendar utilisée.. Vous pouvez utiliser la nouvelle version du tutoriel.

Souhait

Nous souhaitons afficher tous les événements (publiés) du site sous forme calendaire, en proposant d’abord un affichage par mois, avec possibilité de basculer en affichage par semaine ou par jour.

Agenda souhaité au final

Pré-requis

  • SPIP 3.0.x, en ayant conservé l’organiseur dans plugins-dist.
  • Plugin Agenda 3.6.11 minimum.
  • Compréhension de la mécanique des squelettes de SPIP.
  • Quelques évènements à afficher.

Vous n’avez pas besoin d’installer la librairire FullCalendar : elle est livrée avec SPIP.

Principe de base

Pour afficher notre agenda nous allons :

  1. créer un squelette agenda.html, avec un div dont l’attribut id est agenda.
  2. appeler dans le squelette le script fullcalendar et ses feuilles de styles.
  3. utiliser ce script pour afficher l’agenda dans dans la div#agenda.
  4. créer un squelette agenda.json.html fournissant au script les données à afficher dans l’agenda.

Fichiers manipulés

 
Dans cet article nous manipulons deux fichiers squelettes : 

  • agenda.html (qui contient le code nécessaire à l’affichage du calendrier).
  • agenda.json.html (qui nous permet de générer une liste d’événements compatible avec le script fullcalendar).

Si l’un de ces squelette existe déjà, je vous invite à utiliser le mécanisme de surcharge de SPIP.

Création du squelette

Il nous faut créer un squelette agenda.html complet (à savoir une page SPIP classique avec les balises <head><body> etc), dans lequel nous mettons un div dont l’attribut id est agenda à l’endroit où nous souhaitons que l’agenda s’affiche.

Au dessus de ce div, nous allons appeler :

  • la version compressée du script fullcalendar
  • les styles associés à ce script.

Pour ce faire, nous utilisons la balise #CHEMIN :

<link rel='stylesheet' type='text/css' href='#CHEMIN{lib/fullcalendar/fullcalendar.css}' />
<script type='text/javascript' src='#CHEMIN{lib/fullcalendar/fullcalendar.min.js}'></script>
<div id="agenda">
</div>

Appel à l’agenda

Nous allons maintenant ajouter les fonctions javascript qui permette d’afficher l’agenda. Pour ce faire, nous allons mettre au dessus du div (cela pourrait être dedans ou en dessous, cela importe peu) le code suivant, que je vais commenter :

<script type="text/javascript">/*<![CDATA[*/
jQuery(document).ready(function() {

	
	jQuery('#agenda').fullCalendar({
			editable: false,
			events: "[(#URL_PAGE{agenda.json})]",
			header: {
				left: 'prevYear,prev,next,nextYear today',
				center: 'title',
				right: 'month,agendaWeek,agendaDay'
			},
			firstDay: 1,
			monthNames:['<:date_mois_1|attribut_html:>','<:date_mois_2|attribut_html:>','<:date_mois_3|attribut_html:>','<:date_mois_4|attribut_html:>','<:date_mois_5|attribut_html:>','<:date_mois_6|attribut_html:>','<:date_mois_7|attribut_html:>','<:date_mois_8|attribut_html:>','<:date_mois_9|attribut_html:>','<:date_mois_10|attribut_html:>','<:date_mois_11|attribut_html:>','<:date_mois_12|attribut_html:>'],
			monthNamesShort:['<:date_mois_1_abbr|attribut_html:>','<:date_mois_2_abbr|attribut_html:>','<:date_mois_3_abbr|attribut_html:>','<:date_mois_4_abbr|attribut_html:>','<:date_mois_5_abbr|attribut_html:>','<:date_mois_6_abbr|attribut_html:>','<:date_mois_7_abbr|attribut_html:>','<:date_mois_8_abbr|attribut_html:>','<:date_mois_9_abbr|attribut_html:>','<:date_mois_10_abbr|attribut_html:>','<:date_mois_11_abbr|attribut_html:>','<:date_mois_12_abbr|attribut_html:>'],
			dayNames:['<:date_jour_1|attribut_html:>','<:date_jour_2|attribut_html:>','<:date_jour_3|attribut_html:>','<:date_jour_4|attribut_html:>','<:date_jour_5|attribut_html:>','<:date_jour_6|attribut_html:>','<:date_jour_7|attribut_html:>'],
			dayNamesShort:['<:date_jour_1_abbr|attribut_html:>','<:date_jour_2_abbr|attribut_html:>','<:date_jour_3_abbr|attribut_html:>','<:date_jour_4_abbr|attribut_html:>','<:date_jour_5_abbr|attribut_html:>','<:date_jour_6_abbr|attribut_html:>','<:date_jour_7_abbr|attribut_html:>'],
			buttonText: {
					today: '<:date_aujourdhui|attribut_html:>',
					month: '<:organiseur:cal_par_mois|attribut_html:>',
					day: '<:organiseur:cal_par_jour|attribut_html:>',
					week: '<:organiseur:cal_par_semaine|attribut_html:>'
			},
			weekMode : 'liquid',
			loading: function(bool) {
				if (bool) $('#calendrier-loading').show();
				else $('#calendrier-loading').hide();
			},
			timeFormat: {
				
				agenda: "H'h'mm{ - H'h'mm}", 
				
				'': "H'h'(mm)" 
			},
			axisFormat: "H'h'(mm)",
			allDayText:'<:organiseur:cal_jour_entier|attribut_html:>',
			columnFormat: {
				month: 'ddd',    
				week: 'ddd d/M', 
				day: 'dddd d/M'  
			},
			titleFormat: {
				month: 'MMMM yyyy',                             
				week: "d [ MMM] [ yyyy]{ '&#8212;' d MMM yyyy}", 
				day: 'dddd d MMM yyyy'                  
			},
			dayClick: function(date, allDay, jsEvent, view) {
				if(view.name=='month'){
					$('.fc-button-agendaWeek').click();
					$('#calendrier').fullCalendar( 'gotoDate', date );
				}
				else
					if(view.name=='agendaWeek'){
						$('.fc-button-agendaDay').click();
						$('#calendrier').fullCalendar( 'gotoDate', date );
					}
			},
			isRTL : [(#LANG_DIR|=={rtl}|?{true,false})]
	})

});
/*]]>*/</script>
  • l. 2 jQuery(document).ready(function() signifie qu’à la fin du chargement du document, le navigateur va exécuter la fonction dans les accolades qui suivent.
  • l. 5 $('#agenda').fullCalendar signifie que nous allons demander à javascript de modifier le div dont l’id est égale à agenda pour y mettre à la place .…l’agenda.
  • Le code entre parenthèse puis accolade correspond aux options passées à l’agenda (l. 5-59) :
    • l. 6 : on ne peut éditer les évènements depuis l’agenda.
    • l. 7 : on récuperera la liste des évènements via un squelette agenda.json.html, nous détaillerons ce squelette dans la partie suivante
    • l. 8-12 : qu’affiche-t-on dans l’entête de l’agenda ? :
      • l. 9 : à gauche, on met les boutons de navigation par mois/semaines/jours (selon le type de calendrier) et par années (dans tout les cas).
      • l. 10 : au centre, on affiche le titre de l’agenda, correspondant à la période affichée (par ex. « Août 2012 »).
      • l. 11 : à droite, on affiche la bascule vers l’agenda en mode mois, semaine ou jour.
    • l. 13 : le premier jour de la semaine est le lundi (=1)
    • l. 14 : noms des mois, définis avec les chaînes de langues de SPIP.
    • l. 15 : noms des mois en abrégé.
    • l. 16 : noms des jours.
    • l. 17 : nom des jours en abrégé.
    • l. 18-23 : textes des boutons.
    • l. 24 : selon les mois, on affichera 4, 5 ou 6 semaines, mais en faisant varier visuellement la hauteur des semaines, pour avoir un mois dont la hauteur est constante. Je renvoie à la documentation sur weekMode.
    • l. 25-27 : permet d’afficher un contenu le temps que l’agenda se charge. Nous en parlerons plus loins.
    • l. 29-34 : formatage des heures dans l’agenda :
      • l. 31 : lorsqu’on est par semaine ou par jour, on affiche l’heure et les minutes.
      • l. 33 : dans les autres cas, juste l’heure.
    • l. 35 : formatage des heures sur l’axe vertical (pour l’affichage par jours).
    • l. 36 : texte indiquant qu’un événement dure une journée entière.
    • l. 37-41 : formatage des dates dans les entêtes de colonnes :
      • l. 38 : pour l’affichage par mois.
      • l. 39 : pour l’affichage par semaines.
      • l. 40 : pour l’affichage par jours.
    • l. 42-46 : titre de l’agenda :
      • l. 43 : lors de l’affichage par mois.
      • l. 44 : lors de l’affichage par semaines.
      • l. 46 : lors de l’affichage par jours.
    • l. 47-57 : action à executer lorsqu’on clique sur un jour.
    • l. 58 : notre agenda doit-il se lire de gauche à droite ou de droite à gauche ?

D’autres options sont bien sûr possible : on se reportera à la documentation de FullCalendar.

Sélection des évènements à afficher

Pour pouvoir afficher les évènements, il va falloir nous fabriquer un squelette agenda.json.html (cf. l. 7) qui retournera les évènements qui nous intéreressent sous forme de donnée JSON.

La page spip.php?page=agenda.json sera automatiquement appelée par FullCalendar, qui lui passera deux arguments, variant selon la période demandée :

  • start, correspondant au timestamp de la date de début.
  • end, correspondant au timestamp de la date de fin.

Dans le squelette agenda.json.html correspondant à cette page, nous pourrons récuperer ces informations via : #ENV{start} et #ENV{end} (voir mon article sur la balise #ENV). On pourrait éventuellement passer d’autres arguments, en appliquant le filtre |parametre_url sur #URL_PAGE{agenda.json}.

Voilà un squelette agenda.json.html basique :

#HTTP_HEADER{Content-Type: application/json; charset=#CHARSET}
[<BOUCLE_evenements(EVENEMENTS){', '}{par date_debut}	
{agendafull date_debut,date_fin, periode,
	#VAL{Y}|date{#ENV{start}}, #VAL{m}|date{#ENV{start}},     #VAL{d}|date{#ENV{start}},
	#VAL{Y}|date{#ENV{end}}, #VAL{m}|date{#ENV{end}}, #VAL{d}|date{#ENV{end}}}
	>
					[(#ARRAY{id,#ID_EVENEMENT,
title,[(#TITRE|html2unicode|unicode2charset)],
allDay,[(#HORAIRE|=={non}|?{#EVAL{true},#EVAL{false}})],
start,#DATE_DEBUT,
end,#DATE_FIN,
url,#URL_ARTICLE,
description,[(#DESCRIPTIF|html2unicode|unicode2charset)]}|json_encode)]
</BOUCLE_evenements>]

Je commente rapidement ce squelette :

  • l. 1. On demande à SPIP de :
    • Ne pas insérer de boutons d’administration.
    • Dire au navigateur que la page retournée est du json, et fournir le charset.
    • l. 2 et l .15, les crochets servent à indiquer que nous retournons plusieurs objets JSON, chacun correspondant à un évènements.
    • l. 2 nous bouclons sur les évènements. Entre chaque élèment de la boucle, nous affichons une virgule ({", "}). Nous trions par date de début : ceci servira plus loin lors de l’affichage des données sans Javascript.
    • l. 3-5 pour sélectionner les évènements, nous utilisons le critère agendafull. Les options de ce critère nous indique :
      • date_debut : que le champ date_debut servira pour repérer … date de début de sélection.
      • date_fin : que le champ date_fin servira pour repérer … date de fin de sélection.
      • periode que la période sélectionné sera déterminée par les options suivantes.
      • #VAL{Y}|date{#ENV{start}}, #VAL{m}|date{#ENV{start}},     #VAL{d}|date{#ENV{start}} que le début de la période correspond à la date passée dans #ENV{start}. La syntaxe un peu absconse que vous voyiez issu permet d’extraire, respectivement, l’année, le mois et la jour depuis un timestamp.
      • #VAL{Y}|date{#ENV{end}}, #VAL{m}|date{#ENV{end}}, #VAL{d}|date{#ENV{end}}</cpde> que la fin de la période correspond à la date passée dans <code>#ENV{end}.
  • l. 7-14 : nous remplissons un tableau SPIP via #ARRAY, puis nous le transformons en objet JSON, via le filtre ||json_encode. Ce tableau comprend les entrées suivantes :
    • id : identifiant unique pour FullCalendar. Ca tombe bien, SPIP attribut un identifiant à chaque évenement : #ID_EVENEMENT
    • title : le titre. On transforme les entité HTML en caractère unicode (|html2unicode) puis on s’assure de proposer des données avec le bon charset (|unicode2charset).
    • allDay : on précise si l’évènement dure toute la journée. Utilisée pour l’affichage par jour. Pour préciser cela, on s’appuie sur le champ #HORAIRE qui contient justement cette information. On utilise #EVAL pour indiquer qu’on insére une valeur booléenne et non pas textuelle.
    • start : date de début. On garde le format SQL.
    • end : date de fin. On garde le format SQL.
    • url : lien. Pour le coup, on renvoie vers l’article.
    • description : description de l’évènement. Là encore, on converti en Unicode, puis dans le charset correct.

À noter que l’on pourrait définir d’autres données pour chaque évènement : on se refera à la documentation de l’objet Event de FullCalendar. Par exemple, on pourrait indiquer des classe HTML en fonction de la rubrique.

Il vous faut également créer un fichier agenda.json_fonctions.php contenant les lignes suivantes :

<?php

include_spip('inc/json');
?>

Ceci assurera que le filtre json_encode est bien chargé [1].

Et pour les personnes sans Javascript ?

Et oui, tout le monde n’a pas de Javascript. Comment on fait alors ? La solution consiste à afficher un calendrier sous forme de liste dans un div dont l’id est calendrier-loading. Si Javascript est activé, FullCalendar va masquer ce div.

Comme on a déjà fabriqué une boucle dans le squelette agenda.json.html, nous allons nous en reservir, afin d’éviter de dupliquer les critères. Pour ce faire, nous allons utiliser la boucle DATA de SPIP 3.

Nous mettons donc dans le squelette agenda.html :

<B_agenda>
<div id="calendrier-loading">
<p class="pagination">#PAGINATION</p>
<BOUCLE_agenda(DATA){source json, #PRODUIRE{fond=agenda.json, start=0,end=2147483647,_=#REM|time}}{pagination 15}>
    <dl>
        [<dt><:agenda:evenement_titre:></dt>
        <dd><a href="#VALEUR{url}">(#VALEUR{title})</a></dd>]
        
        [<dt><:agenda:evenement_date:></dt>
        <dd>(#VALEUR{start}|Agenda_affdate_debut_fin{#VALEUR{end},#VALEUR{allDay}|=={true}|?{non,oui}})</dd>]
        
        [<dt><:agenda:evenement_descriptif:></dt>
        <dd>(#VALEUR{description})</dd>]
    </dl>
</BOUCLE_agenda>
<p class="pagination">#PAGINATION</p>
</div>
</B_agenda>
  • l. 1-3 : partie optionnelle avant de la boucle, avec la pagination éventuelle.
  • l. 4 : code de la boucle. Nous bouclons sur des données ((DATA)) au format json ({source json) extrait du fichier produit (#PRODUIRE) par le squelette agenda.json.html avec la valeur de start égale à 0, c’est à dire au 1 janvier 1970 à minuit, et la valeur end égale à 2147483647, c’est à dire à la date maximale gérée par les ordinateurs actuel, le 19 janvier 2038, 3h14m7s [2]. Ainsi, nous sommes sûr de récuperer tout les évènements de l’agenda. L’option _=#REM|time permet de s’assurer de ne pas avoir de cache, puisque nous passons comme argument le moment d’appel (|time). Nous paginons de 15 en 15.
  • l. 5-14 : nous affichons les données pour chaque évènement, via #VALEUR{donne}. Ces données sont tirées du JSON.
  • l. 16 et suivante ; partie optionelle arrière de la boucle.

On obtient alors un agenda, certe sommaire, mais au moins existant sans Javascript :

Agenda pour les personnes sans Javascript

Conclusion

Vous voilà maintenant prêt à avoir un agenda avec FullCalendar. Bien sûr, il y aurait beaucoup de chose à améliorer, cependant cet article aborde déjà beaucoup de notions :
-  produire du JSON avec SPIP.
-  le formatage de FullCalendar.
-  les boucles DATA.

Notes

[1Dans certain cas, que je n’ai pas encore réussi à déterminer précisément, il n’y a pas besoin de cela...

[2Voir l’article sur le bug de l’an 2038.

Discussion

65 discussions

  • Bonjour et bravo pour les détails.
    Je ne suis pas très bon en programmation, j’en ai jamais fait.
    Je travaille en local avec Wamp pour transposer un site existant, et faire des améliorations.
    Je suis sous Spip 3.0.5 Sarka 3.2.10, j’utilise les plugins calendrier_mini 2.0 et Agenda 3.5 pour facilités la tenu à jour d’un agenda d’événements répétitifs qui n’ont pas besoin de grande explication.
    J’ai mis en place, tel que vous le proposez et cela fonctionne correctement, j’ai le mini calendrier qui affiche les événements et la page agenda qui affiche également, mais tout en bleu.
    J’ai 5 catégories d’évènements que j’ai mis dans 5 articles. J’ai créé un groupe mot-clé Couleur_agenda et les mot-clé : Rouge, vert, Or, Bleue, Mauve.
    J’arrive là où je ne sais plus faire : j’ajoute une BOUCLE_mot, comme proposé dans le json. Que dois-je mettre pour que le choix de mes couleurs, s’affiche avec la couleur, bien sûr après je dois avoir mon CSS, cela je dois arrivé à le faire.
    Je n’ai pas trouvé de solution dans l’utilisation des balises et filtres. Merci de votre aide.

    Répondre à ce message

  • 4
    ChristopheD

    Bonjour

    Un grand merci pour ce code, qui m’a permis d’avancer grandement. Il me manque encore un élément : je souhaite transmettre à ma page agenda.html (et au script qui s’y trouve) un certain nombre de paramètres supplémentaires correspondant à différents champs des articles de départ (sous-titre, texte, voire image jointe).

    Or j’ai beau tout essayer, la transmission ne s’effectue pas. Sans doute cela a-t-il à voir avec le mystérieux « paramètre_url » dont vous semblez dire qu’il est là pour ça. Mais je ne pige pas où je suis censé le passer, et sous quelle forme. Pouvez-vous m’en dire un peu plus ?

    Désolé pour le dérangement et merci d’avance...

    • Je pense que vous souhaitez passer l’nformation non pas à agenda.html mais à l’affichage de l’agenda.

      Ou alors votre page agenda.html est spécifique à un article ?

      dans tout les cas, il me faut préciser votre besoin, là je ne suis pas sûr de pouvoir vous répondre correctement

    • ChristopheD

      Je vais tâcher d’être plus précis (au risque de dire une ou deux âneries supplémentaires).
      Le but est de réaliser des infos-bulles dans le calendrier, spécifiques à chaque évènement, et comportant pour cela des informations contenues dans divers champs des articles qui sont à la base de ces évènements. Donc, il s’agit bien de transmettre ces infos au calendrier - mais celui-ci étant conçu par un script se trouvant sur la page agenda.html, il me semblait (à tort ?) que le problème revenait à transmettre ces informations au squelette lui-même.
      Est-ce plus clair à présent ?
      Merci de votre aide !

    • je crois qu’effectivement vous n’avez pas compris le principe de l’agenda sous spip 3.

      J’ai un fichier agenda.html, celui ci va appeler des scripts jquery pour afficher un agenda. Les élèments à afficher dans cette agenda (date, titre etc.) sont pour leur parts issues du fichier json calculé par le squelette agenda.json.html (vous remarquerez que c’est à l’intérieur de ce squelette que ce situe les boucles agenda...

      Donc c’est à l’intérieur de agenda.json.html que vous devriez selectionner les infos à afficher dans l’agenda.

      Dans le cas présent, je suppose que le plus « correcte » serait de mettre les infos tirés des articles dans la partie « description ».

      C’est à dire remplacer le contenu de la ligne 11 du code suivant (repris de l’article)

      #HTTP_HEADER{Content-type:text/javascript;}
      [<BOUCLE_evenements(EVENEMENTS){', '}{par date_debut}	
      {agendafull date_debut,date_fin, periode,
      	#VAL{Y}|date{#ENV{start}}, #VAL{m}|date{#ENV{start}},     #VAL{d}|date{#ENV{start}},
      	#VAL{Y}|date{#ENV{end}}, #VAL{m}|date{#ENV{end}}, #VAL{d}|date{#ENV{end}}}
      	>
      					[(#ARRAY{id,#ID_EVENEMENT,
      title,[(#TITRE|html2unicode|unicode2charset)],
      allDay,[(#HORAIRE|=={non}|?{#EVAL{true},#EVAL{false}})],
      start,#DATE_DEBUT,
      end,#DATE_FIN,
      url,#URL_ARTICLE,
      description,[(#DESCRIPTIF|html2unicode|unicode2charset)]}|json_encode)]
      </BOUCLE_evenements>]

      Là méthode peut être de prendre le code suivant :

      #HTTP_HEADER{Content-type:text/javascript;}
      [<BOUCLE_evenements(EVENEMENTS){', '}{par date_debut}	
      {agendafull date_debut,date_fin, periode,
      	#VAL{Y}|date{#ENV{start}}, #VAL{m}|date{#ENV{start}},     #VAL{d}|date{#ENV{start}},
      	#VAL{Y}|date{#ENV{end}}, #VAL{m}|date{#ENV{end}}, #VAL{d}|date{#ENV{end}}}
      	>
      <BOUCLE_article(ARTICLES){id_evenement}>
      					[(#ARRAY{id,#ID_EVENEMENT,
      title,[(#_evenements:TITRE|html2unicode|unicode2charset)],
      allDay,[(#HORAIRE|=={non}|?{#EVAL{true},#EVAL{false}})],
      start,#DATE_DEBUT,
      end,#DATE_FIN,
      url,#URL_ARTICLE,
      description,[(#TEXTE|html2unicode|unicode2charset)]}|json_encode)]
      </BOUCLE_article>
      </BOUCLE_evenements>]

      Explication de code :
      -  l. 7 on récupere l’article de l’évenement
      -  l. 9 on veut le titre de l’evenement, et non pas le titre de l’article (cf http://programmer.spip.net/Contenu-de-boucles-parentes)
      -  l. 14 on on récupere le texte de l’article.

      J’ignore complètement comment s’affiche ce qui est passé comme « description ». Il faut regarder du côté de la doc de full calendar pour voir comment avoir des infos bulles

    • ChristopheD

      Hem. En fait, j’avais bien compris que c’était depuis agenda.json.html que je devais envoyer les bonnes infos. En fait, j’ai enfin tilté : ce qui coinçait, c’est que j’essayais de récupérer les champs de mes articles... au travers d’une boucle évènement. Forcément, ça ne pouvait pas marcher. On est peu de chose...
      En attendant, merci à vous pour le coup de main !

    Répondre à ce message

  • 3

    Bonjour,
    Merci !
    J’ai suivi le pas à pas depuis le début, collé les lignes de code comme expliqué, tout a marché tout de suite, alors que j’ai essayé une autre solution sans succès depuis hier, tout cela sur un spip 3.05 en local.
    C’est tout à fait par hasard que je suis tombé sur votre article, en recherchant le plugin full calendar que j’ai mis en ligne avec une version 2.1.15 .
    L’appel aux évènements est un plus et à mon sens plus facile à gérer que par le plugin.
    Problème, lorsque l’on veut toucher aux css du calendrier, il faut toucher au plugin-dist, qui effacera la modification à la prochaine mise à jour.
    Je suppose que l’appel à la css doit changer si on veut la sauvegarder et la conserver ?
    Quoiqu’il en soit, encore merci.
    A+Patrick

    Répondre à ce message

  • Bonjour,
    Merci !
    J’ai suivi le pas à pas depuis le début, collé les lignes de code comme expliqué, tout a marché tout de suite, alors que j’ai essayé une autre solution sans succès depuis hier.
    C’est tout à fait par hasard que je suis tombé sur votre article, en recherchant le plugin full calendar que j’ai mis en ligne avec une version 2.1.15 ici
    http://imagesetpeche.free.fr/?FullC...
    L’appel aux évènements est un plus et à mon sens plus facile à gérer que par le plugin.
    Problème, lorsque l’on veut toucher aux css du calendrier, il faut toucher au plugin-dist, qui effacera la modification à la prochaine mise à jour.
    Je suppose que l’appel à la css doit changer si on veut la sauvegarder et la conserver ?
    Quoiqu’il en soit, encore merci.
    A+Patrick

    Répondre à ce message

  • lechenne didier

    en lisant cela
    http://stackoverflow.com/questions/3408723/display-more-text-in-fullcalendar
    j’ai compris comment afficher des champs de texte supplémentaire

    mais j’ai encore une question basique, comment afficher les heures de début et de fin ?

    ps : dans la cadre une mise à jour d’un site spip2 en spip3, je suis moi aussi, un peu dérouté par cette nouvelle dépendance à cette librairie javascript.

    Répondre à ce message

  • 11

    Aie... Impossible de voir mon agenda (dernière version) sous SPIP 3.0.4
    http://www.davduf.net/?page=agenda
    http://www.davduf.net/?page=agenda.jason

    Ne donnent rien.

    J’ai copié collé les deux pages ci-dessus et pourtant, c’est vide.

    Dans l’interface privée, ça marche super.
    Mais dès que j’essaye de visualiser en ligne, impossible :

    Aucun squelette evenement.html n’est disponible...

    Si je fais http://www.davduf.net/?page=agenda

    Aucun squelette agenda.html n’est disponible..

    Une idée ? Merci d’avance !
    J’ai installé la mise à jour 3.6.11

    Merci d’avance !

    • bah en même tps, ton squelette contient juste le code que je met là, et rien autour. Il me paraissait pourtant comme allant de soi que le squelette devait être un squelette complet contenant tout les élèments qu’on attend (head, body etc.). Apparament non... faudra que je reformule ?

      et ne me dis pas que tu ne sais pas faire un squelette complet ;-)

    • Oups... désolé... Je n’avais pas compris.
      Oui, tu as raison : le reformuler dans le texte serait une bonne chose.

      J’ai le calendrier désormais... Hélas, il ne contient rien...
      http://www.davduf.net/?page=agenda&var_mode=calcul
      http://www.davduf.net/bootcamp-a-l-inis-montreal?var_mode=calcul

    • c’est agenda.json et pas agenda.jason.… Il faut que http://www.davduf.net/spip.php?page=agenda.json&start=1343599200&end=1346623200&_=1344720545377 te retourne du json (donc la tu met pour le coup que l’exemple que j’ai donné)

    • Oh, excuse ,-) Et merci !
      J’ai corrigé le agenda.json.html

      Reste que mon calendrier est désespérement vide.
      Et que si je vais sur un évévement (http://www.davduf.net/bootcamp-a-l-inis-montreal), SPIP m’indique toujours « Aucun squelette evenement.html n’est disponible... »

      Comment faire ?

    • A force de cache vidée, ça marche ,-)
      Tout était donc de mon fait. Ah, la la...

      Quelques détails cependant :
      -  comment afficher autre chose que le calendrier ? Comment afficher les événements eux-mêmes, à la façon de ce qu’il y a dans l’interface privée ? Autrement dit : quel squelette prendre dans le plugin ?

      -  peux ton contourner le lien obligtoire vers un article ? Autrement dit : afficher un rendez-vous sans passer par un article ?

      Merci encore

    • Tu peux créer un squelette evenement.html à ta sauce, en utilisant dedans une boucle évenement qui se contrefiche des articles.

      Et pour mettre directement un lien vers ce squelette, je pense que #URL_EVENEMENT à la place de #URL_ARTICLE dans le json devrait faire l’affaire.

    • Ecoute, j’ai un peu de mal... en fait ,-)

      Tu peux créer un squelette evenement.html à ta sauce, en utilisant dedans une boucle évenement qui se contrefiche des articles.

      Oui, mais quand je crée l’événement, via le plug-in, je suis obligé de le lier à un article, c’est ça qui m’embête...
      Sinon, selon toi, ce squelette evenement.html je le mets où ?

      Et pour mettre directement un lien vers ce squelette, je pense que #URL_EVENEMENT à la place de #URL_ARTICLE dans le json devrait faire l’affaire.

      OK, je vais essayer ,-)
      Merci

    • Oui, mais quand je crée l’événement, via le plug-in, je suis obligé de le lier à un article, c’est ça qui m’embête...

      tu t’en fiche, si côté public cela ne se voit pas. A la rigueur tu les lis tous au même article. Sinon faudrait modifier le plugin, et c’est pas dans les projets.

      Et le squelette evenement.html, tu le met là où tu met tes autres squelettes …

    • #URL_EVENEMENT à la place de #URL_ARTICLE dans le json : parfait !

      Maintenant, il ne me reste plus qu’à créer une page agenda qui reprendrait tous les rendez-vous à venir sous forme de liste plutôt qu’en mode du calendrier (tel que proposé par le plug-in).

      Merci encore !

    • bonjour
      Plug-in Agenda 3.6.11
      spip 3.04

      bonjour je n’arrive pas à afficher mon full calendar coté public
      je viens de lire plusieurs tuto mais j’ai besoin d’aide

      je débute avec spip
      pour afficher le full calendar
      j’ai créer un dossier squelettes à la racine de mon site
      j’ai placer
      le fichier agenda.htm
      et le fichier agenda.json.html
      mais je ne sais pas comment l’appeler
      j’ai créer une rubique agenda qui comporte un article associé à un événement
      tout semble fonctionner cote privé
      mais je sais pas comment afficher mon calendrier cote public
      merci pour votre aide
      voici mon contact

    • il faut savoir que SPIP dispose de deux sortes de pages :
      -  les pages liés à des objets, par exemple les pages d’articles, de rubrique, etc.
      -  les pages autres, par exemple les pages de sommaire, 404 etc.

      En l’occurence, la page en question est une page de la seconde catégorie. Votre squelette s’appellant agenda.html, il faut y accéder en allant sur http://monsite.com/?page=agenda.html.

      Si vous souhaitez produire un lien vers cette page depuis un autre squelette, vous devez utiliser #URL_PAGE{agenda}.

      J’espère que cela eclairera votre lanterne ...

    Répondre à ce message

  • 1

    Une méthode simple pour appeler les événements de l’Agenda :

    Installer le plugin Calendrier-mini :
    http://contrib.spip.net/Calendrier-Mini-2-0

    Puis dans le fichier agenda.html, au niveau du script, remplacer l’exemple ci-dessus :
    events : « [(#URL_PAGEagenda.json)] »,

    par :
    events : « [(#URL_PAGEcalendrier_mini_event.json)] »,

    Explications : le plugin Calendrier-mini, dispo pour spip3, contient déjà un fichier json de récupération des seuls événements déclarés dans le plugin Agenda.
    Ça évite de farfouiller dans la balise #ENV, à laquelle je n’ai par ailleurs rien capté.

    Répondre à ce message

  • 11

    Bonjour,
    cela fait quelques jour que j’essaie de faire fonctionner le plugin Agenda avec l’affichage fullcalendar, sans succès .
    Ne trouvant pas comment faire, j’ai tenter de suivre scrupuleusement ce tutoriel .
    Après plusieurs essais j’arive au mieux a avoir la liste des évènements sans le calendrier lorsque je demande la page ?page=agenda comme si le javascript n’était pas actif.

    Titre
    Expo
    Date
    Du 17 septembre 09:16 au 19 septembre 10:16

    Titre
    Visite bibliothèque
    Date
    Du 19 septembre 09:17 au 22 septembre 10:17 .

    Spip 3.0.5 ,Calendrier mini 2.1.5 Agenda 3.6.11

    Contenu page agenda.html

    http://bibliosemliege.be/agenda/agenda.html

    Contenu page agenda.json.html

    #HTTP_HEADERContent-type:text/javascript ;
    [ {agendafull date_debut,date_fin, periode,
    #VAL{Y}|date{#ENV{start}}, #VAL{m}|date{#ENV{start}}, #VAL{d}|date{#ENV{start}},
    #VAL{Y}|date{#ENV{end}}, #VAL{m}|date{#ENV{end}}, #VAL{d}|date{#ENV{end}}}
    >
    [(#ARRAYid,#ID_EVENEMENT,
    title,[(#TITRE|html2unicode|unicode2charset)],
    allDay,[(#HORAIRE|==non| ?#EVALtrue,#EVALfalse)],
    start,#DATE_DEBUT,
    end,#DATE_FIN,
    url,#URL_ARTICLE,
    description,[(#DESCRIPTIF|html2unicode|unicode2charset)]
    |json_encode)]
    ]

    D’avance merci pour votre aide.
    Loic.

    • on peut avoir une url de démo ?

    • il vous faut utiliser la balise #INSERT_HEAD (qui est nécéssaire pour plein de plugins)

    • je confirme, il manque #INSERT_HEAD

    • voila j’ai rajouter la ligne qui contient le #INSERT_HEAD mais cela ne semble pas résoudre le soucis.

    • où avez vous placé cette INSERT_HEAD

      comme son nom l’indique elle doit être placé dans la balise head du html.

      Je vous invite à lire sa doc

    • Le #INSERT_HEAD est bien dans le <head></head>

      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <title>Agenda</title>
      <INCLURE{fond=inc-head}>
      <link rel='stylesheet' type='text/css' href='#CHEMIN{lib/fullcalendar/fullcalendar.css}' />
      <script type='text/javascript' src='#CHEMIN{lib/fullcalendar/fullcalendar.min.js}'></script>
      </head>

      contenu inc-head

      #INSERT_HEAD
      [<link rel="stylesheet" href="(#CHEMIN{style.css}|direction_css)" type="text/css" media="all" />]
      <meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />
      [<link rel="stylesheet" href="(#CHEMIN{spip_formulaires.css}|direction_css)" type="text/css" media="projection, screen, tv" />]
      <meta name="robots" content="index, follow"/>
      <script language="javascript" type="text/javascript" src="#CHEMIN{js/ban.js}"> </script>
      <script language="javascript" type="text/javascript" src="#CHEMIN{js/slides.min.jquery.js}"> </script>
      [<link rel="stylesheet" href="(#CHEMIN{css/global.css}|direction_css)" type="text/css" media="projection, screen, tv" />]
      <script language="javascript" type="text/javascript" src="#CHEMIN{js/ddsmoothmenu.js}"> </script>
      [<link rel="stylesheet" href="(#CHEMIN{css/ddsmoothmenu.css}|direction_css)" type="text/css" media="projection, screen, tv" />]
      <script type="text/javascript">
      ddsmoothmenu.init({
      mainmenuid: "header", //menu DIV id
      orientation: 'h', //Horizontal or vertical menu: Set to "h" or "v"
      classname: 'ddsmoothmenu', //class added to menu's outer DIV
      //customtheme: ["#1c5a80", "#18374a"],
      contentsource: "markup" //"markup" or ["container_id", "path_to_menu_file"]
      })
      </script>

      http://bibliosemliege.be/agenda/agenda.html
      http://bibliosemliege.be/agenda/inc-head.html
      http://bibliosemliege.be/agenda/agenda.json.html

    • je peux voir l’url du squelettes ?

    • Voici l’url du squelette
      http://bibliosemliege.be/?page=agenda

      Les trois pages sur le post précédent sont des copies des pages agenda et inc-head tel qu’elles sont dans le dossier squelettes

    • si vous regarder les sources de la page, vous voyez que le jquery est ajouté avant le code html.

      Il faut que vous trouviez comment résoudre ce pb ...

    • Merci,
      j’ai ajouter le #INSERT_HEAD et enlever l’inclure inc-head et cela fonctionne. je rajouterais juste les css spécifique a cette page sans passé par le inc-head.

      Je vous remercie encore pour votre aide rapide.
      Loic

    Répondre à ce message

  • 1

    Salut Maïeul,

    J’ai essayé avec succès et grande facilité FullCalender tel que décrit ici pour SPIP 2.1 :

    Mes essai sont ici : http://contrib.spip.net/FullCalendar,3736#forum461092

    Ta contribution pour SPIP 3 est certainement très utile, je l’ai survolée rapidement en diagonale mais je ne vois rien qui exploite un modèle avec des balises simples à intégrer dans le texte d’un article.

    Donc, qu’en est-il de FullCalendar pour SPIP 3 dans cette optique ?

    Cordialement

    FDG

    Répondre à ce message

  • bonsoir Maïeul,
    je voulais tester cet agenda-fullcalendar, et je comprenais pas mon problème, rien ne sortait dans l’agenda : il y a un petit bug dans le script qui appelle le fullcalendar, entre nextYear et today, un petit espace à changer en virgule...

    header: {
            left: 'prevYear,prev,next,nextYear today',
    	center: 'title',
    	right: 'month,agendaWeek,agendaDay'
    },

    devient

    header: {
    	left: 'prevYear,prev,next,nextYear,today',
    	center: 'title',
    	right: 'month,agendaWeek,agendaDay'
    },

    et les événements sont là !
     ;o)
    merci pour tes explications...

    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