Plugin Fields vs champs personnalisés natifs dans GLPI 11

Champs personnalisés dans GLPI 11 : quand utiliser le plugin Fields (champs sur des types existants) et quand modéliser des objets personnalisés natifs. Comparatif, verdict par scénario, le vrai coût de maintenance et le piège de la mise à niveau.

Dans cet article6 sections

Un champ personnalisé dans GLPI est une décision d'architecture, pas un clic. La bonne question n'est pas "Fields ou natif ?", mais plutôt : la donnée que vous devez stocker est-elle un attribut de quelque chose qui existe déjà, ou une nouvelle chose avec une vie propre ? Cette réponse définit l'outil - et le coût que vous payez pendant les années à venir.

Ce que chaque approche résout vraiment

Le plugin Fields (maintenu par Teclib) accroche des champs supplémentaires à des types d'élément qui existent déjà dans GLPI : ticket, ordinateur, utilisateur, contrat, fournisseur. Vous créez un conteneur (un bloc de champs), choisissez sur quels types il apparaît et ajoutez des champs texte, liste déroulante, date, nombre, oui/non et URL. Il reste la façon pratique de dire "chaque ticket a besoin d'un champ Centre de Coût".

Les objets personnalisés de GLPI 11 (actifs personnalisés) résolvent un autre problème : créer un nouveau type d'élément directement dans le cœur, sans plugin. C'est le remplaçant officiel de l'ancien GenericObject. Vous définissez "Véhicule", "Salle de Réunion" ou "Équipement de Laboratoire" avec leurs propres champs, et il se comporte comme un actif de première classe : il entre dans l'inventaire, se lie aux tickets, apparaît dans les rapports.

Pour résumer la frontière : Fields ajoute des attributs à quelque chose qui existe ; un objet natif crée l'entité. Confondre les deux est à l'origine de presque tous les problèmes de maintenance qui apparaissent plus tard.

Comparatif direct

CritèrePlugin FieldsObjet personnalisé (GLPI 11 natif)
Ce qu'il faitAjoute des champs à des types déjà existantsCrée un nouveau type d'élément
Dépend d'un pluginOui - dépendance dure lors d'une mise à niveau majeureNon - il est dans le cœur
Où sont stockées les donnéesUne table par conteneur, parallèle au cœurDans le schéma natif de GLPI
Champs conditionnels / par profilOui, mais la visibilité est de l'affichage, pas de la sécuritéPas de logique conditionnelle native
Recherche et rapportsSearch options avec un LEFT JOIN par conteneurSearch options natives, sans table en plus
Intégration inventaireNe reçoit pas de données d'inventaireOui, c'est un actif inventoriable
Migration GLPI 10 vers 11Nécessite une version du plugin compatible avec le nouveau cœurDestination officielle de GenericObject
Effort pour démarrerMinutes pour un champHeures pour modéliser un type
Idéal pourAttributs de quelque chose qui existe déjàUne nouvelle entité avec une vie propre

Où vivent les données (et pourquoi cela compte)

Chaque conteneur Fields devient une table dédiée dans la base, avec une ligne par élément et une colonne par champ. Avant de décider, il vaut la peine de voir ce qui existe déjà dans l'environnement :

-- Ou le plugin Fields stocke les valeurs : une table par conteneur,
-- avec une ligne par element et une colonne par champ personnalise.
SELECT table_name AS table_de_conteneur
FROM information_schema.tables
WHERE table_schema = DATABASE()
  AND table_name LIKE 'glpi_plugin_fields_%'
ORDER BY table_name;

-- Definitions : conteneurs (a quels types ils s'appliquent) et leurs champs
SELECT c.name AS conteneur, c.itemtypes, f.name AS champ, f.type
FROM glpi_plugin_fields_containers c
JOIN glpi_plugin_fields_fields f
  ON f.plugin_fields_containers_id = c.id
ORDER BY c.name, f.ranking;

Cela compte pour deux raisons opérationnelles. D'abord : chaque champ Fields marqué comme recherchable devient une search option, et le moteur de recherche de GLPI la résout avec un LEFT JOIN supplémentaire sur la table du conteneur. Chez un client avec 15 conteneurs ou plus sur Ticket, la liste des tickets commence à ralentir - pas à cause du volume de données, mais du nombre de JOINs dans le SELECT de la recherche. Ensuite : les objets natifs écrivent dans le schéma du cœur, donc ils sortent en export, API et rapport avec le même traitement que les champs standard, sans table parallèle à réconcilier.

Le compromis qui apparaît en maintenance

Quand on maintient des parcs GLPI pour des clients, le vrai coût de Fields n'est pas de l'installer - c'est le jour de la mise à niveau majeure. Fields est une dépendance dure : lors d'une migration de GLPI 10 vers 11, l'environnement ne démarre que lorsqu'il existe une version du plugin compatible avec le nouveau cœur. Nous avons déjà retenu la fenêtre de mise à niveau d'un client en attendant que le plugin publie la build compatible, avec des dizaines de conteneurs en production qu'on ne pouvait pas simplement éteindre. Un objet natif n'a pas ce verrou : il est le cœur, il monte avec lui.

Deux erreurs fréquentes que nous corrigeons souvent. La première est de modéliser une entité entière comme un tas de champs sur le ticket - "Contrat de maintenance" devenant 12 champs Fields sur Ticket, impossible à lister, filtrer ou relier correctement ; il fallait là un objet (ou le module Contrats de GLPI lui-même). La seconde est l'inverse : créer un actif personnalisé entier pour ce qui n'était que deux attributs organisationnels sur un type existant - de la complexité de modélisation sans retour. Et un avertissement que nous donnons toujours : cacher un champ Fields par profil, c'est de l'affichage, pas de la sécurité. La valeur reste dans la base et fuit via API, export ou recherche. Si la donnée est sensible, le contrôle doit être ailleurs.

Verdict par scénario

Utilisez Fields quand la donnée est un attribut d'un type qui existe déjà et que vous ne voulez pas gérer un nouveau type : centre de coût et projet sur le ticket, numéro d'inventaire interne sur l'ordinateur, matricule sur l'utilisateur, champs obligatoires ou conditionnels par catégorie de ticket. C'est rapide, sans interruption et sans migration de schéma à administrer.

Utilisez un objet personnalisé natif quand la "chose" a une vie propre et que vous allez la lister, la filtrer et la lier aux tickets comme un élément : véhicules, salles, actifs de laboratoire, équipements qui n'entrent dans aucun type standard. Et, obligatoirement, quand vous quittez GenericObject dans la migration vers GLPI 11 - c'est le chemin de remplacement officiel.

Les deux coexistent. Il est légitime d'avoir un actif personnalisé pour l'entité et d'utiliser tout de même Fields pour accrocher l'un ou l'autre attribut organisationnel sur des tickets qui référencent cet actif. Ce qui ne va pas, c'est d'utiliser l'un pour faire le travail de l'autre.

Coût et effort

Licence : les deux sont gratuits (GPL). Le vrai coût est la maintenance. Fields facture en risque de dépendance à chaque mise à niveau majeure et en poids de recherche à mesure que les conteneurs grandissent. Un objet natif facture en modélisation initiale - vous concevez un type, vous n'ajoutez pas seulement un champ - mais ensuite il ne pèse ni sur la mise à niveau ni sur un JOIN parallèle. Comme fourchette honnête : ajouter un champ Fields prend des minutes ; modéliser un actif personnalisé bien fait prend de quelques heures à une journée, en comptant champs, profils et intégration à l'inventaire.

Chez NexTool nous déployons et maintenons les deux approches sur le GLPI de nos clients. Si vous hésitez entre accrocher plus de champs ou modéliser un objet - ou si vous devez quitter GenericObject sans casser l'historique - notre conseil GLPI aide à trancher avant que cela devienne de la dette technique.


Révisé par l'équipe NexTool Solutions.

Questions fréquentes

Oui, Fields a une ligne compatible GLPI 11 et reste la façon pratique d'ajouter des champs à des types déjà existants (ticket, ordinateur, utilisateur). Le point de vigilance n'est pas la compatibilité en soi mais le timing : lors d'une mise à niveau majeure, l'environnement ne démarre que lorsque la build du plugin pour le nouveau cœur existe. Planifiez la fenêtre en tenant compte de cette dépendance.

Cela dépend du cas. Les champs natifs de GLPI 11 vivent sur les objets personnalisés (actifs personnalisés) - un nouveau type d'élément que vous créez dans le cœur. Pour accrocher des champs à des types déjà existants, comme Ticket ou Computer, Fields reste la voie pratique. On remplace Fields par le natif quand ce dont on avait besoin était en fait une nouvelle entité, pas davantage d'attributs sur un type existant.

Ils le peuvent. Chaque champ recherchable devient une search option, et le moteur de recherche la résout avec un LEFT JOIN sur la table du conteneur. Avec beaucoup de conteneurs sur Ticket (en pratique, à partir de 15 ou plus), la recherche accumule les JOINs et la liste perd en performance. Atténuez en ne marquant pas comme recherchable ce qui n'a pas besoin d'apparaître dans la recherche et en regroupant les champs dans moins de conteneurs.

Non. La visibilité par profil dans Fields est une question d'affichage, pas de sécurité. La valeur reste stockée dans la table du conteneur et peut être lue via API, export ou recherche par quiconque a le droit d'accès à l'élément. Si la donnée est sensible, le contrôle doit se situer à la couche de permission de l'élément lui-même ou en dehors de Fields.

Les objets personnalisés sont le remplaçant officiel de GenericObject dans GLPI 11. En pratique, vous recréez chaque type GenericObject comme un actif personnalisé, vous remappez les champs et vous migrez les données. Il n'y a pas de bouton unique de conversion automatique garantie, alors traitez cela comme un projet : inventoriez les types, mappez les champs, validez les liens avec les tickets et testez en recette avant la production.

Besoin d'aide ?