Carnet Wiki

Mots-clés en SPIP 3

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).

Tables des 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é taggant
  • objet : la nature de l’objet pointé (associé) à ce mot
  • id_objet : la clé identifiant l’enregistrement objectif dans sa table

C ’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.

La Gestion des accès

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 ....

Application aux Forums

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....)