Plugin Fields vs campos personalizados nativos no GLPI 11

Campos personalizados no GLPI 11: quando usar o plugin Fields (campos em tipos existentes) e quando modelar objetos personalizados nativos. Comparativo, veredicto por cenário, o custo real de manutenção e a armadilha da atualização.

Neste artigo6 secções

Um campo personalizado no GLPI é uma decisão de arquitetura, não um clique. A pergunta certa não é "Fields ou nativo?", mas sim: o dado que precisa de guardar é um atributo de algo que já existe, ou é uma coisa nova com vida própria? Essa resposta define a ferramenta - e o custo que paga nos próximos anos.

O que cada abordagem realmente resolve

O plugin Fields (mantido pela Teclib) pendura campos extra em tipos de item que já existem no GLPI: chamado, computador, utilizador, contrato, fornecedor. Cria um contentor (um bloco de campos), escolhe em que tipos aparece e adiciona campos de texto, lista pendente, data, número, sim/não e URL. Continua a ser a forma prática de dizer "todo o chamado precisa de um campo Centro de Custo".

Os objetos personalizados do GLPI 11 (ativos personalizados) resolvem outro problema: criar um tipo de item novo diretamente no core, sem plugin. É o substituto oficial do antigo GenericObject. Define "Veículo", "Sala de Reuniões" ou "Equipamento de Laboratório" com campos próprios, e passa a comportar-se como um ativo de primeira classe: entra no inventário, liga-se a chamados, aparece em relatórios.

Resumindo a fronteira: Fields adiciona atributos a algo que existe; um objeto nativo cria a entidade. Confundir os dois está na origem de quase toda a dor de manutenção que aparece depois.

Comparativo direto

CritérioPlugin FieldsObjeto personalizado (GLPI 11 nativo)
O que fazAdiciona campos a tipos que já existemCria um tipo de item novo
Depende de pluginSim - dependência dura na atualização maiorNão - está no core
Onde guarda os dadosUma tabela por contentor, paralela ao coreNo schema nativo do GLPI
Campos condicionais / por perfilSim, mas a visibilidade é apresentação, não segurançaSem lógica condicional nativa
Pesquisa e relatóriosSearch options com um LEFT JOIN por contentorSearch options nativas, sem tabela extra
Integração com inventárioNão recebe dados de inventárioSim, é um ativo inventariável
Migração GLPI 10 para 11Exige versão do plugin compatível com o novo coreDestino oficial do GenericObject
Esforço para começarMinutos para um campoHoras para modelar um tipo
Melhor paraAtributos de algo que já existeUma entidade nova com vida própria

Onde os dados vivem (e porque isso importa)

Cada contentor do Fields torna-se uma tabela dedicada na base de dados, com uma linha por item e uma coluna por campo. Antes de decidir, vale a pena ver o que já existe no ambiente:

-- Onde o plugin Fields guarda os valores: uma tabela por contentor,
-- com uma linha por item e uma coluna por campo personalizado.
SELECT table_name AS tabela_de_contentor
FROM information_schema.tables
WHERE table_schema = DATABASE()
  AND table_name LIKE 'glpi_plugin_fields_%'
ORDER BY table_name;

-- Definicoes: contentores (a que tipos se aplicam) e os campos de cada um
SELECT c.name AS contentor, c.itemtypes, f.name AS campo, 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;

Isto importa por dois motivos operacionais. Primeiro: cada campo do Fields marcado como pesquisável torna-se uma search option, e o motor de pesquisa do GLPI resolve-a com um LEFT JOIN adicional na tabela do contentor. Num cliente com 15 ou mais contentores no Ticket, a lista de chamados começa a ficar lenta - não pelo volume de dados, mas pela quantidade de JOINs no SELECT da pesquisa. Segundo: os objetos nativos escrevem no schema do core, portanto saem em exportação, API e relatório com o mesmo tratamento dos campos padrão, sem tabela paralela para reconciliar.

O trade-off que aparece na sustentação

Na gestão de parques GLPI para clientes, o custo real do Fields não é instalar - é o dia da atualização maior. O Fields é uma dependência dura: numa migração de GLPI 10 para 11, o ambiente só arranca quando existe versão do plugin compatível com o novo core. Já seguramos a janela de atualização de um cliente à espera de o plugin publicar a build compatível, com dezenas de contentores em produção que não podíamos simplesmente desligar. Um objeto nativo não tem esse bloqueio: é o core, sobe com ele.

Dois erros comuns que corrigimos com frequência. O primeiro é modelar uma entidade inteira como uma pilha de campos no chamado - "Contrato de manutenção" a tornar-se 12 campos Fields no Ticket, impossível de listar, filtrar ou relacionar bem; ali cabia um objeto (ou o próprio módulo de Contratos do GLPI). O segundo é o oposto: criar um ativo personalizado inteiro para o que eram dois atributos organizacionais num tipo existente - complexidade de modelação sem retorno. E um alerta que damos sempre: esconder um campo do Fields por perfil é apresentação, não segurança. O valor continua na base de dados e escapa por API, exportação ou pesquisa. Se o dado for sensível, o controlo tem de estar noutro lugar.

Veredicto por cenário

Use o Fields quando o dado é atributo de um tipo que já existe e não quer gerir um tipo novo: centro de custo e projeto no chamado, património interno no computador, número de funcionário no utilizador, campos obrigatórios ou condicionais por categoria de chamado. É rápido, sem downtime e sem migração de schema para administrar.

Use um objeto personalizado nativo quando a "coisa" tem vida própria e vai listá-la, filtrá-la e ligá-la a chamados como um item: veículos, salas, ativos de laboratório, equipamentos que não cabem em nenhum tipo padrão. E, obrigatoriamente, quando estiver a sair do GenericObject na migração para o GLPI 11 - é o caminho de substituição oficial.

Os dois convivem. É legítimo ter um ativo personalizado para a entidade e, ainda assim, usar o Fields para pendurar um ou outro atributo organizacional em chamados que referenciam esse ativo. O que não vale é usar um para fazer o trabalho do outro.

Custo e esforço

Licença: ambos são gratuitos (GPL). O custo verdadeiro é de manutenção. O Fields cobra em risco de dependência a cada atualização maior e em peso de pesquisa à medida que os contentores crescem. Um objeto nativo cobra em modelação inicial - desenha um tipo, não adiciona apenas um campo - mas depois não pesa na atualização nem num JOIN paralelo. Como intervalo honesto: adicionar um campo Fields leva minutos; modelar um ativo personalizado bem feito leva de algumas horas a um dia, contando campos, perfis e integração com inventário.

Na NexTool implementamos e sustentamos as duas abordagens no GLPI de clientes. Se está a decidir entre pendurar mais campos ou modelar um objeto - ou precisa de sair do GenericObject sem partir o histórico - a nossa consultoria de GLPI ajuda a fechar essa decisão antes de se tornar dívida técnica.


Revisto pela equipa NexTool Solutions.

Perguntas Frequentes

Sim, o Fields tem linha compatível com o GLPI 11 e continua a ser a forma prática de adicionar campos a tipos que já existem (chamado, computador, utilizador). O ponto de atenção não é a compatibilidade em si, mas o timing: numa atualização maior, o ambiente só arranca quando existe a build do plugin para o novo core. Planeie a janela contando com essa dependência.

Depende do caso. Os campos nativos do GLPI 11 vivem nos objetos personalizados (ativos personalizados) - um tipo de item novo que cria no core. Para pendurar campos em tipos que já existem, como Ticket ou Computer, o Fields continua a ser o caminho prático. Troca o Fields pelo nativo quando o que precisava era, na verdade, uma entidade nova, e não mais atributos num tipo existente.

Podem deixar. Cada campo pesquisável torna-se uma search option, e o motor de pesquisa resolve-a com um LEFT JOIN na tabela do contentor. Com muitos contentores no Ticket (na prática, a partir de 15 ou mais), a pesquisa acumula JOINs e a listagem perde desempenho. Mitigue não marcando como pesquisável o que não precisa de aparecer na pesquisa e agrupando campos em menos contentores.

Não. A visibilidade por perfil no Fields é uma questão de apresentação, não de segurança. O valor continua guardado na tabela do contentor e pode ser lido via API, exportação ou pesquisa por quem tiver direito de acesso ao item. Se o dado for sensível, o controlo tem de estar na camada de permissões do próprio item ou fora do Fields.

Os objetos personalizados são o substituto oficial do GenericObject no GLPI 11. Na prática recria cada tipo do GenericObject como um ativo personalizado, remapeia os campos e migra os dados. Não existe um único botão de conversão automática garantida, por isso trate-o como um projeto: inventarie os tipos, mapeie campos, valide as ligações com chamados e teste em homologação antes de produção.

Precisa de ajuda?