request = $request; } /** * Item is always enabled. */ public function checkAccess(): bool { return true; } /** * Render username and an icon. */ public function getItem(): string { $backendUser = $this->getBackendUser(); $view = $this->backendViewFactory->create($this->request); $view->assignMultiple([ 'currentUser' => $backendUser->user, 'switchUserMode' => (int)$backendUser->getOriginalUserIdWhenInSwitchUserMode(), ]); return $view->render('ToolbarItems/UserToolbarItem'); } /** * Render drop-down content. */ public function getDropDown(): string { $backendUser = $this->getBackendUser(); $mostRecentUsers = []; if ($backendUser->isAdmin() && $backendUser->getOriginalUserIdWhenInSwitchUserMode() === null && isset($backendUser->uc['recentSwitchedToUsers']) && is_array($backendUser->uc['recentSwitchedToUsers']) ) { $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('be_users'); $result = $queryBuilder ->select('uid', 'username', 'realName') ->from('be_users') ->where( $queryBuilder->expr()->in('uid', $queryBuilder->createNamedParameter($backendUser->uc['recentSwitchedToUsers'], Connection::PARAM_INT_ARRAY)) )->executeQuery(); // Flip the array to have a "sorted" list of items $mostRecentUsers = array_flip($backendUser->uc['recentSwitchedToUsers']); while ($row = $result->fetchAssociative()) { $mostRecentUsers[$row['uid']] = $row; } // Remove any item that is not an array (means, the stored uid is not available anymore) $mostRecentUsers = array_filter($mostRecentUsers, is_array(...)); $availableUsers = array_keys($mostRecentUsers); if (!empty(array_diff($backendUser->uc['recentSwitchedToUsers'], $availableUsers))) { $backendUser->uc['recentSwitchedToUsers'] = $availableUsers; $backendUser->writeUC(); } } $modules = null; if ($userModule = $this->moduleProvider->getModuleForMenu('user', $backendUser)) { $modules = $userModule->getSubModules(); } $helpModules = null; if ($helpModule = $this->moduleProvider->getModuleForMenu('help', $this->getBackendUser())) { $helpModules = $helpModule->getSubModules(); } $view = $this->backendViewFactory->create($this->request); $view->assignMultiple([ 'modules' => $modules, 'helpModules' => $helpModules, 'switchUserMode' => $this->getBackendUser()->getOriginalUserIdWhenInSwitchUserMode() !== null, 'recentUsers' => $mostRecentUsers, 'colorSchemeSwitchEnabled' => $this->getColorSchemeSwitchEnabled(), 'activeColorScheme' => $backendUser->uc['colorScheme'] ?? 'auto', 'colorSchemes' => $this->getColorSchemes(), ]); return $view->render('ToolbarItems/UserToolbarItemDropDown'); } /** * Returns an additional class if user is in "switch user" mode. */ public function getAdditionalAttributes(): array { $result = [ 'class' => 'toolbar-item-user', ]; if ($this->getBackendUser()->getOriginalUserIdWhenInSwitchUserMode()) { $result['class'] .= ' su-user'; } return $result; } /** * This item has a drop-down. */ public function hasDropDown(): bool { return true; } /** * Position relative to others. */ public function getIndex(): int { return 90; } protected function getBackendUser(): BackendUserAuthentication { return $GLOBALS['BE_USER']; } protected function getLanguageService(): LanguageService { return $GLOBALS['LANG']; } protected function getColorSchemeSwitchEnabled(): bool { $backendUser = $this->getBackendUser(); $userTS = $backendUser->getTSConfig(); return !isset($userTS['setup.']['fields.']['colorScheme.']['disabled']) || $userTS['setup.']['fields.']['colorScheme.']['disabled'] !== '1'; } protected function getColorSchemes(): array { $schemes = []; foreach (ColorScheme::cases() as $scheme) { $schemeItem = [ 'label' => $this->getLanguageService()->sL($scheme->getLabel()), 'value' => $scheme->value, 'icon' => $scheme->getIcon(), ]; $schemes[] = $schemeItem; } return $schemes; } }