$list) { foreach ($list as $mod) { $modByCategory[$cat][$mod] = null; $modById[$mod] =& $modByCategory[$cat][$mod]; } } } $all = Module::getEnabled(true); foreach ($all as $module) { $cat = $module->getCategory(); if (empty($cat)) continue; $modId = $module->getIdentifier(); if (array_key_exists($modId, $modById)) { $modById[$modId] = $module; } else { $modByCategory[$cat][$modId] = $module; } } $currentPage = Page::getModule()->getIdentifier(); $categories = array(); foreach ($modByCategory as $catId => $modList) { $collapse = true; /* @var (?Module)[] $modList */ $modules = array(); foreach ($modList as $module) { if ($module === null) continue; // Was set in $MENU_CAT_OVERRIDE, but is not enabled $newEntry = array( 'displayName' => $module->getDisplayName(), 'identifier' => $module->getIdentifier() ); if ($module->getIdentifier() === $currentPage) { $newEntry['className'] = 'active'; $newEntry['subMenu'] = self::$subMenu; $collapse = false; // Don't collapse category if it contains the active module } if (!$module->doCollapse()) { $collapse = false; } $modules[] = $newEntry; } $categories[] = [ 'icon' => self::getCategoryIcon($catId), 'displayName' => Dictionary::getCategoryName($catId), 'modules' => $modules, 'collapse' => $collapse, ]; } Render::setDashboard([ 'categories' => $categories, 'url' => urlencode($_SERVER['REQUEST_URI']), 'langs' => Dictionary::getLanguages(true), 'user' => User::getName(), 'warning' => User::getName() !== false && User::hasPermission('.eventlog.*') && User::getLastSeenEvent() < Property::getLastWarningId(), 'needsSetup' => User::getName() !== false && Property::getNeedsSetup() ]); } public static function getCategoryIcon(string $category): string { if (!preg_match('/^(\w+)\.(.*)$/', $category, $out)) { error_log('Requested category icon for invalid category "' . $category . '"'); return ''; } $module = $out[1]; $icon = $out[2]; if (!isset(self::$iconCache[$module])) { $path = 'modules/' . $module . '/category-icons.json'; $data = json_decode(file_get_contents($path), true); if (!is_array($data)) { return ''; } self::$iconCache[$module] =& $data; } if (!isset(self::$iconCache[$module][$icon])) { error_log('Icon "' . $icon . '" not found in module "' . $module . '"'); return ''; } return 'glyphicon glyphicon-' . self::$iconCache[$module][$icon]; } public static function addSubmenu(string $url, string $name): void { self::$subMenu[] = array('url' => $url, 'name' => $name); } public static function getSubmenus(): array { return self::$subMenu; } }