api = $api; } public function getConfig(): array { return [ 'title' => 'Dashboard', 'viewable' => false, 'type' => 'system', ]; } public function getAdminMenu(): array { return [ [ 'plugin' => 'Dashboard', 'route' => 'dashboard', 'label' => 'Dashboard', 'label_key' => 'menu_label', 'icon' => 'bi-speedometer2', 'section' => 'general', 'permission' => 'dashboard', ], ]; } public function handleAdminRoute(string $action): ?string { $siteConfig = $this->getSiteConfig(); $contentDir = $this->api ? $this->api->getContentDir() : ''; $pluginsDir = $this->api ? $this->api->getPluginsDir() : ''; $enabledPlugins = $this->api ? $this->api->getEnabledPlugins() : []; $versionInfo = $this->api ? $this->api->getVersionInfo() : ['version' => '0.0.0']; // Plugin translations (admin context). Falls back to plugin default_language. $t = $this->api ? $this->api->getPluginTranslations('Dashboard') : []; $tr = function (string $key) use ($t): string { return $t[$key] ?? $key; }; $stats = [ 'pages' => $this->countFiles($contentDir, ['md', 'php', 'html']), 'directories' => $this->countDirs($contentDir), 'content_size' => $this->formatSize($this->dirSize($contentDir)), 'config_exists' => !empty($siteConfig), 'php_version' => PHP_VERSION, 'cms_version' => $versionInfo['version'] ?? '0.0.0', 'os' => PHP_OS_FAMILY . ' (' . php_uname('r') . ')', ]; // Build plugin overview $pluginOverview = []; if (is_dir($pluginsDir)) { foreach (glob($pluginsDir . '/*', GLOB_ONLYDIR) as $pluginDir) { $pluginName = basename($pluginDir); $pluginType = $this->getPluginType($pluginDir, $pluginName); $pluginOverview[$pluginName] = [ 'enabled' => in_array($pluginName, $enabledPlugins, true), 'type' => $pluginType, ]; } } ksort($pluginOverview); $siteTitle = $siteConfig['site_title'] ?? 'CodePress'; $defaultLang = $siteConfig['language']['default'] ?? 'nl'; ob_start(); ?>

$info): ?>
api === null) { return []; } // AdminPluginAPI holds the full site config if ($this->api instanceof AdminPluginAPI) { return $this->api->getConfig('', []) ?? []; } return []; } private function getPluginType(string $pluginDir, string $pluginName): string { $pluginFile = $pluginDir . '/' . $pluginName . '.php'; if (!file_exists($pluginFile)) { return 'content'; } // Read the file to find 'type' in the config array $source = file_get_contents($pluginFile); if (preg_match("/'type'\s*=>\s*'([^']+)'/", $source, $m)) { return $m[1]; } return 'content'; } private function countFiles(string $dir, array $extensions = []): int { if (!is_dir($dir)) return 0; $count = 0; $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS) ); foreach ($iterator as $file) { if (!$file->isFile()) continue; // Skip hidden/dash-prefixed $relative = substr($file->getRealPath(), strlen(realpath($dir)) + 1); $skip = false; foreach (explode('/', str_replace('\\', '/', $relative)) as $seg) { if ($seg !== '' && ($seg[0] === '.' || $seg[0] === '-')) { $skip = true; break; } } if ($skip) continue; $ext = strtolower($file->getExtension()); if (empty($extensions) || in_array($ext, $extensions, true)) { $count++; } } return $count; } private function countDirs(string $dir): int { if (!is_dir($dir)) return 0; $count = 0; $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST ); foreach ($iterator as $file) { if ($file->isDir()) { $name = $file->getFilename(); if ($name[0] === '.' || $name[0] === '-') continue; $count++; } } return $count; } private function dirSize(string $dir): int { if (!is_dir($dir)) return 0; $size = 0; $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS) ); foreach ($iterator as $file) { if ($file->isFile()) { $size += $file->getSize(); } } return $size; } private function formatSize(int $bytes): string { if ($bytes <= 0) return '0 B'; $units = ['B', 'KB', 'MB', 'GB']; $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); $pow = min($pow, count($units) - 1); $bytes /= pow(1024, $pow); return round($bytes, 2) . ' ' . $units[$pow]; } }