From 40c5fe82a9476bdd0b3b4de0ec64113bd10a313c Mon Sep 17 00:00:00 2001 From: Gemini Date: Fri, 3 Jul 2026 18:15:03 -0300 Subject: [PATCH] KB-PLUGIN-038: adiciona gotcha do registerClass com barra invertida inicial MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit isPluginItemType() rejeita '\GlpiPlugin\...' e registerClass falha silenciosamente — tab addtabon some sem erro em log (visto no butterfly). Co-Authored-By: Claude Fable 5 --- ...38-glpi11-frontend-assets-monaco-public.md | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/records/plugin-dev/KB-PLUGIN-038-glpi11-frontend-assets-monaco-public.md b/records/plugin-dev/KB-PLUGIN-038-glpi11-frontend-assets-monaco-public.md index 8aa93b9..96cb751 100644 --- a/records/plugin-dev/KB-PLUGIN-038-glpi11-frontend-assets-monaco-public.md +++ b/records/plugin-dev/KB-PLUGIN-038-glpi11-frontend-assets-monaco-public.md @@ -124,10 +124,39 @@ ls /var/www/glpi/public/lib | grep -i codemirror # NÃO existe curl -s -o /dev/null -w "%{http_code}" http://localhost/plugins//pics/x.png ``` +## 5. Plugin::registerClass NUNCA com barra invertida inicial + +`Plugin::registerClass('\GlpiPlugin\Meuplugin\Config', ...)` **falha +silenciosamente** (retorna `false`): a primeira coisa que ele faz é +`isPluginItemType($itemtype)`, cuja regex não aceita `\` inicial. +Sintoma observado no butterfly: tab de config registrada via `addtabon` +simplesmente não aparece em Configuração > Geral, sem nenhum erro em log. + +```php +// ERRADO — isPluginItemType() retorna false, registerClass vira no-op +Plugin::registerClass('\GlpiPlugin\Butterfly\Config', ['addtabon' => ['Config']]); + +// CERTO — ::class nunca inclui a barra inicial +Plugin::registerClass(\GlpiPlugin\Butterfly\Config::class, ['addtabon' => ['Config']]); +``` + +O mesmo vale para o valor de `glpi_tab`/`forcetab` em URLs: a chave da tab +gerada pelo core é `$` (ex.: +`GlpiPlugin\Butterfly\Config$1`), então o link de `config_page` deve usar +`rawurlencode('GlpiPlugin\Butterfly\Config') . '$1'`. + +Diagnóstico rápido (kernel bootado): + +```php +var_dump(isPluginItemType('\GlpiPlugin\Meuplugin\Config')); // false = problema +// e inspecionar CommonGLPI::$othertabs via Reflection para ver o que registrou +``` + ## Regra para agentes Ao portar plugin GLPI 9/10 → 11, fazer grep por: `CodeMirror`, `.tabs(`, -`.dialog(`, `new .*FileVersion|__toString`, `'../plugins/`, e conferir se todo +`.dialog(`, `new .*FileVersion|__toString`, `'../plugins/`, +`registerClass('\\` (barra inicial), e conferir se todo asset estático referenciado por URL está dentro de `public/`. Cada acerto desses é quebra silenciosa (só aparece no console do browser ou como 404).