Plugin Identifiants

This contribution or plugin is actually being tested. Issues may occur, don’t hesitate to report those in following post’s comments.

Donner des identifiants textes uniques aux objets.

Préambule

Lors de l’écriture de squelettes, vous est-il déjà arrivé de devoir sélectionner un article en particulier, ou une rubrique précise ?

Par défaut, le seul champ qui permette d’identifier un objet de façon unique est son numéro : #ID_RUBRIQUE, #ID_ARTICLE, etc.
Mais un numéro, ce n’est pas très parlant !

On peut s’en sortir en choisissant l’objet en fonction d’un mot-clé technique ou de son numéro (la mort dans l’âme !), mais ce ne sont pas des méthodes idéales : un mot-clé n’est pas unique pour un type d’objet, et un numéro ne véhicule aucun sens.

<BOUCLE_x(ARTICLES){id_article=5}>
<BOUCLE_x(ARTICLES){titre_mot=truc}>

Un critère {identifiant}

L’objet de ce plugin est de permettre d’attribuer un identifiant texte unique aux objets, qui pourront ensuite être sélectionnés au moyen du critère {identifiant=x}.

<BOUCLE_x(ARTICLES){identifiant=truc}>
<BOUCLE_y(RUBRIQUES){identifiant=machin}>
<BOUCLE_z(PATATES){identifiant=chose}>
etc.

Format

Un identifiant ne comporte que caractères alphanumériques ou le signe «_» : pas de majuscule, ni de caractère spécial ou accentué, ni d’espace.
Ex. : Mentions légalesmentions_legales.

Unicité

Un identifiant est unique pour un type d’objet : 2 articles ne peuvent pas avoir le même identifiant toto, mais on peut donner le même identifiant patate à un article et une rubrique par exemple.

Autres plugins

À noter que pour les articles, le plugin Pages uniques utilise le même concept d’identifiant unique avec le champ #PAGE. Cette idée est élargie ici à tout type d’objet.

D’autres plugins proposent des objets ayant déjà un champ #IDENTIFIANT, comme les formulaires du plugin Formidable, le générateur de formulaire par exemple. On peut utiliser les plugins de concert, leur fonctionnement n’est pas perturbé.

Utilisation

Par défaut, seuls les webmestres ont la possiblité de voir et modifier les identifiants. C’est une information qui n’a à priori n’a aucun intérêt pour les rédacteurs ni même les administrateurs.
Il est possible que ça évolue par la suite, en attendant, ces 2 autorisations peuvent être surchargées au besoin.

Configurer

Tout d’abord, il faut choisir sur quels types d’objets on peut ajouter des identifiants. Les tables qui possèdent déjà un champ «identifiant» ne sont pas listées, et sont indiquées pour référence dans le descriptif de la saisie.

Configurer
Configuration du plugin Identifiants

Éditer

On peut définir ou modifier les identifiants en éditant les objets : une saisie est ajoutée au formulaire, au niveau des champs extras, en bas.

Éditer
Édition de l’identifiant d’un objet

Voir

Les identifiants sont visibles sous le numéro de l’objet, dans la boîte d’infos à gauche.

Voir
Boîtes infos avec l’identifiant texte sous l’identifiant numérique

Technique

Les identifiants sont stockés dans une table auxiliaire spip_identifiants, qui contient les champs #OBJET, #ID_OBJET, #IDENTIFIANT et #MAJ.

Quand on édite un identifiant et qu’on “l’efface”, la ligne correspondante est supprimée dans la table.

Une jointure avec cette table est opérée automatiquement pour tous les objets.

À priori, on utilisera les identifiants avec parcimonie, pour des besoins bien précis.

Discussion

5 discussions

  • 10

    Bonjour,

    Suite à la mise à jour de SPIP 3.3.0-dev :

    <BOUCLE_(GROUPES_MOTS){identifiant=toto}>
    #TITRE
    </BOUCLE_>

    ne renvoi plus le titre du groupe de mots, alors qu’il n’y avait pas de souci auparavant.

    Dans la table IDENTIFIANTS, l’identifiant toto est bien enregistré avec comme objet groupe_mot. Précédemment, il me semble qu’il y avait 2 enregistrements pour le même identifiant : groupe_mot et groupe_mots.

    • Hello,

      Ça produit quelle requête sql ?
      Et ça marche plus uniquement depuis le passage en 3.3 ?

      Si c’est une histoire de jointure foireuse la v2 du plugin règlera sans doute le problème car ça n’utilise plus de table auxiliaire. Je devais finir les tests avant de releaser... Mais ça traîne :)

      Précédemment, il me semble qu’il y avait 2 enregistrements pour le même identifiant : groupe_mot et groupe_mots.

      Ah, ça je vois pas trop comment c’est possible. Le doublon a été supprimé à la main ?

    • Tout fonctionnait déjà en 3.3 : la version date d’il y a 2 mois environ.

      La requête : http://spip.pastebin.fr/88034

    • Je suppose que le problème vient de cette partie de la requête, où « groupe_mot » est devenu « groupe » tout court :

      array('=', 'L1.objet', sql_quote('groupe')),

      Bon pour déboguer il faudrait que je puisse reproduire, s’il n’y a pas de choses confidentielles est-ce que tu pourrais transmettre un dump de ta table spip_identifiants ? (au format csv ou autre)

      Ps : avec le mode debug en cliquant sur le lien « résultat » d’une boucle ça te donne la requête sql telle quelle, bien plus lisible :)

    • Est-ce que cela peut t’aider :

      INSERT INTO `spip_identifiants` (`identifiant`, `objet`, `id_objet`, `maj`) VALUES
      ('boutique',	'groupe_mot',	2,	'2021-03-19 16:28:34');
    • ... et pour la requête :

      SELECT L1.id_objet, L1.id_objet AS id_groupe
      FROM spip_identifiants AS `L1`  
      WHERE (L1.objet = 'groupe')
      	AND (L1.identifiant = 'boutique')
      GROUP BY L1.id_objet
    • Je constate que sur une version «plus ancienne» de SPIP3.3-dev, toujours avec Identifiants 1.1.16, la requête est la suivante :

      SELECT L1.id_objet, L1.id_objet AS id_groupe
      FROM spip_identifiants AS `L1`  
      WHERE (L1.identifiant = 'boutique')
      GROUP BY L1.id_objet
    • J’ai fait quelques tests et j’ai une erreur similaire avec la dist, hors plugins identifiants.
      Comme tu dis que ça fonctionnait il y a quelque temps, ça voudrait dire que quelque chose a changé avec les jointures Spip, donc ticket : https://core.spip.net/issues/4701

      Tout ça pousserait à sortir la v2 du plugin dis donc :)
      La version est prête mais il reste à bien la tester pour s’assurer qu’il n’y a pas de régression.
      Si tu as l’âme d’un aventurier tu peux l’essayer de suite, c’est la branche “master” sur le git (en prenant soin de faire une backup de la bdd avant au cas-où).

    • Merci pour le ticket @tcharlss, et merci à @cedric pour le correctif !

      Bien sûr, je vais tester ta V2.

    • Bugs :
      -  lang > identifiants_fr.php
      - ligne 44 > êtes-vous (avec un tiret)


      Remarque :
      -  on peut configurer Groupes de mots-clés, Mots-clés et Sites référencés même si on n’a pas choisi de les utiliser dans Contenu du site


      Tests :
      Identifiants 1.1.16 :
      SPIP3.2.9 :
      -  obligation de mettre à jour la ligne comme cedric https://git.spip.net/spip/spip/commit/f8c6aa9ac2dc43182faf0a2bcd38b6164c65c471 pour que Groupes-mots soit bien retrouvé

      SPIP3.3-DEV avec correctif de cedric :
      -  tout fonctionne bien


      Identifiants 2.0.2 -> activation et donc mise à jour de la 1.1.16 déjà installée :
      SPIP3.2.9 :
      -  la colonne identifiant est bien ajoutée aux objets
      -  la migration des identifiants de la table vers les colonnes est OK
      -  la table identifiant est bien détruite
      -  obligation de mettre à jour la ligne comme cedric https://git.spip.net/spip/spip/commit/f8c6aa9ac2dc43182faf0a2bcd38b6164c65c471 pour que Groupes-mots soit bien retrouvé

      SPIP3.3-DEV avec correctif de cedric :
      -  la colonne identifiant est bien ajoutée aux objets
      -  la migration des identifiants de la table vers les colonnes est OK
      -  la table identifiant est bien détruite
      -  tout fonctionne bien ;-)

    Reply to this message

  • 1

    Salut,

    Pour la balise #IDENTIFIANT je tenterai bien un truc du genre pour éviter de passer par une fonction de calcul.

     // $p->code =  'identifiant_objet("' . $_objet . '",' . $_id . ')';
     $p->code =  champ_sql('identifiant') . '?: identifiant_objet("' . $_objet . '",' . $_id . ')';

    J’ai supprimé une notice mais j’ai pas osé commit cette modif :)
    https://zone.spip.net/trac/spip-zone/changeset/111925/spip-zone

    Je ne suis pas certain que l’exécution de la fonction objet_identifiant soit réellement esquivée. des avis?

    • Salut pierre,

      Oui bien vu, ça pourrait éviter une requête sql inutile.
      À tester, et si ça fonctionne, go go go comme dirait l’autre !

    Reply to this message

  • Je découvre : excellent, merci tcharlss !

    Reply to this message

  • 2

    Le concept est sympa par contre j’ai rencontré un soucis : lorsque l’on supprime une rubrique qui a un identifiant, celui-ci n’est pas supprimé de la table spip_identifiants et ne peut donc être réattribué.

    Reply to this message

  • Bravo ! Bravissimo ! +++++ !

    Reply to this message

Add a comment

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite / PostgreSQL
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparait.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Who are you?
[Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom