knowledge-base/records/infrastructure/KB-INFRA-002-plugin-icon-logo-png.md

89 lines
2.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: KB-INFRA-002
title: Icone de plugin GLPI 11 requer logo.png PNG na raiz do diretorio
domain: infrastructure
tags:
- glpi
- glpi11
- plugin
- icon
- logo
- marketplace
status: active
severity: low
created_at: 2026-05-02
updated_at: 2026-05-02
applies_to:
- GLPI 11.x lista de plugins e marketplace
- qualquer plugin local instalado manualmente
related_records:
- KB-INFRA-001
- KB-PLUGIN-006
---
# Contexto
Ao instalar um plugin localmente, o GLPI exibe um avatar gerado com as iniciais do nome
do plugin no lugar de um ícone real. Isso ocorre quando nenhum arquivo de logo está presente.
# Sintoma observável
- Lista de plugins exibe um quadrado colorido com 1-2 letras (ex.: "SI" para "Split ITIL").
- Mesmo com `<logo>` definido no XML do plugin, o ícone remoto pode não carregar.
# Como o GLPI resolve o ícone (ordem de prioridade)
1. **Arquivo local `logo.png`** na raiz do diretório do plugin → servido via `LogoController`
2. URL remota definida em `<logo>` no arquivo `{plugin_key}.xml`
3. **Fallback**: avatar gerado com iniciais das palavras do nome do plugin
Código relevante (`Marketplace/View.php`):
```php
if (Document::isImage(sprintf('%s/logo.png', Plugin::getPhpDir($key)))) {
$logo_url = sprintf('%s/Plugin/%s/Logo', $CFG_GLPI['root_doc'], $key);
}
```
# Especificação do arquivo
| Atributo | Valor |
|-------------|------------------------------------------------|
| Nome | `logo.png` (fixo — hardcoded no LogoController)|
| Localização | raiz do diretório do plugin |
| Formato | **PNG** obrigatório |
| SVG | Não funciona — `Document::isImage()` rejeita |
| Tamanho rec. | 128×128 px ou 256×256 px (quadrado) |
# Rota do LogoController
```
GET /Plugin/{plugin_key}/Logo
```
- Requer autenticação admin (`STRATEGY_ADMIN_ACCESS`)
- Serve `BinaryFileResponse` do arquivo `logo.png`
- Se não existir: retorna 1×1 PNG transparente com HTTP 404
# Verificar se o GLPI aceita o PNG
```bash
docker exec glpi-app php -r "
require '/var/www/glpi/vendor/autoload.php';
echo Document::isImage('/var/www/glpi/plugins/myplugin/logo.png') ? 'VALID' : 'INVALID';
"
```
# Gerar PNG placeholder sem dependências externas
Com Python stdlib (sem Pillow ou ImageMagick):
```python
import struct, zlib
# Gerar array de pixels RGBA, encodar com struct.pack e zlib.compress
# Ver: knowledge-base/samples/generate_plugin_logo.py (a criar)
```
# Regra para agentes
Para qualquer plugin, sempre criar `plugins/{key}/logo.png` (PNG, 128×128).
O arquivo tem prioridade sobre o `<logo>` do XML e elimina o fallback de iniciais.
Não usar SVG — o GLPI não reconhece SVG como imagem válida neste contexto.
# Classificação
- Tipo: Configuração de apresentação do plugin.
- Reutilização: aplicável a qualquer plugin GLPI 11 com presença na lista de plugins.