215 lines
11 KiB
PHP
Executable File
215 lines
11 KiB
PHP
Executable File
<?php
|
||
// 🔐 Sicherheits- und Datenbanklogik zuerst – VOR jeglicher HTML-Ausgabe
|
||
include('inc/check_login.php');
|
||
require_once('inc/db.php');
|
||
|
||
$is_admin = ($_SESSION['role'] === 'admin');
|
||
$message = '';
|
||
$message_type = '';
|
||
$edit_mode = false;
|
||
$edit_release = null;
|
||
|
||
// --- Nur Admins: Aktionen verarbeiten ---
|
||
if ($is_admin) {
|
||
// Löschen
|
||
if (isset($_GET['action']) && $_GET['action'] === 'delete' && isset($_GET['id'])) {
|
||
$id = (int)$_GET['id'];
|
||
$stmt = mysqli_prepare($conn, "DELETE FROM releases WHERE id = ?");
|
||
mysqli_stmt_bind_param($stmt, "i", $id);
|
||
if (mysqli_stmt_execute($stmt)) {
|
||
$_SESSION['message'] = "Version erfolgreich gelöscht!";
|
||
$_SESSION['message_type'] = 'success';
|
||
} else {
|
||
$_SESSION['message'] = "Fehler beim Löschen.";
|
||
$_SESSION['message_type'] = 'danger';
|
||
}
|
||
mysqli_stmt_close($stmt);
|
||
header("Location: info.php");
|
||
exit();
|
||
}
|
||
|
||
// Bearbeiten: Daten laden
|
||
if (isset($_GET['action']) && $_GET['action'] === 'edit' && isset($_GET['id'])) {
|
||
$id = (int)$_GET['id'];
|
||
$stmt = mysqli_prepare($conn, "SELECT id, version, release_date, notes FROM releases WHERE id = ?");
|
||
mysqli_stmt_bind_param($stmt, "i", $id);
|
||
mysqli_stmt_execute($stmt);
|
||
$result = mysqli_stmt_get_result($stmt);
|
||
$edit_release = mysqli_fetch_assoc($result);
|
||
mysqli_stmt_close($stmt);
|
||
$edit_mode = true;
|
||
if (!$edit_release) {
|
||
$_SESSION['message'] = "Version nicht gefunden.";
|
||
$_SESSION['message_type'] = 'warning';
|
||
}
|
||
}
|
||
|
||
// Speichern (POST)
|
||
if ($_SERVER["REQUEST_METHOD"] === "POST") {
|
||
$version = trim($_POST['version'] ?? '');
|
||
$date = trim($_POST['date'] ?? '');
|
||
$notes = trim($_POST['notes'] ?? '');
|
||
$id = !empty($_POST['id']) ? (int)$_POST['id'] : null;
|
||
|
||
if (empty($version) || empty($date) || empty($notes)) {
|
||
$_SESSION['message'] = "Alle Felder sind erforderlich.";
|
||
$_SESSION['message_type'] = 'danger';
|
||
} elseif (!preg_match('/^v\d+\.\d+\.\d+$/', $version)) {
|
||
$_SESSION['message'] = "Ungültiges Versionsformat. Beispiel: v1.4.2";
|
||
$_SESSION['message_type'] = 'danger';
|
||
} elseif (!strtotime($date)) {
|
||
$_SESSION['message'] = "Ungültiges Datum.";
|
||
$_SESSION['message_type'] = 'danger';
|
||
} else {
|
||
if ($id) {
|
||
$stmt = mysqli_prepare($conn, "UPDATE releases SET version = ?, release_date = ?, notes = ? WHERE id = ?");
|
||
mysqli_stmt_bind_param($stmt, "sssi", $version, $date, $notes, $id);
|
||
} else {
|
||
$stmt = mysqli_prepare($conn, "INSERT INTO releases (version, release_date, notes) VALUES (?, ?, ?)");
|
||
mysqli_stmt_bind_param($stmt, "sss", $version, $date, $notes);
|
||
}
|
||
|
||
if (mysqli_stmt_execute($stmt)) {
|
||
$_SESSION['message'] = $id ? "Version aktualisiert!" : "Neue Version hinzugefügt!";
|
||
$_SESSION['message_type'] = 'success';
|
||
mysqli_stmt_close($stmt);
|
||
header("Location: info.php");
|
||
exit();
|
||
} else {
|
||
$_SESSION['message'] = "Fehler beim Speichern.";
|
||
$_SESSION['message_type'] = 'danger';
|
||
}
|
||
mysqli_stmt_close($stmt);
|
||
}
|
||
}
|
||
}
|
||
|
||
// --- Meldungen aus Session holen (nach Redirects) ---
|
||
if (isset($_SESSION['message'])) {
|
||
$message = $_SESSION['message'];
|
||
$message_type = $_SESSION['message_type'];
|
||
unset($_SESSION['message'], $_SESSION['message_type']);
|
||
}
|
||
|
||
// --- Daten für Anzeige laden ---
|
||
$releases = [];
|
||
$result = mysqli_query($conn, "SELECT id, version, release_date, notes FROM releases ORDER BY release_date DESC, id DESC");
|
||
while ($row = mysqli_fetch_assoc($result)) {
|
||
$row['notes_array'] = array_filter(array_map('trim', explode("\n", $row['notes'])));
|
||
$releases[] = $row;
|
||
}
|
||
$current_release = $releases[0] ?? null;
|
||
|
||
// --- Erst JETZT: HTML-Header einbinden ---
|
||
require_once('inc/header.php');
|
||
?>
|
||
|
||
<div class="container mt-5 mb-4">
|
||
<?php if ($message): ?>
|
||
<div class="alert alert-<?= htmlspecialchars($message_type) ?> alert-dismissible fade show" role="alert">
|
||
<?= htmlspecialchars($message) ?>
|
||
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
|
||
</div>
|
||
<?php endif; ?>
|
||
|
||
<div class="row justify-content-center">
|
||
<div class="col-lg-8">
|
||
<h2 class="mb-4">ℹ️ Info & Versionshinweise</h2>
|
||
|
||
<?php if ($current_release): ?>
|
||
<div class="card shadow mb-4">
|
||
<div class="card-header bg-primary-subtle text-secondary">
|
||
<h4 class="mb-0">Aktuelle Version</h4>
|
||
</div>
|
||
<div class="card-body">
|
||
<p class="h5 mb-0"><?= htmlspecialchars($current_release['version']) ?></p>
|
||
<p class="text-muted small mb-0">Veröffentlicht am: <?= date('d.m.Y', strtotime($current_release['release_date'])) ?></p>
|
||
</div>
|
||
</div>
|
||
<?php endif; ?>
|
||
|
||
<div class="card shadow">
|
||
<div class="card-header bg-secondary bg-opacity-50 text-secondary d-flex justify-content-between align-items-center">
|
||
<h4 class="mb-0">Release Notes</h4>
|
||
<?php if ($is_admin): ?>
|
||
<a class="btn btn-sm d-flex align-items-center justify-content-center" data-bs-toggle="collapse" href="#releaseFormCollapse" role="button" aria-expanded="false" aria-controls="releaseFormCollapse">Add
|
||
<span class="material-symbols-outlined">add</span>
|
||
</a>
|
||
<?php endif; ?>
|
||
</div>
|
||
<div class="card-body">
|
||
|
||
<?php if ($is_admin): ?>
|
||
<div class="collapse <?= $edit_mode ? 'show' : '' ?>" id="releaseFormCollapse">
|
||
<div class="card card-body bg-light mb-4">
|
||
<h5><?= $edit_mode ? 'Version bearbeiten' : 'Neue Version hinzufügen'; ?></h5>
|
||
<form method="POST">
|
||
<?php if ($edit_mode): ?>
|
||
<input type="hidden" name="id" value="<?= htmlspecialchars($edit_release['id']); ?>">
|
||
<?php endif; ?>
|
||
<div class="mb-3">
|
||
<label class="form-label">Versionsnummer</label>
|
||
<input type="text" class="form-control" name="version" value="<?= htmlspecialchars($edit_release['version'] ?? ''); ?>" placeholder="z. B. v1.5.0" required>
|
||
<div class="form-text">Format: v1.4.2</div>
|
||
</div>
|
||
<div class="mb-3">
|
||
<label class="form-label">Veröffentlichungsdatum</label>
|
||
<input type="date" class="form-control" name="date" value="<?= htmlspecialchars($edit_release['release_date'] ?? date('Y-m-d')); ?>" required>
|
||
</div>
|
||
<div class="mb-3">
|
||
<label class="form-label">Release Notes (ein Punkt pro Zeile)</label>
|
||
<textarea class="form-control" name="notes" rows="5" required><?= htmlspecialchars($edit_release['notes'] ?? '') ?></textarea>
|
||
</div>
|
||
<div class="d-flex gap-2">
|
||
<button type="submit" class="btn btn-sm btn-outline-<?= $edit_mode ? 'success' : 'primary'; ?>"><?= $edit_mode ? 'Speichern' : 'Hinzufügen'; ?></button>
|
||
<a href="info.php" class="btn btn-sm btn-outline-secondary">Abbrechen</a>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
<?php endif; ?>
|
||
|
||
<?php if (empty($releases)): ?>
|
||
<p class="text-muted">Keine Release Notes vorhanden.</p>
|
||
<?php else: ?>
|
||
<?php foreach ($releases as $release): ?>
|
||
<div class="d-flex align-items-start">
|
||
<div class="flex-grow-1">
|
||
<h5 class="mt-4 mb-1"><?= htmlspecialchars($release['version']) ?></h5>
|
||
<p class="text-muted small mb-3">Veröffentlicht am: <?= date('d.m.Y', strtotime($release['release_date'])) ?></p>
|
||
<ul class="mb-4">
|
||
<?php foreach ($release['notes_array'] as $note): ?>
|
||
<li><?= htmlspecialchars($note) ?></li>
|
||
<?php endforeach; ?>
|
||
</ul>
|
||
</div>
|
||
<?php if ($is_admin): ?>
|
||
<div class="dropdown ms-3 mt-4">
|
||
<a href="#" class="text-secondary" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||
<span class="material-icons">more_vert</span>
|
||
</a>
|
||
<ul class="dropdown-menu dropdown-menu-end">
|
||
<li>
|
||
<a class="dropdown-item d-flex align-items-center" href="info.php?action=edit&id=<?= $release['id'] ?>">
|
||
<span class="material-icons me-2">mode_edit_outline</span> Bearbeiten
|
||
</a>
|
||
</li>
|
||
<li>
|
||
<a class="dropdown-item d-flex align-items-center text-danger" href="info.php?action=delete&id=<?= $release['id'] ?>" onclick="return confirm('Wirklich löschen?')">
|
||
<span class="material-icons me-2">delete_outline</span> Löschen
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<?php endif; ?>
|
||
</div>
|
||
<?php endforeach; ?>
|
||
<?php endif; ?>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<?php include('inc/footer.php'); ?>
|