Boucle « MESSAGES »

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

Cet article décrit la création d’une nouvelle boucle, qui tire parti du nouveau compilateur de Spip 1.8.2+, et permet de créer de nouvelles boucles avec un minimum d’efforts

Spip 1.8.2 a introduit de nouveaux filtres permettant d’afficher des éléments sous forme de calendrier, similaire au calendrier de l’espace privé.

Ces filtres (agenda_memo et agenda_affiche) peuvent récupérer des brèves, des articles, ou d’autres éléments Spip qui sont atteignables dans des boucles, puis les injecter dans des filtres qui génèrent un calendrier en HTML.

Ce calendrier partage son code avec le calendrier de l’espace privé, ce qui est parfait en terme d’interface utilisateur.

Cette interface utilisateur commune entre espace public et espace privé m’a logiquement conduit a également vouloir pouvoir faire apparaitre les messages et rendez-vous qui sont d’habitude uniquement visibles dans l’espace privé, à l’intérieur du calendrier de l’espace public.

Plutôt que d’adopter une approche ’brutale’ et forcer la génération des évènements via des requêtes SQL à l’intérieur du filtre de génération du HTML du calendrier, j’ai décidé de mettre à contribution les nouvelles fonctions du compilateur de boucles Spip, et de créer une nouvelle boucle ’MESSAGES’ qui permet de taper dans la table ’spip_messages’. Ensuite, il suffit simplement d’utiliser ’agenda_memo’ pour y ajouter les messages privés.

Cet article constitue donc également un bon exemple de comment créer une nouvelle boucle facilement.


Que faut-il mettre dans ’mes_fonctions.php3’ ?

Plutôt qu’un long discours, je pense que du code commenté sera plus parlant. Attention, le nouveau compilateur est puissant, ça va très vite !

Pour une introduction à la notion de nouvelles boucles, voyez le ’Spikini’, et particulièrement l’entrée NouvelleBoucle qui pose les bases... mais ne dit pas tout ! En particulier, aucune mention des tableaux ’$table_des_tables’ et compagnie :

// La table spip_messages est déjà prise en compte dans
// ecrire/inc_serialbase.php3, ce qui fait qu'il suffit simplement
// de terminer le boulot ici !
global $table_des_tables, $table_primary, $tables_relations, $exceptions_des_tables, $table_date ;

$table_primary['messages']="id_message";
$table_des_tables['messages']='messages';

// Très important: ceci permet de voir tous les messages où 'id_auteur' 
// est soit l'auteur, soit un des destinataires du message. Conséquence,
// un critère {id_auteur = 3} retournera non seulement les messages
// écrits par l'auteur numéro 3, mais aussi les messages où '3' est
// dans les destinataires
$tables_relations['messages']['id_auteur']='auteurs_messages';

// spip_messages stocke la date dans 'date_heure' et non 'date'
$exceptions_des_tables['messages']['date']='date_heure';
$table_date['messages']='date_heure';


// Nouvelle boucle: "MESSAGES"
// ATTENTION: restreindre toujours avec id_auteur=#USERID
// sinon on voit tous les messages de n'importe qui!

function boucle_MESSAGES($id_boucle, &$boucles) {
	$boucle = &$boucles[$id_boucle];
	$id_table = $boucle->id_table;
	$boucle->from[] =  "spip_messages as $id_table";
        $boucle->where[]= "messages.rv='oui'"; 
        $boucle->where['statut'] = "messages.statut='publie'";
	return calculer_boucle($id_boucle, $boucles); 
}

... et c’est tout ! Efficace, non ?

En utilisation pratique, il suffira simplement d’utiliser des boucles ’MESSAGE’ comme suit :

<BOUCLE_rdvs(messages){id_auteur=#USERID}{agenda date_heure, mois, #ENV{annee}, #ENV{mois}}{texte == Key_Word$}>

[(#DATE|agenda_memo{#TEXTE,
		#TITRE,
		/ecrire/message.php3?id_message=#ID_MESSAGE,
		calendrier-couleur2})]
</BOUCLE_rdvs>>[(#TOTAL_BOUCLE|
	agenda_affiche{'Aucun Messages', 'mois'}

Cette boucle mérite tout de même quelques commentaires :

-  texte == Key_Word$ : permet de ne choisir que les rendez-vous qui contiennent ’Key_Word’ en fin de descriptif. Très commode pour contourner le fait que les rendez-vous et messages ne sont pas liés à des catégories
-  id_auteur=#USERID est une balise ’perso’, dont le code est ci-dessous : ceci empêche de sortir des messages qui n’appartiennent pas à leur auteur. (attention, pour que cette balise fonctionne correctement, il faut que le cache du squelette ait un délait de 0)

// Nouvelle balise: retourne le nom de l'utilisateur authentifie
// Attention: ceci pose des problemes avec le cache de Spip
//   par consequent, il faut mettre le delai a 0 pour les
//   pages qui utilisent USERID

function balise_USERID($params) {
   $params->code="\$GLOBALS['auteur_session']['id_auteur']";
   $params->status='php';
   return $params;
}

Note : ceci est le mieux que j’ai trouvé pour introduire la notion « d’utilisateur courant », avec un impact négatif sur le cache de Spip... Si quelqu’un a une solution plus élégante, je suis preneur !

En ce qui concerne la définition de la boucle « MESSAGES », il pourrait être judicieux d’introduire un contrôle à l’intérieur de la boucle même, pour éviter qu’une erreur de codage dans le squelette puisse permettre à un utilisateur de voir les rendez-vous de quelqu’un d’autre.

J’espère que ceci vous aura plu, et que cela aura un peu éclairci la manière de définir de nouvelles boucles. Si un ’vrai’ développeur de Spip peut ajouter ses commentaires pour dire si effectivement, il s’agit de la bonne manière ou non, allez-y !

Edouard Lafargue

Discussion

Aucune discussion

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