Plugin Identifiants

Donner des identifiants textes uniques aux objets.

Documentation à jour pour la version 2

Objet du plugin

Ce plugin est un outil à destination des intégrateur⋅ices : il permet d’attribuer des identifiants textes, uniques ou non, à tous les types de contenus.

Cela permet de cibler préciséments ces contenus dans vos boucles ou requêtes SQL, sans avoir recours à des méthodes moins fiables ou plus compliquées : n° de clé primaire, champs « détournés », mots-clés, etc.

Il s’agit tout simplement d’un champ identifiant ajouté sur les tables concernées, complété par des vérifications de format et d’unicité.

Fonctionnement

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é

Les identifiants peuvent être uniques ou réutilisables, le fonctionnement peut être changé dans la configuration du plugin.

Lorsque le mode unique est activé, les identifiants ne sont alors utilisables qu’une seule fois pour chaque type d’objet.

Autres plugins

D’autres plugins proposent des objets ayant nativement un champ identifiant, comme les formulaires du plugin Formidable ou les Sélections éditoriales par exemple. On peut utiliser les plugins de concert, leur fonctionnement n’est pas perturbé.

Utilisation dans les squelettes

Critère {identifiant}

Un simple critère qui correspond au nom de la colonne, et s’utilise classiquement :

<BOUCLE_x(ARTICLES) {identifiant = truc}>
<BOUCLE_y(RUBRIQUES) {identifiant?}>
<BOUCLE_z(PATATES) {identifiant = #GET{mon_param}}>
etc.

Balise #IDENTIFIANT

La balise #IDENTIFIANT peut s’utiliser de 2 façons :

  • Sans paramètre si l’on est dans une boucle : #IDENTIFIANTS
  • 2 paramètres objet et id_objet : #IDENTIFIANTS{article, 10}

Utilisation dans l’espace privé

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édacteur⋅ices ni même les administrateur⋅ices.

L’autorisation peut être surchargée au besoin.

Configuration

On peut choisir quels types de contenus peuvent se voir attribuer 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.

La config permet également de choisir si les identifiants peuvent être réutilisables ou non : activer l’option désactive la vérification de l’unicité lors de l’édition.

Capture d'écran de la page de configuration du plugin Identifiants
Configuration du plugin Identifiants

Édition

Lors de l’édition des contenus, le champ identifiant est ajouté sous le titre. À défaut de titre, il sera présent au niveau des champs extras, en bas du formulaire.

Capoture d'écran montrant un formulaire d'édition d'article avec un champ identifiant
Édition d’un identifiant

Aperçu

En mode aperçu, les identifiants sont visibles sous le numéro du contenu, dans la boîte d’infos sur le côté.

Capture d'écran montrant un identifiant texte sous le numéro d'un article
Aperçu d’un identifiant

Page de contrôle

Une page de contrôle vous permet de voir tous les identifiants existants, avec des filtres par type de contenu.

Capture d'écran de la page de contrôle des identifiants
Page de contrôle des identifiants

Technique

À partir de la version 2, les identifiants sont stockés directement dans les tables des objets activés : une colonne identifiant est ajoutée automatiquement lorsqu’on choisit des objets dans la configuration du plugin.

Celle-ci est supprimée lors de la désinstallation ou lorsqu’on déselectionne les contenus dans la config.

Les tables possédant nativement une colonne identifiant ne sont pas concernées : pas de risque de perte de données pour celles-ci (formulaires formidable, sélections éditoriales, etc).

Avant la version 2, les identifiants étaient stockés dans une table auxiliaire spip_identifiants.

Discussion

5 discussions

  • 11

    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 <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3BpcF9pZGVudGlmaWFudHM8L2NvZGU+"></span> (<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+aWRlbnRpZmlhbnQ8L2NvZGU+"></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+b2JqZXQ8L2NvZGU+"></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+aWRfb2JqZXQ8L2NvZGU+"></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bWFqPC9jb2RlPg=="></span>) 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 <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+TDE8L2NvZGU+"></span>  
      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 <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+TDE8L2NvZGU+"></span>  
      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 ;-)

    • Bonjour tout le monde,

      Petit retour @tcharlss : depuis presque un an, tout fonctionne très bien ;-)

      françois

    Répondre à ce 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 !

    Répondre à ce message

  • Je découvre : excellent, merci tcharlss !

    Répondre à ce 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é.

    Répondre à ce message

  • Bravo ! Bravissimo ! +++++ !

    Répondre à ce message

Ajouter un commentaire

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
  • 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 apparaît.

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.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom