languageService = $this->languageServiceFactory->createFromUserPreferences($this->getBackendUser()); } public function getFilterLabel(): string { return $this->languageService->sL('LLL:EXT:backend/Resources/Private/Language/locallang.xlf:liveSearch.backendModuleProvider.filterLabel'); } public function find(SearchDemand $searchDemand): array { $items = []; foreach ($this->getFilteredModules($searchDemand) as $module) { // we can't generate accessible URLs for all modules by their identifier // if URL generation fails, we don't create an action to open a module // and if no actions exist, we skip result item creation altogether try { $moduleUrl = (string)$this->uriBuilder->buildUriFromRoute($module->getIdentifier()); } catch (RouteNotFoundException) { continue; } $action = (new ResultItemAction('open_module')) ->setLabel($this->languageService->sL('LLL:EXT:backend/Resources/Private/Language/locallang.xlf:resultItem.backendModuleProvider.openModule')) ->setUrl($moduleUrl); $iconIdentifier = $module->getIconIdentifier(); if ($iconIdentifier === '' && $module->hasParentModule()) { $iconIdentifier = $module->getParentModule()->getIconIdentifier(); } $items[] = (new ResultItem(self::class)) ->setItemTitle($this->languageService->sL($module->getTitle())) ->setTypeLabel($this->languageService->sL('LLL:EXT:backend/Resources/Private/Language/locallang.xlf:liveSearch.backendModuleProvider.typeLabel')) ->setIcon($this->iconFactory->getIcon($iconIdentifier, IconSize::SMALL)) ->setActions($action) ->setExtraData([ 'moduleIdentifier' => $module->getIdentifier(), ]); } return $items; } public function count(SearchDemand $searchDemand): int { return count($this->getFilteredModules($searchDemand)); } /** * @return list */ private function getFilteredModules(SearchDemand $searchDemand): array { $normalizedQuery = mb_strtolower($searchDemand->getQuery()); $filteredModules = array_filter( $this->moduleProvider->getModules($this->getBackendUser(), true, false), fn(ModuleInterface $module) => str_contains(mb_strtolower($this->languageService->sL($module->getTitle())), $normalizedQuery) ); $firstResult = $searchDemand->getOffset(); $remainingItems = $searchDemand->getLimit(); return array_slice($filteredModules, $firstResult, $remainingItems, true); } private function getBackendUser(): BackendUserAuthentication { return $GLOBALS['BE_USER']; } }