"Update-Ziel ist nicht konfiguriert.", "available" => false, "version" => "", ]; } $context = stream_context_create([ "http" => [ "method" => "GET", "timeout" => 3, "ignore_errors" => true, "header" => "User-Agent: PSA-Orderform-Settings/" . APP_VERSION . "\r\n", ], ]); $body = @file_get_contents($manifestUrl, false, $context); if ($body === false) { return [ "label" => "Update-Status konnte nicht geladen werden.", "available" => false, "version" => "", ]; } $manifest = json_decode($body, true); if (!is_array($manifest)) { return [ "label" => "Update-Status ist ungültig.", "available" => false, "version" => "", ]; } $version = trim((string) ($manifest["version"] ?? $manifest["latest"] ?? "")); if (!preg_match('/^v\d+\.\d+\.\d+$/', $version)) { return [ "label" => "Update-Version ist ungültig.", "available" => false, "version" => "", ]; } $available = version_compare( settingsUpdaterVersionCompareValue($version), settingsUpdaterVersionCompareValue(APP_VERSION), ">", ); return [ "label" => $available ? "Update verfügbar: " . $version : "Kein Update verfügbar.", "available" => $available, "version" => $version, ]; } function settingsFormatBackupDate(string $date): string { $timestamp = strtotime($date); if ($timestamp === false) { return $date; } return date("d.m.Y H:i", $timestamp); } function settingsGetBackupUploadLabel(array $backup): string { $uploads = isset($backup["remote_uploads"]) && is_array($backup["remote_uploads"]) ? $backup["remote_uploads"] : []; if (empty($uploads)) { return "Nur lokal"; } $successful = 0; foreach ($uploads as $upload) { if (is_array($upload) && !empty($upload["success"])) { $successful++; } } if ($successful === count($uploads)) { return "Remote erfolgreich (" . $successful . ")"; } if ($successful > 0) { return "Teilweise erfolgreich (" . $successful . "/" . count($uploads) . ")"; } return "Remote fehlgeschlagen"; } function settingsGetBackupCapabilityLabel(array $capability): string { if (empty($capability["configured"])) { return "nicht konfiguriert"; } return !empty($capability["available"]) ? "bereit" : "nicht verfügbar"; } function settingsFindBackupByFilename(string $filename): ?array { if ($filename === "" || basename($filename) !== $filename) { return null; } foreach (backupListBackups() as $backup) { if (($backup["filename"] ?? "") === $filename) { return $backup; } } return null; } function settingsSendBackupDownload(array $backup): void { $filename = basename((string) ($backup["filename"] ?? "")); $path = backupGetDirectory() . $filename; if ($filename === "" || !is_file($path) || !is_readable($path)) { throw new RuntimeException("Backup-Datei wurde nicht gefunden."); } $size = filesize($path); if ($size === false) { throw new RuntimeException("Backup-Dateigröße konnte nicht gelesen werden."); } logAccess("Backup downloaded", [ "filename" => $filename, ]); header("Content-Type: application/zip"); header('Content-Disposition: attachment; filename="' . $filename . '"'); header("Content-Length: " . (string) $size); header("X-Content-Type-Options: nosniff"); readfile($path); exit(); } if (empty($_SESSION['admin_logged_in'])) { header("Location: login.php"); exit(); } $pageTitle = "Einstellungen"; $message = ""; $messageType = ""; if ($_SERVER['REQUEST_METHOD'] === "POST" && isset($_POST['save_settings'])) { // Validate CSRF token if (!validateCsrfToken($_POST['csrf_token'] ?? "")) { $message = "Ungültiges Token. Bitte versuchen Sie es erneut."; $messageType = "error"; } else { $settings = array_merge(getSystemSettings(), [ "order_recipient_email" => $_POST['order_recipient_email'] ?? "", "attach_order_pdf_to_admin_email" => isset( $_POST['attach_order_pdf_to_admin_email'], ), "nametag_product_name" => $_POST['nametag_product_name'] ?? "", ]); if (saveSystemSettings($settings)) { logAccess("Admin updated system settings"); $message = "Einstellungen wurden gespeichert."; $messageType = "success"; } else { $message = "Einstellungen konnten nicht gespeichert werden."; $messageType = "error"; } } } elseif ($_SERVER['REQUEST_METHOD'] === "POST" && isset($_POST['create_backup'])) { if (!validateCsrfToken($_POST['csrf_token'] ?? "")) { $message = "Ungültiges Token. Bitte versuchen Sie es erneut."; $messageType = "error"; } else { try { $backup = backupCreate("manual"); $message = "Backup wurde erstellt: " . $backup["filename"] . " (" . backupFormatBytes((int) $backup["size"]) . ")."; $messageType = "success"; } catch (Throwable $exception) { $message = "Backup konnte nicht erstellt werden: " . $exception->getMessage(); $messageType = "error"; } } } elseif ($_SERVER['REQUEST_METHOD'] === "POST" && isset($_POST['download_backup'])) { if (!validateCsrfToken($_POST['csrf_token'] ?? "")) { $message = "Ungültiges Token. Bitte versuchen Sie es erneut."; $messageType = "error"; } else { try { $backup = settingsFindBackupByFilename((string) ($_POST["backup_filename"] ?? "")); if ($backup === null) { throw new RuntimeException("Backup wurde nicht gefunden."); } settingsSendBackupDownload($backup); } catch (Throwable $exception) { $message = "Backup konnte nicht heruntergeladen werden: " . $exception->getMessage(); $messageType = "error"; } } } $settings = getSystemSettings(); $updaterStatus = settingsGetUpdaterStatus(); $backupCapabilities = backupRemoteCapabilities(); $backups = backupListBackups(); $bodyClass = "admin-page"; include __DIR__ . "/../includes/header.php"; ?>

Einstellungen

Zurück zum Dashboard
">
"> Muss exakt dem Produktnamen im Katalog entsprechen. Wird von der Namensschilder-Übersicht verwendet.

Backups

Lokale Aufbewahrung: Backups

Automatisches Intervall: Tage

S3: · SFTP: · Custom: · Managed:

Letzte Backups

Es wurden noch keine Backups erstellt.

Erstellt Auslöser Größe Dateien Remote Aktionen
">

Updater

Installierte Version:

Update-Status:

Updater öffnen