Vervang raw JSON config editor door instellingenformulier met default_page dropdown

- Admin config pagina is nu een formulier met secties voor algemeen, taal,
  SEO, auteur en features
- Startpagina instelbaar via dropdown met beschikbare pagina's uit content/
- Handleiding (nl/en) bijgewerkt met nieuwe configuratie-instructies
This commit is contained in:
2026-07-28 13:49:33 +02:00
parent 2fdf90519a
commit f72d7e7b01
4 changed files with 218 additions and 55 deletions
+44 -17
View File
@@ -658,29 +658,56 @@ function handleConfig(AdminAuth $auth, array $config): void
$message = '';
$messageType = '';
// Load current config
$configData = file_exists($configJson) ? json_decode(file_get_contents($configJson), true) : [];
if (!is_array($configData)) $configData = [];
// Get available root-level pages
$contentDir = $config['content_dir'];
$availablePages = [];
$availableLangs = $configData['language']['available'] ?? ['nl', 'en'];
if (is_dir($contentDir)) {
$pageMap = [];
foreach (scandir($contentDir) as $file) {
if ($file[0] === '.') continue;
$filePath = $contentDir . '/' . $file;
if (is_file($filePath) && preg_match('/\.(md|php|html)$/', $file)) {
$base = $file;
$langPattern = '/^(' . implode('|', $availableLangs) . ')\.(.+)$/';
if (preg_match($langPattern, $base, $m)) {
$base = $m[2];
}
$pageKey = preg_replace('/\.(md|php|html)$/', '', $base);
$pageMap[$pageKey] = true;
}
}
$availablePages = array_keys($pageMap);
sort($availablePages);
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!$auth->verifyCsrf($_POST['csrf_token'] ?? '')) {
$message = 'Ongeldige CSRF token.';
$messageType = 'danger';
} else {
$jsonContent = $_POST['config_content'] ?? '';
$parsed = json_decode($jsonContent, true);
if ($parsed === null && json_last_error() !== JSON_ERROR_NONE) {
$message = 'Ongeldige JSON: ' . json_last_error_msg();
$messageType = 'danger';
} else {
file_put_contents($configJson, json_encode($parsed, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
adminLog($config, 'info', $user['username'] . ' wijzigde site configuratie');
$message = 'Configuratie opgeslagen.';
$messageType = 'success';
$jsonContent = null; // reload from file
}
}
}
$configData['site_title'] = trim($_POST['site_title'] ?? 'CodePress');
$configData['default_page'] = trim($_POST['default_page'] ?? 'index');
$configData['language']['default'] = trim($_POST['language_default'] ?? 'nl');
$configData['language']['available'] = $_POST['language_available'] ?? ['nl', 'en'];
$configData['seo']['description'] = trim($_POST['seo_description'] ?? '');
$configData['seo']['keywords'] = trim($_POST['seo_keywords'] ?? '');
$configData['author']['name'] = trim($_POST['author_name'] ?? '');
$configData['author']['website'] = trim($_POST['author_website'] ?? '');
$configData['show_version'] = !empty($_POST['show_version']);
$configData['features']['auto_link_pages'] = !empty($_POST['feature_auto_link']);
$configData['features']['search_enabled'] = !empty($_POST['feature_search']);
$configData['features']['breadcrumbs_enabled'] = !empty($_POST['feature_breadcrumbs']);
$siteConfig = file_exists($configJson) ? file_get_contents($configJson) : '{}';
if (isset($jsonContent)) {
$siteConfig = $jsonContent;
file_put_contents($configJson, json_encode($configData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
adminLog($config, 'info', $user['username'] . ' wijzigde site configuratie');
$message = 'Configuratie opgeslagen.';
$messageType = 'success';
}
}
$route = 'config';