Ajouter les pages personnalisées au site public

This commit is contained in:
Alexandre NOEL 2026-10-12 10:42:59 +02:00
commit 21ee1bec36
17 changed files with 428 additions and 65 deletions

View file

@ -759,6 +759,7 @@ final class SettingsController
'saved' => isset($_GET['saved']),
'error' => (string) ($_GET['error'] ?? ''),
'images' => $images,
'customPages' => PublicPageService::all(),
]);
}
@ -869,22 +870,30 @@ final class SettingsController
'public_site_routing' => $routing,
'public_site_about_enabled' => isset($_POST['public_site_about_enabled']) ? '1' : '0',
];
foreach (
[
'public_site_home_title' => 150,
'public_site_name' => 150,
'public_site_home_text' => 5000,
'public_site_about_title' => 150,
'public_site_about_text' => 10000,
'public_site_donation_title' => 150,
'public_site_donation_text' => 10000,
'public_site_contact_text' => 5000,
'public_site_legal_text' => 15000,
'public_site_privacy_text' => 15000,
]
as $key => $max
) {
$values[$key] = mb_substr(trim((string) ($_POST[$key] ?? '')), 0, $max);
$navigation = json_decode((string) ($_POST['public_site_navigation_order'] ?? '[]'), true);
$navigation = is_array($navigation) ? array_values(array_unique(array_filter($navigation, static function ($item): bool {
if (!is_string($item)) return false;
return in_array($item, ['home','animals','about','donation','contact'], true)
|| (bool) preg_match('/^custom:[a-z0-9-]{1,80}$/', $item);
}))) : [];
$submittedPageSlugs = [];
foreach ((array) ($_POST['pages'] ?? []) as $submittedPage) {
if (!is_array($submittedPage) || !empty($submittedPage['delete'])) continue;
$submittedSlug = PublicPageService::normalizeSlug((string) ($submittedPage['slug'] ?? $submittedPage['title'] ?? ''));
if ($submittedSlug !== '') $submittedPageSlugs[] = $submittedSlug;
}
$navigation = array_values(array_filter($navigation, static function (string $item) use ($submittedPageSlugs): bool {
return !str_starts_with($item, 'custom:') || in_array(substr($item, 7), $submittedPageSlugs, true);
}));
foreach (['home','animals','about','donation','contact'] as $required) {
if (!in_array($required, $navigation, true)) $navigation[] = $required;
}
$values['public_site_navigation_order'] = json_encode($navigation, JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR);
foreach (['public_site_home_title','public_site_name','public_site_about_title','public_site_donation_title'] as $key) {
$values[$key] = mb_substr(trim((string) ($_POST[$key] ?? '')), 0, 150);
}
foreach (['public_site_home_text','public_site_about_text','public_site_donation_text','public_site_contact_text','public_site_legal_text','public_site_privacy_text'] as $key) {
$values[$key] = trim((string) ($_POST[$key] ?? ''));
}
$customCss = trim((string) ($_POST['public_site_custom_css'] ?? ''));
if (strlen($customCss) > 30000 || preg_match('/(?:<\/style|@import|expression\s*\(|javascript\s*:|behavior\s*:|-moz-binding|url\s*\()/i', $customCss)) {
@ -914,9 +923,19 @@ final class SettingsController
}
$values[$key] = $url;
}
AppSettings::save($values, Auth::id());
AuditService::log('public_site_saved', '/settings/public-site/save', 'Configuration du site public modifiée');
header('Location: /settings/public-site?saved=1');
$db = DB::pdo();
try {
$db->beginTransaction();
AppSettings::save($values, Auth::id());
PublicPageService::saveAll((array) ($_POST['pages'] ?? []));
$db->commit();
AuditService::log('public_site_saved', '/settings/public-site/save', 'Configuration du site public modifiée');
header('Location: /settings/public-site?saved=1');
} catch (Throwable $e) {
if ($db->inTransaction()) $db->rollBack();
$message = $e instanceof InvalidArgumentException ? $e->getMessage() : SecurityService::publicError($e);
header('Location: /settings/public-site?error=' . rawurlencode($message));
}
exit();
}
public static function audit(): void