KB-PLUGIN-038: adiciona gotcha do registerClass com barra invertida inicial

isPluginItemType() rejeita '\GlpiPlugin\...' e registerClass falha
silenciosamente — tab addtabon some sem erro em log (visto no butterfly).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Gemini 2026-07-03 18:15:03 -03:00
parent 235e4679ac
commit 40c5fe82a9

View file

@ -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/<key>/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 é `<itemtype-sem-barra>$<n>` (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).