diff --git a/index.json b/index.json index 2ac99b2..40c9928 100755 --- a/index.json +++ b/index.json @@ -53,7 +53,7 @@ }, { "id": "KB-INFRA-004", - "title": "Forgejo onmind é o origin de desenvolvimento (todo trabalho dev é versionado lá)", + "title": "\"Forgejo onmind é o origin de desenvolvimento (todo trabalho dev é versionado lá)\"", "domain": "infrastructure", "tags": [ "git", @@ -680,6 +680,24 @@ "severity": "medium", "path": "records/plugin-dev/KB-PLUGIN-035-glpi11-service-desk-kpi-data-model.md", "summary": "id: KB-PLUGIN-035" + }, + { + "id": "KB-PLUGIN-036", + "title": "\"GLPI 11 — Namespaces obrigatórios para componentes do core (Twig e RichText)\"", + "domain": "plugin-dev", + "tags": [ + "glpi11", + "plugin", + "twig", + "namespaces", + "templaterenderer", + "richtext", + "gotcha" + ], + "status": "active", + "severity": "medium", + "path": "records/plugin-dev/KB-PLUGIN-036-glpi11-namespaces-twig.md", + "summary": "id: KB-PLUGIN-036" } ] -} \ No newline at end of file +} diff --git a/records/plugin-dev/KB-PLUGIN-036-glpi11-namespaces-twig.md b/records/plugin-dev/KB-PLUGIN-036-glpi11-namespaces-twig.md new file mode 100644 index 0000000..69f20e7 --- /dev/null +++ b/records/plugin-dev/KB-PLUGIN-036-glpi11-namespaces-twig.md @@ -0,0 +1,67 @@ +--- +id: KB-PLUGIN-036 +title: "GLPI 11 — Namespaces obrigatórios para componentes do core (Twig e RichText)" +domain: plugin-dev +tags: + - glpi11 + - plugin + - twig + - namespaces + - templaterenderer + - richtext + - gotcha +status: active +severity: medium +created_at: 2026-06-29 +updated_at: 2026-06-29 +applies_to: + - plugins GLPI 11.x que renderizam Twig ou manipulam HTML do core +--- + +# GLPI 11 — Namespaces obrigatórios para componentes do core (Twig e RichText) + +A partir do GLPI 10.0+ e consolidado no GLPI 11, diversas classes utilitárias e +componentes visuais do core deixaram o escopo global (global namespace) e passaram +a exigir a importação estrita de seus respectivos namespaces. + +O não uso dos namespaces corretos resulta em +`Attempted to load class "NomeDaClasse" from the global namespace`. + +## 1. TemplateRenderer (renderização de Twig) + +Para renderizar formulários modernos usando a engine do Twig (arquivos +`.html.twig`), a antiga chamada `TemplateRenderer::getInstance()->display()` +(sem namespace) falha. + +```php +// Certo +\Glpi\Application\View\TemplateRenderer::getInstance()->display('@meuplugin/template.html.twig', [ + 'variavel' => 'valor' +]); +``` +*Dica: também é possível declarar `use Glpi\Application\View\TemplateRenderer;` no topo do arquivo PHP.* + +## 2. RichText (limpeza e manipulação de HTML) + +O GLPI frequentemente injeta tags HTML como `

` e `
` (geradas pelo TinyMCE) +em campos de descrição (`content`). Para limpar essas tags antes de exibir em +formulários externos ou APIs, use a classe `RichText` com seu namespace correto. + +```php +// Certo +$clean_text = \Glpi\RichText\RichText::getTextFromHtml($fields['content'], false, true, true); +``` +*Dica: também é possível declarar `use Glpi\RichText\RichText;` no topo do arquivo PHP.* + +## Resumo de namespaces críticos para views + +| Classe antiga (global) | Novo namespace GLPI 11 | Propósito | +| :--- | :--- | :--- | +| `TemplateRenderer` | `\Glpi\Application\View\TemplateRenderer` | Renderizar interfaces em Twig | +| `RichText` | `\Glpi\RichText\RichText` | Remover/escapar tags HTML de descrições | + +## Onde isso pegou na vida real + +No plugin `redmine`, `project.class.php` quebrava com +`Attempted to load class "RichText"/"TemplateRenderer" from the global namespace` +até os usos serem qualificados com `\Glpi\...`. Relacionado: [[KB-PLUGIN-032]].