2.3 KiB
| id | title | domain | tags | status | severity | created_at | updated_at | applies_to | related_records | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| KB-PLUGIN-004 | Chave do hook ADD_JAVASCRIPT deve ser o plugin key exato | plugin-dev |
|
active | high | 2026-05-02 | 2026-05-02 |
|
|
Contexto
Ao registrar arquivos JS em setup.php via $PLUGIN_HOOKS[Hooks::ADD_JAVASCRIPT],
a chave do array deve ser exatamente o plugin key — o mesmo nome do diretório do plugin.
Sintoma observável
- O arquivo JS do plugin nunca é incluído nas páginas do GLPI.
- Nenhum erro é exibido — a falha é silenciosa.
- Funcionalidades que dependem do JS simplesmente não funcionam.
Causa raiz
getPluginsJsScriptsFiles() itera sobre $PLUGIN_HOOKS['add_javascript'] e chama
Plugin::isPluginActive($plugin) usando a chave do array como nome do plugin.
Se a chave for diferente do plugin key real, isPluginActive() retorna false
e o arquivo JS é ignorado sem qualquer aviso.
// ERRADO — chave diferente do plugin key
$PLUGIN_HOOKS[Hooks::ADD_JAVASCRIPT]['splititil_form'] = ['js/splititil-form.js'];
// CORRETO — chave = plugin key exato
$PLUGIN_HOOKS[Hooks::ADD_JAVASCRIPT]['splititil'] = ['js/splititil-form.js'];
Para formulários públicos (anônimos)
Usar ADD_JAVASCRIPT_ANONYMOUS_PAGE além de ADD_JAVASCRIPT para que o JS
seja carregado em páginas de formulário acessadas sem login:
$PLUGIN_HOOKS[Hooks::ADD_JAVASCRIPT]['splititil'] = ['js/splititil-form.js'];
$PLUGIN_HOOKS[Hooks::ADD_JAVASCRIPT_ANONYMOUS_PAGE]['splititil'] = ['js/splititil-form.js'];
Validação padrão
- Verificar no HTML renderizado se o
<script src="...splititil-form.js">está presente. - Ou via
grep:curl -s http://localhost/glpi/ | grep "splititil-form".
Regra para agentes
Ao registrar hooks de JS/CSS em setup.php, a chave do array sempre deve ser
o plugin key exato (= nome do diretório do plugin). Nunca usar sufixos, prefixos ou variações.
Para formulários públicos, registrar também em ADD_JAVASCRIPT_ANONYMOUS_PAGE.
Classificação
- Tipo: Armadilha de configuração — falha silenciosa.
- Reutilização: obrigatória em qualquer plugin que injete assets no GLPI 11.