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 !
- <H2>ARTICLES AUTEURS</h2>
- <BOUCLE_art_aut(ARTICLES){par id_article}>
- #ID_ARTICLE : #TITRE => #LESAUTEURS<br />
- </BOUCLE_art_aut>
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 de SQUELETTES ?
Vous pouvez donc télécharger le fichier articles_sans_auteur.html
ci-dessous dans votre dossier du serveur :
- [(#REM) articles_sans_auteur.html
- boucle de creation du texte de requete SQL pour re-auteuriser les articles]
- <B_art_aut>
- #SET{aut_id,1} <!-- indiquer le n° d'auteur voulu, dans l'appel -->
- <H2>ARTICLES AUTEURS = [#GET{aut_id}] #INFO_TITRE{'auteur',#GET{aut_id}}.</h2>
- INSERT INTO info_auteurs_liens VALUES(id_auteur,id_objet,objet,vu) ;<br /><hr />
- <BOUCLE_art_aut(ARTICLES){par id_article}>
- [ INSERT INTO info_auteurs_liens
- (#LESAUTEURS|non)
- VALUES([(#GET{aut_id,1})],#ID_ARTICLE,'article','non');<br />]
- </BOUCLE_art_aut>
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 !
Article publié le 12 août 2018, et actualisé en août 2018 attente de suggestions .
Répondre à cet article