Améliorer l’affichage public et la gestion des auteurs d’un site SPIP

Nos objectifs

Nous nous donnons trois objectifs dans le cadre de cet article [1].

Gérer des « secrétaires de rédaction ». Nous partons d’un constat simple : il arrive que des articles publiés sur un site web ne soient pas écrits par les personnes qui les mettent en ligne, de même que l’auteur d’un texte publié dans un journal n’est pas nécessairement la personne qui met ce texte en page. Ce constat - qui tient de l’évidence dans la plupart des cas - peut cependant être perdu de vue quand on a recourt à un outil de publication collaborative comme SPIP.

De cette dstinction entre deux fonctions types - nous parlerons désormais d’une part des « auteurs », responsables du contenu, et, d’autre part, des « secrétaires de rédaction » [2], responsables de l’aspect technique de la publication - découlent des différents besoins.

Par exemple, selon cette distinction, le site public ne rendra compte que des auteurs des textes et laissera ce qui concerne les secrétaires de rédaction à la gestion éditoriale interne du site. Une même identité dans SPIP ne pourra donc à la fois publier ses propres articles et encoder des articles écrits par d’autres.

On pourrait se contenter de ne pas conserver de liaison entre un article et la personne qui l’a mis en ligne, ce qui résoudrait le problème. Il nous semble pourtant que, dès que plusieurs personnes travaillent ensemble sur un même site web, il devient utile de conserver une telle liaison : pour permettre au « secrétaire » de revenir sur ses articles par exemple, ou pour permettre à l’administrateur du site de connaître l’activité de publication des différents secrétaires.

Permettre le classement alphabétique des auteurs. Par défaut, SPIP ne propose qu’un seul champ pour l’encodage des articles. Celà implique qu’il vous sera impossible de classer vos auteurs par ordre alphabétique si vous les encodez selon une forme

Prénom Nom

Inversément, si vous les encodez sous la forme « Nom Prénom », vous pourrez les classer par ordre alphabétique mais l’affichage public sera détérioré. Nous proposons ici une méthode permettant de classer des auteurs tout en conservant la maîtrise de leur affichage.

Uniformiser l’affichage et le rendre plus joli. Pour chaque article, nous souhaitons que la liste des auteurs soit présentée :

  • par ordre alphébétique des noms de famille,
  • précédée du mot "par",
  • en séparant les noms par des virgules, sauf les deux derniers qui seront séparés par le mot "et",
  • en affichant les prénoms en minuscules avec la première lettre en majuscule et les nom de familles en petites majuscules (« small caps ») avec la première lettre en majuscule.

Un exemple de ce que donnent les propositions faites dans ce texte est disponible sur le site http://tchouktchouk.eu.org/, une revue de presse ferroviaire [3]. Les squelettes de ce site sont librement consultables à l’adresse http://tchouktchouk.eu.org/skel/.

Notez aussi que la perspective dans laquelle est traitée dans ce texte la question de l’affichage des auteurs correspond sans doute un peu plus directement à un usage particulier de SPIP qui est par exemple celui fait par revue papier mettant ses articles sur le web : celui dans lequel une ou un nombre réduit de personnes font le travail de mettre en ligne des articles signés par un grand nombre d’auteurs (ceux-ci ne réalisant pas le travail d’encodage de leur(s) articles(s) ; ceci par opposition avec l’usage natif de spip qui est le webzine collaboratif, pour lequel un certain nombre de propositions faites ici sont peu pertinentes.

1. Des secrétaires de rédaction

Par convention, nous allons encoder d’une façon particulière le nom des secrétaires de rédaction (dont la fonction a été définie plus haut) : nous ferons précéder leur nom d’un « @ », ce qui nous permettra aussi de lister facilement les secrétaires de rédaction dans l’interface privée.

Il nous suffira donc d’ajouter le critère {nom!==^@} (littéralement : « ne commençant pas par "@" ») dans tous les boucles AUTEURS du site pour qu’il ne soit plus fait mention de nos secrétaires de rédaction sur le site public. Ce qui donne par exemple :

2. Gérer le classement alphabétique

Par convention, nous supposons que nos les noms de nos auteurs sont composés d’un prénom (ou plusieurs) et d’un nom de famille. Nous considérons en outre que c’est en fonction de ce nom de famille qu’un classement alphabétique des auteurs est le plus pertinent. Nous supposons enfin qu’il est préférable de citer une personne en commençant par son prénom. Ces considérations culturelles étant acquises, nous pouvons passer à la mise en oeuvre.

La manière la plus facile d’ordonner une liste de données, c’est de s’adresser au système de gestion de la base de données. Par conséquent, les données doient y être stockées dans un format qui le permet sans trop se compliquer la vie. Autrement dit, notre champ "nom" doit commencer par le nom de famille.

Nous décidons donc, par convention, d’encoder systématiquement les noms de nos auteurs en commençant par le nom suivi d’un underscore (un "_") puis du prénom et autres titres, seconds prénoms,... Ainsi, le nom "naturel" d’un auteur :

Pdt. William J. Clinton

devient, selon notre nouvelle norme d’encodage :

Clinton_Pdt. William J.

A moins que vous n’ayez de raison particuliuère de le faire (autre usage de la base de données), il n’est pas essentiel d’insister ici sur l’usage des majuscules et minuscules : nous harmoniserons tout cela lors de l’étape de l’affichage.

Dans l’espace privé de notre site, les articles de cet auteur seront attribués à l’auteur Clinton_William J. ; cela n’est pas forcément très élégant, mais tout de même parfaitement lisible.

Avantage immédiat, dans la liste des auteurs, nous récupérons un classement alphabétique parfait, de la forme :

Bush_George W.
Clinton_Hillary
Clinton_William J.

Sur le site public, une boucle AUTEURS classée {par nom} fournira donc un classement alphabétique correct (basé sur le nom de famille).

Pour remettre l’affichage « à l’endroit » sur le site public, il suffira d’utiliser un filtre - nous allons le créer tout de suite et l’appeler prenom_nom - que nous appliquerons à la balise #NOM :

Tant qu’à faire, nous écrivons deux autres filtres pour afficher respectivement le nom ou le prénom seul. Nous obtenons donc trois filtres (et quelques fonctions subordonnées), à placer dans le fichier mes_fonctions.php3 (ou dans un autre fichier que vous chargerez dans mes_fonctions.php3 avec l’instruction require) :

Notez que chacune des trois fonctions renvoie des chaînes nettoyées des « @- » (ou « @_ » ou « @  » ou « @ ») qui les précèdent éventuellement. Cela permet, si nécessaire, d’utiliser le nom d’un secrétaire de rédaction sur le site public [4].

Enfin, s’il n’y a pas de « _ » dans la chaîne :

  • la fonction prénom ne renvoie rien ;
  • la fonction renvoie la chaîne sans rien changer (par exemple un pseudo) ;
  • la fonction prenom_nom renvoie la chaîne sans rien changer ;

Cela permet d’introduire un peu de souplesse et d’afficher correctement le nom d’Aristote, d’Alain, du vengeur masqué ou de n’importe que pseudo, lesquels ne sont pas, contrairement à nos prémisses, composés d’un prénom suivi d’un nom [5].

3. Mise en forme

Ces trois fonctions, qu’il vous suffit d’ajouter dans votre fichier mes_fonctions.php3 [6] vont nous permettre de citer nos auteurs de façon beaucoup plus fine.

Par exemple, la ligne suivante, insérée dans un squelette, nous renverra le prénom suivi du nom, ce dernier étant mis en forme selon la classe CSS .nom.

Cela nous permet, par exemple, d’afficher le nom en petites majuscules (small caps), simplement en le précisant dans la feuille de style [7] de la façon suivante :

Pour terminer, notez que ces filtres tels qu’ils sont proposés ici harmonisent l’affichage selon la norme suivante :

prenom() renvoie le prénom après l’avoir passé en minuscules puis avoir transformé en majuscule l’initiale de chaque mot (ainsi que l’initiale de chaque partie d’un mot composé).

nom() fait de même... avec le nom.

prenom_nom() concatène les résultats obtenus par prenom() et par nom() (séparés par un espace) après avoir passé le nom en majuscules.

Par exemple, si la valeur de notre champ #NOM est « durant-DUBOIS_dr. anne-sophie », placé dans un squelette, le code [(#NOM|prenom) ][(#NOM|nom)] [8] renverra

Dr. Anne-Sophie Durant-Dubois

tandis que le code [(#NOM|prenom) ][(#NOM|majuscules|nom)] [9] renverra

Dr. Anne-Sophie DURANT-DUBOIS

Comme nous le disions plus haut, tout ceci nous permet de ne pas trop nous soucier de la précision de l’encodage des noms des auteurs : le rendu public sera de toute façon homogène.

4. Rendre la liste des auteurs plus jolie

Pour terminer, plutôt que comme une simple liste de noms séparés par des virgules, nous allons afficher la liste de nos auteurs sous la forme :

par Albert Durant, Claude Dubois et Jean Dupont

Une petite fonction php va nous y aider :

Attention, cette fonction doit être placée dans le squelette (et non dans le fichier mes_fonctions.php3 ou ailleurs) : il doit en effet s’exécuter à chaque lecture de la page (et non uniquement lors du calcul de la page).

Si vous utilisez plusieurs boucles AUTEURS dans un même squelette, veillez à ne pas répéter la fonction auteur_et_auteur plusieurs fois, sans quoi vous aurez une erreur php [10].

*

Bref, voici les quelques lignes qui, placées dans un squelette, répondent à notre objectif initial [11] [12] :

Nous avons bien renvoyé la liste des auteurs :

  • classée par ordre alphébétique des noms de famille,
  • précédée du mot "par",
  • en séparant les noms par des virgules, sauf les deux derniers qui seront séparés par le mot "et",
  • en affichant les prénoms en minuscules avec la première lettre en majuscule et les nom de familles en petites majuscules avec la première lettre en majuscule.

[1Notez que plusieurs idées développées ici sont issues des discussions de la liste spip-dev et notamment des contributions postées par Fil et ARNO*. Après une tentative - pour le moment avortée - de publier ceci dans les « trucs et astuces » du site officiel de SPIP, je reprends ici l’essentiel, de façon à ce que les outils développés dans le cadre de cette discussion soient disponibles quelque part. Pour plus d’info, voyez notamment http://www.spip.net/ecrire/articles....

[2Notez que rien n’empêche, bien entendu, qu’une même personne joue les deux rôles ; c’est d’ailleurs mon cas sur plusieurs des sites web que j’entretiens. Dans ce cas, il suffit de créer deux identités : une identité « usuelle » (celle sous laquelle on se loggue) qui est celle du « secrétaire de rédation » et une identité « virtuelle » qui est juste le nom et le prénom en vue de l’affichage sur le site public. De cette manière, on peut séparer clairement les articles qu’on a écrit de ceux qu’on a uniquement encodés.

Profitons de cette remarque pour rappeller que SPIP permet de créer des auteurs « virtuels », c’est-à-dire s’affichant normalement dans le site public mais n’ayant pas accès à l’interface privée. Ils se caractérisent par le fait qu’aucun login / mot de passe n’est défini pour eux. Chaque fois que vous utilisez le bouton « ajouter un auteur à cet article », vous créez un auteur virtuel. Dans le cas qui nous occupe, c’est ce statut d’auteur virtuel qui sera utilisé la plupart du temps pour les auteurs (mais ce n’est pas obligatoire) tandis que le statut d’administrateur ou d’administrateur restreint conviendra mieux aux « secrétaires de rédaction ».

[3Qui, soit dit en passant, présente également d’autres contributions spip : le glossaire interne, les squelettes différents pour différents groupes de mots-clés,...

[4Comme on l’a vu, l’interdiction d’affichage des secrétaires de rédaction sur le site public s’inscrit dans les boucles.

[5Pour résumer exactement l’action de notre jeu de fonctions (étant donné qu’une chaîne est définie comme pouvant contenir des caractères alphanumériques, des espaces et des tirets mais pas d’underscore) :

  • « chaine1_chaine2 » (ou « @-chaine1_chaine2 ») est considérée comme un nom suivi d’un prénom, que renvoient respectivement les fonctions du même nom, après traitement.
  • « chaine_ » (ou « @-chaine_ ») est considérée comme un nom seul, donc la fonction prenom() ne renvoie rien tandis que la fonction nom() renvoie le nom après l’avoir traité (passage en minuscules puis passage de l’initiale en majuscule).
  • « _chaine » (ou « @-_chaine ») est condidérée comme un prénom seul (et donc la fonction nom() ne renvoie rien). Bien sûr, établir une distinction entre un nom seul et un prénom seul semble a priori peu utile : ça permettra quand même de différencier l’affichage du nom ou du prénom. L’usage de cette norme aura également pour effet logique, dans le classement alphabétique, de laisser les noms seuls parmi la liste des auteurs dotés d’un nom et d’un prénom tandis que les prénoms seuls en seront séparés (ce qui permet par exemple de demander facilement à la base de données de ne pas renvoyer les prénoms ou de ne renvoyer qu’eux).
  • « chaine » (ou « @-chaine ») est condidérée comme un pseudo, donc la fonction prenom() ne renvoie rien. Petite subtilité par rapport au format chaine_, aucune modification n’est faite par la fonction nom(). Par exemple, nom("dEUS_") renvoie « Deus » tandis que nom("dEUS") renvoie « dEUS » sans rien changer. Cette petite subtilité rend par exemple possible l’installation du présent jeu de fonctions sur un site sans devoir changer immédiatement tous les noms des auteurs (puisque ceux qui sont encodés au format « Prénom Nom » seront retournés tels quels).

[6après l’avoir créé dans le répertoire racine de votre spip si ce n’est déjà fait

[7Dans les squelettes par défaut de la distribution officielle de SPIP, il s’agit du fichier spip_style.css.

[8Notez que l’espace entre le prénom et le nom est placé dans la partie conditionnelle de la boucle prénom : s’il n’y a pas de prénom, il ne sera pas affiché. Cela peut s’avérer utile dans le cas de certaines mises en pages fines. S’il n’y a qu’un prénom, l’espace s’affichera indûment, mais après le mot, ce qui ne pose pas de problème de mise en page (et puis comme il n’est pas possible de créer un affichage doublement conditionnel avec la syntaxe de SPIP, on ne va pas non plus se casser la tête).

[9L’ordre des filtres est ici important : majuscules doit s’exécuter après nom et doit donc être placé avant

[10Une solution facile à ce problème consiste à placer la fonction dans le fichier d’en-tête de votre si vous en avec un ou à conditionner le chargement de la fonction par une constante qui garantira qu’on ne la charge pas plusieurs fois. En ce qui me concerne, j’ai placé cette fonction dans un petit fichier annexe auquel je fais systématiquement appel dans le fichier d’en-tête.

[11Pour autant, bien sûr que les filtres nom et prenom soient disponibles dans le fichier mes_fonctions.php3, que la fonctionauteur_et_auteur() ait été chargée et que la classe .nom soit définie dans la feuille de style.

[12Notez la nouvelle construction avec le filtre texte_script qui remplace l’ancienne écriture du type $var = stripslashes('<BOUCLE>[(#BALISE|addslashes)]</BOUCLE>'); pour nettoyer les chaînes qu’on passe dans le script php.

Mise à jour de cette page : lundi 12 janvier 2004
xhtml valide | dernière mise à jour du site : 12 avril 2018 | administration