# Globale Suche erweitern Letzte Aktualisierung: 2026-02-21 Diese Doku erklärt, wie neue Entitäten sauber in die globale Suche integriert werden. ## Überblick Es gibt zwei Suchausgaben mit derselben Datenquelle: 1. **Aside-Preview** (`admin/search/data`) - zeigt je Resource Count + bis zu 5 Preview-Einträge. 2. **Vollseite Suche** (`search/data` -> `/search`) - zeigt gemischte Trefferliste über alle Resources. Die zentrale Fassade liegt in: - `/lib/Support/SearchConfig.php` Die eigentliche Logik ist in Provider aufgeteilt: - `/lib/Support/Search/SearchSqlResourceProvider.php` - `/lib/Support/Search/SearchUiMetaProvider.php` - `/lib/Support/Search/SearchItemMapperProvider.php` - `/lib/Support/Search/SearchSpecialResourceProvider.php` - `/lib/Support/Search/SearchQueryNormalizer.php` ## Relevante Dateien - `/lib/Support/SearchConfig.php` - stabile Orchestrierungs-Fassade (kompatible Methoden nach außen) - `/lib/Support/Search/SearchSqlResourceProvider.php` - Resource-Definitionen (SQL + Permission + Label) + Tenant-Filter - `/lib/Support/Search/SearchUiMetaProvider.php` - URL- und Icon-Mapping pro Resource-Key - `/lib/Support/Search/SearchItemMapperProvider.php` - Mapping SQL-Row -> Preview-/Result-Item - `/lib/Support/Search/SearchSpecialResourceProvider.php` - Spezialressourcen (`docs`, `hotkeys`) - `/lib/Support/Search/SearchQueryNormalizer.php` - Query-Normalisierung für LIKE/Score - `/pages/admin/search/data().php` - Aside-Preview API (Counts + Preview) - `/pages/search/data().php` - Volltext-Treffer API - `/templates/partials/app-main-aside.phtml` - Sichtbarer Eintrag im Such-Panel (`data-search-key=...`) - `/web/js/components/app-global-search.js` - Render-Logik (generisch; meist keine Anpassung nötig) - `/lib/Service/Docs/DocsCatalogService.php` - Zentrale Katalog-/Anchor-Logik für Entwicklerdoku (Single Source of Truth) ## Standard-Vorgehen für neue Resource ### 1) Resource in `SearchSqlResourceProvider::resources()` anlegen Neue Struktur mit: - `key` (z. B. `scheduled-jobs`) - `label` (übersetzbar via `t(...)`) - `permission` (z. B. `PermissionService::JOBS_VIEW`) - `countSql` + `countParams` - `previewSql` + `previewParams` - `resultSql` + `resultParams` Regeln: - SQL immer mit `... like ? escape '\\'`. - Bei tenant-sensitiven Entitäten `{{tenantFilter}}` nutzen und in `SearchSqlResourceProvider::tenantScopeFilters()` ergänzen. - Preview-Query immer mit `limit ?`. ### 2) URL-/Icon-/Mapping ergänzen - `SearchUiMetaProvider::iconForKey()` erweitern - `SearchUiMetaProvider::listUrl()` erweitern - `SearchItemMapperProvider::mapPreviewItem()` ergänzen (falls Spezialformat nötig) - `SearchItemMapperProvider::mapResultItem()` ergänzen (falls Spezialformat nötig) Ziel: - Preview und Volltreffer sollen sprechende Labels zeigen. - URLs sollen direkt auf sinnvolle Zielseiten gehen. ### 3) Eintrag im Aside-Search-Panel anlegen In `/templates/partials/app-main-aside.phtml`: - `