Rétablir les auteurs aux articles décrochés

Lors d’une migration, il s’est trouvé que des articles n’avaient plus d’auteur associé !

Cela n’est pas dramatique, sauf quand on veut protéger ceux-ci par Accès restreint : en effet, les zones d’accès se gèrent par l’appartenance de l’auteur connecté, à une zone autorisée.

En l’occurrence, il s’agissait d’identifier les articles en cause, et de leur réaffecter un nouvel auteur.

Comment faire cela, juste en SPIP ?

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Attention, cette page est encore en  

 Le problème rencontré

Lors d’une migration, en reprenant les articles, on constate soudain dans l’espace privé que certains articles ne montrent aucun auteur [1], tandis que d’autres peuvent afficher plusieurs auteurs référencés, grace à la balise #LESAUTEURS.

Il s’agit d’un SPIP 3.2.1 donc avec la nouvelle gestion des articles en liens de type d’objet ’article’ aux auteurs (donc dans la table spip_auteurs_liens ...).

 Lister les articles concernés

La première démarche consiste à lister les articles concernés : en l’occurrence, une simple boucle doit faire le job, si on veut se reporter à La boucle ARTICLES et ses balises de champs !

  1. <H2>ARTICLES AUTEURS</h2>
  2. <BOUCLE_art_aut(ARTICLES){par id_article}>
  3.     #ID_ARTICLE : #TITRE => #LESAUTEURS<br />
  4. </BOUCLE_art_aut>

Télécharger

Ce squelette, placé dans un fichier auteurs_articles.html dans votre dossier ./squelettes se lance par ?page=auteurs_articles [2] et affiche facilement en lignes successives, les numéros et titres des articles, avec lien(s) vers le ou les auteurs.

Pour restreindre l’affichage aux articles sans auteur(s), plutôt que d’utiliser un critère [3] sur un champ calculé, on met simplement une condition d’affichage activée par la valeur nulle de la balise #LESAUTEURS .
Ce qui nous transforme la ligne intérieure de la boucle en :
[    #ID_ARTICLE : #TITRE => (#LESAUTEURS|non) <br />  ]
On obtient donc un affichage des seuls articles sans aucun auteur !
Maintenant, nous allons voir comment ’rectifier’ la base de données.

 Le principe des liens entre objets SPIP 3

La structure de base de données de SPIP 3 se caractérise par les nombreux liens entre tables d’Objets éditoriaux : ces liaisons ont été systématisées depuis SPIP 3, avec le modèle suivant : à chaque occurrence de table_objet éditorial sont associés des pointeurs vers d’autres objets éditoriaux, regroupés dans une table de liens, celles-ci ont toutes la mème structure en triplet, à savoir la clé primaire de l’occurrence source du lien, puis le type et la clé de l’objet pointé par le lien.
Pour les articles, qui peuvent être liés à des auteurs (multiples), la table maitre de la liaison est celle des AUTEURS, et donc chaque participation d’un auteur à la rédaction d’un article (ou de tout autre objet éditorial) est enregistrée sous la forme des VALUES(id_auteur,id_objet,objet,vu).
Donc pour tous les articles sans auteur, il va falloir choisir un numéro d’auteur, pour lequel on va créer ces enregistrement dans la table spip_auteurs_liens

 Comment leur ré-insérer un auteur à la volée

Là aussi j’ai fait simple : pour ne pas m’em... avec la génération d’arguments complexes PHP, pour appeler une fonction interne de SPIP : voir programmer.spip.net/5477, j’ai préféré générer la seule instruction en langage SQL (voyez SGBD : moteurs et documentations SQL / SPIP) de création de chaque enregistrement... par une boucle SPIP, inspirée de la précédente.
En SQL, l’instruction de création d’un enregistrement dans une table s’écrit selon la syntaxe suivante (à consulter sur SQL.sh ;-) :
INSERT INTO spip_auteurs_liens VALUES(id_auteur,id_objet,objet,vu) ;

Pour générer une instruction à chaque article sans auteur, il suffit donc d’utiliser la ligne de squelette ci-dessous :
 [ INSERT INTO info_auteurs_liens (#LESAUTEURS|non) VALUES(2,#ID_ARTICLE,'article','non',0);<br />]
Tiens ? Pourquoi ai-je écrit info_auteurs_liens ? En fait, c’est une histoire de prefix : à l’installation, j’ai donné à mon jeu de tables SPIP le prefixe info_ en remplacment du préfixe standard, donc...

 Créer la noisette génératrice de contrôle

Pour mettre en application, créons un simple squelette, dans un fichier déposé dans votre dossier ./squelettes ; une révision éventuellement sur MODIFIER un JEU INITIAL de SQUELETTES ?
Vous pouvez donc télécharger le fichier articles_sans_auteur.htmlci-dessous dans votre dossier du serveur :

  1. [(#REM) articles_sans_auteur.html
  2.               boucle de creation du texte de requete SQL pour re-auteuriser les articles]
  3. <B_art_aut>
  4. #SET{aut_id,1}    <!--   indiquer le n° d'auteur voulu, dans l'appel -->
  5. <H2>ARTICLES AUTEURS = [#GET{aut_id}] #INFO_TITRE{'auteur',#GET{aut_id}}.</h2>
  6. INSERT INTO info_auteurs_liens VALUES(id_auteur,id_objet,objet,vu) ;<br /><hr />
  7. <BOUCLE_art_aut(ARTICLES){par id_article}>
  8.       [ INSERT INTO info_auteurs_liens
  9.                     (#LESAUTEURS|non)  
  10.             VALUES([(#GET{aut_id,1})],#ID_ARTICLE,'article','non');<br />]
  11. </BOUCLE_art_aut>

Télécharger

Juste une remarque, pour expliciter les balises rajoutées en début :
- #GET récupère la valeur d’une variable externe (sinon 1)
- #SET positionne la variable aut_id à partir de l’environnement (sinon 1)
- #INFO-TITRE affiche le titre/nom de l’auteur n° aut_id.

Ainsi, l’appel (par ?page=articles_auteur&aut_id=2 : voir Donner accès à une nouvelle page autonome) vous affichera quelque chose comme..

Un exemple pré-généré par la boucle présentée
N.B. : le SPIP utilisé ici comportait un champ ’ordre’
rajouté par un plugin à la table auteurs_liens.

Attention, dans la noisette ci-dessus, l’appel sans paramètre proposera l’affectation des articles au webmestre n°1 !
En tenant compte de la remarque ci-dessus, vous pouvez passer sans risque cette noisette sur votre site : au pire, elle vous démontrera que des enregistrements ont sauté..

 Passer les commandes SQL

Réparer la base de données signifie donc faire passer ces instructions SQL sur le serveur MySQL, justement ce que SPIP vous évite toujours de connaitre !
Mais dans ce cas, le webmestre sera sans doute bien content de trouver une solution sous SPIP, évitant un appel à un phpMyAdmin installé ailleurs : en fait je peux vous en proposer deux, en plugins :
- le plugin Adminer bien connu vous permet d’exécuter du SQL,
- un nouveau plugin Requeteur SQL vous permet aussi cette pratique.
Une fois que vous avez installé l’un des deux sur votre site, effectuez juste un couper-coller de la partie affichée sous le trait de l’exécution du fichier , les instructions INSERT préparées, pour les coller dans la fenêtre d’exécution SQL....
Et fin les soucis !

Si je reviens sur cet article, peut-être vous proposerai-je une solution plus élégante, avec l’appel de simples fonctions de SPIP dans le squelette...
Ou un expert les "devs" de la "Team" me signalera la bonne fonction... encore plus simple !


Merci de nous signaler les coquilles ou erreurs qui figureraient dans cette page.

[1Pour cela, le webmestre est passé par Edition / Articles / Tout afficher qui utilise ../prive/objets/liste/articles.html !

[2Attention, si vous utilisez Zpip ou Z, Zcore et Thèmes, l’emplacement et la syntaxe d’appel seront différentes !

[3Pour être honnête, j’ai commencé par du compliqué : connaissant le modèle pour La structure de base de données de SPIP 3, j’ai envisagé une jointure automatique de SPIP sur spip_auteurs_liens, mais avec quelques soucis : c’est une autre histoire, voir https://contrib.spip.net/5025...


Liens visibles seulement pour les inscrits.

Article publié le 12 août, et actualisé en août 2018 attente de suggestions .

Répondre à cet article