api = $api; } /** * Geeft de plugin-configuratie terug. * * @since 2.6.4 * @return array Plugin-configuratie met title, viewable en type. */ public function getConfig(): array { return [ 'title' => 'Logs', 'viewable' => false, 'type' => 'system', ]; } /** * Geeft de admin-menu-items voor deze plugin terug. * * @since 2.6.4 * @return array> Lijst met admin-menu-item configuraties. */ public function getAdminMenu(): array { $config = $this->getPluginConfig(); $requiredRoles = $config['required_roles'] ?? ['bi-manager', 'site-admin', 'admin']; return [ [ 'plugin' => 'Logs', 'route' => 'logs', 'label' => 'Logs', 'label_key' => 'menu_label', 'icon' => 'bi-journal-text', 'section' => 'general', 'permission' => 'logs', 'required_roles' => $requiredRoles, ], ]; } /** * Haalt de runtime-configuratie van deze plugin op (standaardwaarden plus overrides). * * Leest standaardwaarden uit plugin.json en overschrijft deze met config.json. * * @since 2.6.4 * @return array De samengevoegde plugin-configuratie. */ private function getPluginConfig(): array { $pluginDir = dirname(__DIR__); $pluginJsonFile = $pluginDir . '/plugin.json'; $configJsonFile = $pluginDir . '/config.json'; $defaults = []; if (file_exists($pluginJsonFile)) { $pluginJson = json_decode(file_get_contents($pluginJsonFile), true) ?? []; foreach ($pluginJson['settings'] ?? [] as $setting) { if (isset($setting['key'])) { $defaults[$setting['key']] = $setting['default'] ?? null; } } } $overrides = []; if (file_exists($configJsonFile)) { $overrides = json_decode(file_get_contents($configJsonFile), true) ?? []; } return array_merge($defaults, $overrides); } /** * Verwerkt een admin-route en toont de logs-pagina. * * Leest de geselecteerde log, parset de regels en toont deze in een tabel * met tabbladen voor admin- en request-logs. * * @since 2.6.4 * @param string $action De uit te voeren actie. * @return string|null De HTML-uitvoer van de logs-pagina, of null. */ public function handleAdminRoute(string $action): ?string { $config = $this->getPluginConfig(); $maxLines = (int)($config['max_lines'] ?? 100); $showAdminTab = $config['show_admin_tab'] ?? true; $showRequestsTab = $config['show_requests_tab'] ?? true; // System plugin: translations resolve against the admin language. $t = $this->api ? $this->api->getPluginTranslations('Logs') : []; $tr = function (string $key) use ($t): string { return $t[$key] ?? $key; }; $tab = $_GET['tab'] ?? 'admin'; $logDir = ($this->api ? $this->api->getProjectRoot() : dirname(__DIR__, 2)) . '/admin/storage/logs'; $logFile = $tab === 'requests' ? $logDir . '/requests.log' : $logDir . '/admin.log'; $logs = []; if (file_exists($logFile)) { $lines = file($logFile) ?: []; $lines = array_slice($lines, -$maxLines); foreach ($lines as $line) { if (preg_match('/^\[([^\]]+)\] \[([^\]]+)\] \[([^\]]+)\] (.+)$/', trim($line), $m)) { $logs[] = [ 'time' => $m[1], 'level' => strtolower($m[2]), 'ip' => $m[3], 'message' => $m[4], ]; } } $logs = array_reverse($logs); } ob_start(); ?>