false, 'error' => 'Die Admin-Sitzung ist abgelaufen. Bitte Seite neu laden und anmelden.']); exit; } // Login if (isset($_POST['action']) && $_POST['action'] === 'login') { if (($_POST['password'] ?? '') === ADMIN_PASSWORD_PLAIN) { $_SESSION['admin'] = true; header('Location: admin.php'); exit; } else { $error = 'Falsches Passwort.'; } } // Logout if (isset($_GET['logout'])) { $_SESSION = []; session_destroy(); header('Location: admin.php'); exit; } if ($loggedIn) { if (empty($_SESSION['migration_csrf'])) { $_SESSION['migration_csrf'] = bin2hex(random_bytes(32)); } $migrationCsrf = (string)$_SESSION['migration_csrf']; $migrationError = null; // Je Request genau ein Bestandsbild migrieren, damit das Frontend echten // Fortschritt anzeigen kann und kein langer PHP-Request am Gateway scheitert. if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['migration_step'])) { header('Content-Type: application/json; charset=utf-8'); header('Cache-Control: no-store'); $submittedToken = (string)($_POST['migration_csrf'] ?? ''); if (!hash_equals($migrationCsrf, $submittedToken)) { http_response_code(403); echo json_encode(['ok' => false, 'error' => 'Die Migrationsanfrage ist abgelaufen. Bitte Seite neu laden.']); exit; } session_write_close(); try { $result = migrate_next_upload_to_webp(); echo json_encode(['ok' => true, 'result' => $result], JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR); } catch (Throwable $e) { http_response_code(422); echo json_encode( ['ok' => false, 'error' => 'Migration fehlgeschlagen: ' . $e->getMessage()], JSON_UNESCAPED_UNICODE ); } exit; } // CREATE/UPDATE if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_event'])) { $events = load_events(); $id = $_POST['id'] ?: 'evt_' . bin2hex(random_bytes(6)); $title = sanitize_text($_POST['title'] ?? ''); $speaker = sanitize_text($_POST['speaker'] ?? ''); $date = sanitize_text($_POST['date'] ?? ''); $time = sanitize_text($_POST['time'] ?? '19:30'); $venue_name = sanitize_text($_POST['venue_name'] ?? ''); $venue_address = sanitize_text($_POST['venue_address'] ?? ''); $price = sanitize_text($_POST['price'] ?? ''); $doors_open = sanitize_text($_POST['doors_open'] ?? ''); $tickets_info = sanitize_text($_POST['tickets_info'] ?? ''); $reserve_by_mail = isset($_POST['reserve_by_mail']) && $_POST['reserve_by_mail'] === '1'; $reserve_email = trim((string)($_POST['reserve_email'] ?? '')); if ($reserve_by_mail && $reserve_email === '') { $reserve_email = 'walschleber.kultour@gmail.com'; } if ($reserve_email !== '' && !filter_var($reserve_email, FILTER_VALIDATE_EMAIL)) { $reserve_email = ''; } $catering = sanitize_text($_POST['catering'] ?? ''); $tags = sanitize_text($_POST['tags'] ?? ''); $description = trim($_POST['description'] ?? ''); $existing_image = sanitize_text($_POST['existing_image'] ?? ''); if ($title === '' || $date === '') { $error = 'Titel und Datum sind Pflichtfelder.'; } else { try { $imagePath = $existing_image; if (!empty($_FILES['image']['name'])) { $imagePath = handle_image_upload($_FILES['image']); } $slug = make_slug($title, $date); // Update falls vorhanden $events = load_events(); $idx = null; foreach ($events as $k => $ev) { if ($ev['id'] === $id) { $idx = $k; break; } } $record = [ 'id' => $id, 'title' => $title, 'speaker' => $speaker, 'date' => $date, 'time' => $time, 'venue_name' => $venue_name, 'venue_address' => $venue_address, 'price' => $price, 'doors_open' => $doors_open, 'tickets_info' => $tickets_info, 'reserve_by_mail' => $reserve_by_mail, 'reserve_email' => $reserve_email, 'catering' => $catering, 'tags' => $tags, 'description' => $description, 'image' => $imagePath, 'slug' => $slug, 'updated_at' => now_iso() ]; if ($idx !== null) { $events[$idx] = $record; } else { $record['created_at'] = now_iso(); $events[] = $record; } save_events($events); header('Location: admin.php?ok=1'); exit; } catch (Throwable $e) { $error = 'Fehler: ' . $e->getMessage(); } } } // DELETE if (isset($_GET['delete'])) { $events = load_events(); $id = $_GET['delete']; $events = array_values(array_filter($events, fn($e) => $e['id'] !== $id)); save_events($events); header('Location: admin.php?deleted=1'); exit; } // EDIT load $editEvent = null; if (isset($_GET['edit'])) { $id = $_GET['edit']; foreach (load_events() as $e) { if ($e['id'] === $id) { $editEvent = $e; break; } } } try { $nonWebpUploads = find_non_webp_uploads(); } catch (Throwable $e) { $nonWebpUploads = []; $migrationError = 'Upload-Prüfung fehlgeschlagen: ' . $e->getMessage(); } } ?>
Anlegen, bearbeiten, Bilder hochladen.
Noch keine Einträge.
| Datum | Titel | Ort | |
|---|---|---|---|
| = h($e['date']) ?> = h($e['time']) ?> |
= h($e['title']) ?>
= h($e['speaker']) ?>
Mail‑Reservierung
|
= h($e['venue_name']) ?> | Bearbeiten Löschen |
Keine archivierten Vorträge vorhanden.
| Datum | Titel | Ort | |
|---|---|---|---|
| = h($e['date']) ?> = h($e['time']) ?> |
= h($e['title']) ?>
= h($e['speaker']) ?>
Mail‑Reservierung
|
= h($e['venue_name']) ?> | Bearbeiten Löschen |
Tipp