Files
domili/info.php
2025-10-30 03:15:51 +01:00

215 lines
11 KiB
PHP
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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'); ?>