Version 8 — Février 2022 — YannX
L’utilisation des mots-clés etait devenue classique en SPIP 2 ; mais le passage a SPIP 3 oblige à revoir l’implantation et le code d’accès aux tables avec mots-clés.
Il peut s’avérer interessant de bien comprendre l’utilisation de l’interface API Editer_liens.
La nouvelle référence des API SPIP 3 propose un vocabulaire unifié pour gérer les objets, et en particulier les liens entre objets (pas seulement les mots-clés).
Comme traditionnellement, les mots-clés sont définis dans une table MOTS, avec une gestion des GROUPES_MOTS (pas de changement à ce niveau).
Mais pour les liens, c’est plus simple : les diverses tables de liens avec les mots-clés de SPIP2 sont remplacées par une seule table de lien : un triplet depuis la clé du mot, vers un objet précisé par sa nature et sa propre clé !
On trouve donc une table spip_mots_liens
qui contient donc les trois champs suivants :
id_mot
: le code-clé du mot-clé taggantobjet
: la nature de l’objet pointé (associé) à ce motid_objet
: la clé identifiant l’enregistrement objectif dans sa tableC ’est la traduction de la documentation de référence :
<blockquote class="spip">Pour être associable en tant que source, un objet bidibule stocké dans une table spip_bidibules doit posséder une table spip_bidibules_liens qui possèdera un champ id_bidibule (même nom que la clé primaire de spip_bidibules) et deux champs id_objet et objet.
</blockquote>Si vous aviez l’habitude de penser aux liens des articles vers les mots, il va falloir changer votre vocabulaire : chaque mot peut porter plusieurs :
- et/ou un lien vers un article (donc vers tout/tous articles)
- et/ou et un lien vers toute occurrence de tout autre objet...
Ce n’est pas l’article qui porte un lien vers le mot-clé !
Cette petite précision prendra toute son importance pour bien utiliser les deux tableaux $objets_source
(ici les mots), et <code>$objets_lies</code >, qui code>$objets_lies,qui seront d’abord les articles, puis dans un second temps les message de forum.
SPIP sait toujours générer les bonnes jointures (voir l’article rappelant les jointures automatiques) dans vos squelettes ; il ne semble donc pas y avoir de changement..
Par contre, tout le code php éventuellement écrit pour suivre des formulaires CVT personnalisés, va devoir vadevoir suivre une uen refonte, et peut gagner a être utiliser avec les nouvelles API ; en particulier les sélections peuvent devenir plus faciles à traiter...
Appliquons par exemple la nouvelle fonction de sélection
objet_trouver_liens<code>
<quote>
objet_trouver_liens($objets_source,$objets_lies) permet de retrouver tous les liens de $objets_source vers $objets_lies.</quote>
Plus besoin d'écrire une série de filtres SQL avec des clauses WHERE [[ Where [[ Les clauses SQL , qui doivent être chaines de caractères, posent souvent des difficultés entre les champs texte, les champs numériques à interpréter, et les noms de champs...]]... Il suffit d'insérer dans les définitions de tableaux associatifs, les bonnes valeurs !
- en spip 2 <code> $where = " id_forum = ".sql_quote($id_forum);
= sql_allfetsel('id_mot', "spip_mots_forum", $where );
devient <code> = sql_allfetsel('id_mot', "spip_mots_liens", $where );
.
Il vous est suggéré d’utiliser directement
objet_trouver_liens( array('mot'=>'*'), array('forum'=>$id_forum));
.
Autre avantage, vous allez récupérer automatiquement l’ensemble des champs ....
J’ai découvert que le même mode de gestion est généralisé aux forums : en clair, vous n’avez plus un champ id_article
dans votre table FORUMS mais le couple de champs : objet
(contenant ici la valeur ’article’ ) et bien sur la clé de cet article dans id_objet
.
La suppression brutale des liens de mots-clés sur un forum se faisait par
$where = " objet = 'forum' AND id_objet = ".sql_quote($id_forum) ;
sql_delete ('spip_mots_liens', $where);
Vous utiliserez désormais simplement :
objet_dissocier( array('mot'=>'*') , array( 'forum' => $id_forum ) );
Et inscrire le résultat de votre saisie [1] deviendra :
objet_associer( array('mot'=>$ajouter_mot , array( 'forum' => $id_forum ) );
Je n’ai trouvé qu’un manque : disposer d’un troisième argument pour limiter les manipulations à un groupe de mots (parce que, quand vous traitez beaucoup de groupes de mots dans votre utilisation....)