Carnet Wiki

Ajouter des Objets Editoriaux dans le calendrier personnel - l’exemple des Pense-bêtes.

Version 16 — 3 weeks ago Thrax

Cet article est une visée pédagogique. Il explique comment j’ai incorporé dans le calendrier personnel un nouvel objet éditorial propre au plugin Pense-bêtes

Le but est cet article est de faire comprendre le fonctionnement du pipeline quete_calendrier_prive à utiliser pour ajouter un nouvel objet éditorial dans le calendrier personnel d’un auteur.

L’«Agenda interne» de SPIP est la superposition de deux calendriers [1] :

  1. Le calendrier public de la vie du site
  2. Le calendrier personnel de l’auteur.

Les calendriers sont accessibles de deux façons :

  1. dans l’espace privé, après le bandeau des outils_rapides, au sein du bandeau des outils_collaboratifs, vous trouverez l’icône «Agenda interne» et, en cliquant dessus, vous accédez aux deux calendriers fusionnés en un seul.
  2. par téléchargement ou synchronisation, des fonctions qui vous sont proposées depuis la page accessible par le menu Publication ! Suivre la vie du site.

Chaque calendrier présente des objets éditoriaux placés dans le calendrier par sa date. Par exemple, la date de publication d’un article est le repère pris pour placer l’article dans le calendrier public.

Ce traitement est réalisé par le plugin Organiseur. Ce plugin est inclus dans la distribution de SPIP.

L’objet du présent article est de vous montrer comment j’ai incorporé dans le calendrier personnel un nouvel objet éditorial propre au plugin Pense-bêtes, qui est l’Objet Pensebete (on parle d’objet éponyme).

Mon objectif était que les pense-bêtes adressés à l’auteur apparaissent dans le calendrier de l’auteur par date.

Vous pourrez adapter les démarches ici décrites à d’autres objets éditoriaux dans les plugins que vous programmerez. Pensez alors aux règles de rédaction du code préconisées sous SPIP afin que ce que vous rédigiez soit facilement compréhensible par la communauté.

Déclaration de l’utilisation du pipeline quete_calendrier_prive

Les plugins peuvent afficher leurs événements dans le calendrier privé par le pipeline quete_calendrier_prive. Ce pipeline est créé par le plugin Organiseur.

Pour pouvoir utiliser ce pipeline d’Organiseur, on déclare dans notre propre plugin que l’on va se brancher dessus en ajoutant une ligne dans les déclaration du paquet.xml :

<pipeline nom = "quete_calendrier_prive" inclure = "pensebetes_pipelines.php" />

Cette déclaration faite, il faut créer la fonction qui utilisera effectivement le pipeline. Pour ce faire, on modifie le fichier pensebetes_pipelines.php pour ajouter la fonction nécessaire :

function pensebetes_quete_calendrier_prive($flux) {


return $flux;
}

Pour l’instant, les tuyaux de programmation sont installés (on a dérivé le pipeline), mais le flux de données qui les traversent ne sont pas modifiés. En d’autres ternes, l’information circule mais n’est pas modifiée.

Vous voulez regardez ce qui se passe ? Vous pouvez le faire par un log. Un log est un journal de bord horodaté, à l’usage du programmeur, qui ordonne les différents événements qui se sont produits. Vous pouvez aller le consulter dans les répertoire tmp/log/calendrier.log ou installer un charmant plugin, Simples Logs, qui vous permettra de faire cela depuis l’interface privée.

function pensebetes_quete_calendrier_prive($flux) {
	$start = $flux['args']['start'];
	$end = $flux['args']['end'];
	$quoi = print_r($flux['data'], true);


spip_log("start = $start end = $end quoi = $quoi", 'calendrier'._LOG_INFO_IMPORTANTE);
	return $flux;
}

Ajout d’informations formatées dans le flux

Le plugin Organiseur met en forme ses données au travers de deux fonctions. Pour envoyer de la donnée relative aux évènements de rendez-vous, ce sont les fonctions suivantes :

  • quete_calendrier_interval_rv(), que vous trouverez dans le fichier /plugins-dist/organiseur/inc/quete_calendrier.php
  • convert_fullcalendar_quete_calendrier_interval_rv(), que vous trouverez dans le fichier /plugins-dist/organiseur/action/quete_calendrier_prive.php.

Vous pouvez écrire votre propre formatage des données que vous allez ajouter à celles qui transitent dans le pipeline que nous avons dérivé.

Nous avons ajouter un évènement test pour la date d’aujourd’hui. Cet évènement vous rappellera le premier article que vous avez écrit sous SPIP. Nous reprenons donc la fonction précitée située dans le fichier pensebetes_pipelines.php et nous la rédigeons ainsi :

function pensebetes_quete_calendrier_prive($flux) {
	
	$texte = generer_url_ecrire('article', 'id_article = 1');// fonction dans urls.php
	$texte = str_replace ('&', '&', $texte); // on injecte du json pas du HTML
	$flux['data'][] = array ('id' => ,
	'title' => "Mon premier article",
	'allDay' => 1,
	'start' => date('Y-m-d'),
	'end' => date('Y-m-d'),
	'url' => liens_absolus($texte, ''), //fonction de filtres_mini.php
	'className' => 'calendrier-event calendrier-couleur01',
	'description' =>'Ma description qui déchire !');


return $flux;
}

La consultation du calendrier fera apparaitre à la date d’aujourd’hui le premier article que vous avez écrit (article1).

Ajout de l’information que vous souhaitez dans le flux

L’objectif est maintenant de faire apparaitre les pense-bêtes qu’a reçu l’auteur dans son calendrier personnel. Voici comment le plugin Pense-bêtes procède :

function pensebetes_quete_calendrier_prive($flux) {
	
	$id_auteur = $GLOBALS['visiteur_session']['id_auteur'] ;


if ($mes_pensebetes= sql_allfetsel('id_pensebete, titre, texte, date', 'spip_pensebetes', 'id_receveur=' . intval($id_auteur). ' AND date > "'.$flux['args']['start'].'" AND date < "'.$flux['args']['end'].'"')) {
		foreach ($mes_pensebetes as $un) {
			$texte = generer_url_ecrire('pensebete','id_pensebete=' . $un['id_pensebete']);// fonction dans urls.php
			$texte = str_replace ('&','&',$texte); // on injecte du json pas du HTML
			$flux['data'][] = array ('id' => ,
			'title' => $un['titre'],
			'allDay' => 1,
			'start' => substr ($un['date'],0,10),
			'end' => substr ($un['date'],0,10),
			'url' => liens_absolus($texte, ''), //fonction de filtres_mini.php
			'className' => 'calendrier-event calendrier-couleur01',
			'description' =>$un['texte']);
		}
	}
	return $flux;
}

Si vous souhaitez vous aussi insérer vos données, vous pouvez vous inspirer de cette démarche.

Il n’est pas inutile de mieux comprendre ce qu’est le json. C’est un langage formatant la donnée. Ce langage est ensuite utilisé par le javascript de la librairie Fullcalendar utiliser par le plugin Organiseur.

Le formatage json de la donnée qui nous intéresse, et que nous transmettons par un tableau PHP dans le flux du pipeline est le suivant :

  • id : id unique de l’événement (qui sera attribué par le pipeline ; en attendant on met zéro)
  • title : titre de l’événement
  • allDay : précise si l’évènement est sur la journée (true) ou non (false)
  • start : date de début de l’événement
  • end : date de fin de l’événement
  • url : url sur laquelle on envoi lors du clic sur l’événement (Attention à ne pas mettre le code HTML de & mais bien le signe &)
  • className : classe css appliquée à l’événement (Et ici utilisation des class calendrier-couleurxx de SPIP)
  • description : courte description de l’événement, mais qui n’est pas affichée dans le calendrier (bug ?).

Redonner du sens à la Description ? Description

Attention, les paragraphes qui suivent sont techniques et ne font que soulever proposent de modifier un problème sans proposer plugin existant dans la distribution de solution SPIP .

Le plugin Organiseur dans sa version 1.2.4 propose de renseigner le champ json description</var>. >... Par exemple, pour les articles, il complète le contenu de ce champ par la colonne introduction de la table spip_articles... mais ne l’exploite pas ! Il n’y a aucun traitement fait dans le calendrier affiché .Il vous est proposé de remédier ici à ce défaut.

Nous avons tenté en vain d’y remédier.

L’exploitation par jquery des données json proposée à la librairie Fullcalendar utilisée par le plugin précité se fait en les chargeants avec deux squelettes :

  • /organiseur/calendrier.html qui charge les évènements publics via une noisette calendrier_quete.json.html
  • /organiseur/prive/squelettes/contenu/calendrier.html qui charge les évènements privés via une action utilisant le pipeline quete_calendrier_prive que nous avons vu précédemment.

Il serait intéressant de donner Nous pouvons modifier ce squelette en offrant au champ < var>description</var > description l’utilité d’une info bulle. JqueryUI, qui est une librairie javascript installée de base avec SPIP, permet de mettre en place des infos bulles. Pour ce faire la librairie utilise une methode dénommée tooltip.

Nous souhaitons que la méthode utilise l’information json description. Par defaut la méthode utilisera l’attribut title comme contenu du conteneur désigné . Mais la methode a besoin d’identifier le conteneur. Or il n’y a pas d’id définissant chaque évènement de manière unique. Plus encore, l’information description n’est placée en title d’aucune balise.

Je n’ai donc pas de solution à vous proposer pour parvenir à nos fins, mais des écureuils plus expérimentés que moi relèveront peut-être le défi !