diff --git a/CSS/style.css b/CSS/style.css index b1097a0..f0c3687 100644 --- a/CSS/style.css +++ b/CSS/style.css @@ -405,4 +405,114 @@ a { .nav-links .links { margin: 0 12px; } +} + +/* Tabellen-Design */ +table { + width: 100%; + border-collapse: separate; + border-spacing: 0; + background: #fff; + border-radius: 10px; + box-shadow: 0 2px 12px rgba(0,0,0,0.07); + margin: 24px 0; + overflow: hidden; +} +thead th { + background: #BAC8D4; + color: #222; + font-weight: 600; + padding: 12px 8px; + text-align: left; + border-bottom: 2px solid #e0e0e0; +} +tbody td { + padding: 10px 8px; + border-bottom: 1px solid #f0f0f0; + vertical-align: top; +} +tbody tr:last-child td { + border-bottom: none; +} +tbody tr:hover { + background: #f5faff; +} +.admin-btn, .admin-btn:visited { + display: inline-block; + background: #4d4d4d; + color: #fff; + border-radius: 5px; + padding: 7px 16px; + margin: 8px 0 12px 0; + text-decoration: none; + font-size: 1em; + font-weight: 500; + transition: background 0.2s; +} +.admin-btn:hover { + background: #222; + color: #fff; +} +td a { + color: #09add0; + text-decoration: underline; + margin: 0 4px; + font-size: 0.98em; +} +td a:hover { + color: #007b9e; +} + +.news-cards { + display: flex; + flex-wrap: wrap; + gap: 24px; + justify-content: flex-start; + margin: 24px 0; +} +.news-card { + background: #fff; + border-radius: 12px; + box-shadow: 0 2px 12px rgba(0,0,0,0.08); + padding: 20px 18px 16px 18px; + max-width: 340px; + min-width: 220px; + flex: 1 1 300px; + display: flex; + flex-direction: column; + justify-content: space-between; + margin: 0; +} +.news-card h3 { + margin: 0 0 8px 0; + font-size: 1.2em; + color: #222; +} +.news-card .news-date { + font-size: 0.95em; + color: #888; + margin-bottom: 10px; +} +.news-card .news-desc { + font-size: 1em; + color: #333; + margin-bottom: 14px; + white-space: pre-line; +} +.news-card .admin-btn { + align-self: flex-end; + margin: 0 0 0 8px; + padding: 6px 12px; + font-size: 0.97em; +} +@media (max-width: 700px) { + .news-cards { + flex-direction: column; + gap: 16px; + } + .news-card { + max-width: 98vw; + min-width: unset; + width: 100%; + } } \ No newline at end of file diff --git a/Controller/AuthController.php b/Controller/AuthController.php index db50723..c59dd1f 100644 --- a/Controller/AuthController.php +++ b/Controller/AuthController.php @@ -48,12 +48,13 @@ class AuthController $result = $this->model->login($email, $password); - if ($result === true) { - $_SESSION['user'] = $email; + if ($result['success']) { + $_SESSION['user'] = $result['user']['email']; + $_SESSION['is_admin'] = $result['user']['is_admin']; $this->view->setDoMethodName('showLoginSuccess'); } else { $this->view->setVars([ - 'errors' => ['login' => is_string($result) ? $result : "Login fehlgeschlagen."], + 'errors' => ['login' => $result['error']], 'validData' => ['email' => $email], 'loginSuccess' => false ]); diff --git a/Controller/NewsController.php b/Controller/NewsController.php index a2c7620..72a0924 100644 --- a/Controller/NewsController.php +++ b/Controller/NewsController.php @@ -20,14 +20,38 @@ class NewsController { } public function createNews() { + if (!isset($_SESSION['is_admin']) || !$_SESSION['is_admin']) { + header('Location: index.php?controller=News&do=showNews'); + exit; + } $data = [ - 'name' => $_POST['name'], - 'beschreibung' => $_POST['beschreibung'], - 'datum' => $_POST['datum'], + 'name' => $_POST['name'] ?? '', + 'description' => $_POST['description'] ?? '', + 'date' => $_POST['date'] ?? date('Y-m-d'), ]; - $erg = $this->model->createNews($data); - $this->view->setVars(['news' => $erg]); - exit; + $errors = []; + if (empty($data['name']) || empty($data['description']) || empty($data['date'])) { + $errors['news'] = 'Bitte alle Felder ausfüllen.'; + } + if (!empty($errors)) { + $this->view->setVars(['errors' => $errors, 'validData' => $data]); + $this->view->setDoMethodName('createNewsForm'); + return; + } + $this->model->createNews($data); + $this->view->setDoMethodName('showCreateSuccess'); + } + + public function createNewsForm() { + if (!isset($_SESSION['is_admin']) || !$_SESSION['is_admin']) { + header('Location: index.php?controller=News&do=showNews'); + exit; + } + // Leere Felder für das Formular + $this->view->setVars([ + 'errors' => [], + 'validData' => [] + ]); } public function editNewsForm() { @@ -47,7 +71,14 @@ class NewsController { } public function deleteNews() { - $id = $_GET['newsid'] ?? null; - $this->model->deleteNews($id); + if (!isset($_SESSION['is_admin']) || !$_SESSION['is_admin']) { + header('Location: index.php?controller=News&do=showNews'); + exit; + } + $id = $_GET['id'] ?? null; + if ($id) { + $this->model->deleteNews($id); + } + $this->view->setDoMethodName('showDeleteSuccess'); } } \ No newline at end of file diff --git a/Model/AuthModel.php b/Model/AuthModel.php index 486b506..1bc32b9 100644 --- a/Model/AuthModel.php +++ b/Model/AuthModel.php @@ -11,7 +11,7 @@ class AuthModel extends Database public function login(string $email, string $password) { $pdo = $this->linkDB(); - $sql = "SELECT email, password, valid_until FROM user WHERE email = :email"; + $sql = "SELECT email, password, valid_until, is_admin FROM user WHERE email = :email"; $params = [":email" => $email]; try { @@ -20,15 +20,15 @@ class AuthModel extends Database $user = $sth->fetch(PDO::FETCH_ASSOC); } catch (PDOException $e) { new \Blog\Library\ErrorMsg("Fehler beim Abrufen der Benutzerdaten.", $e); - return "Interner Datenbankfehler."; // Nur für Debug sichtbar machen, sonst besser allgemein halten + return ['success' => false, 'error' => "Interner Datenbankfehler."]; } if (!$user) { - return "Benutzer mit dieser E-Mail wurde nicht gefunden."; + return ['success' => false, 'error' => "Benutzer mit dieser E-Mail wurde nicht gefunden."]; } if (!password_verify($password, $user['password'])) { - return "Das eingegebene Passwort ist falsch."; + return ['success' => false, 'error' => "Das eingegebene Passwort ist falsch."]; } try { @@ -36,14 +36,14 @@ class AuthModel extends Database $validUntil = new DateTime($user['valid_until']); if ($now > $validUntil) { - return "Ihr Passwort ist abgelaufen. Bitte setzen Sie ein neues über \"Passwort vergessen\"."; + return ['success' => false, 'error' => "Ihr Passwort ist abgelaufen. Bitte setzen Sie ein neues über \"Passwort vergessen\"."]; } } catch (\Exception $e) { new \Blog\Library\ErrorMsg("Fehler beim Verarbeiten des Gültigkeitsdatums.", $e); - return "Fehler bei der Passwortprüfung."; + return ['success' => false, 'error' => "Fehler bei der Passwortprüfung."]; } - return true; + return ['success' => true, 'user' => $user]; } public function register($data) { diff --git a/Model/NewsModel.php b/Model/NewsModel.php index fbe3114..3cb02ec 100644 --- a/Model/NewsModel.php +++ b/Model/NewsModel.php @@ -56,9 +56,9 @@ class NewsModel extends Database { $pdo = $this->linkDB(); $sql = "INSERT INTO news (name, description, date) VALUES (:name, :description, :date);"; $params = [ - ":name" => $news['titel'], - ":description" => $news['inhalt'], - ":date" => $news['datum'] + ":name" => $news['name'], + ":description" => $news['description'], + ":date" => $news['date'] ]; try { $sth = $pdo->prepare($sql); diff --git a/Views/News/createNewsForm.phtml b/Views/News/createNewsForm.phtml new file mode 100644 index 0000000..7f0b17f --- /dev/null +++ b/Views/News/createNewsForm.phtml @@ -0,0 +1,20 @@ +
+
+

News erstellen

+ +
+ +
+ + + + + + + + + +
+ Zurück zur Übersicht +
+
\ No newline at end of file diff --git a/Views/News/showCreateSuccess.phtml b/Views/News/showCreateSuccess.phtml new file mode 100644 index 0000000..2e3a2fa --- /dev/null +++ b/Views/News/showCreateSuccess.phtml @@ -0,0 +1,14 @@ +
+
+

News erfolgreich erstellt!

+

Du wirst in wenigen Sekunden zur Übersicht weitergeleitet...

+
+
+ + \ No newline at end of file diff --git a/Views/News/showDeleteSuccess.phtml b/Views/News/showDeleteSuccess.phtml new file mode 100644 index 0000000..cac30ed --- /dev/null +++ b/Views/News/showDeleteSuccess.phtml @@ -0,0 +1,14 @@ +
+
+

News erfolgreich gelöscht!

+

Du wirst in wenigen Sekunden zur Übersicht weitergeleitet...

+
+
+ + diff --git a/Views/News/showNews.phtml b/Views/News/showNews.phtml index ba9c1ad..3304424 100644 --- a/Views/News/showNews.phtml +++ b/Views/News/showNews.phtml @@ -1,27 +1,24 @@
-

Alle Infos

-
- - - - - - - - - +

Alle News

+ + News erstellen + +
-
- - - - - +
+

+
+
+ +
+ Bearbeiten + Löschen +
+ +
- -
NameBeschreibungDatum

Derzeit sind keine News verfügbar.