Compare commits

...

55 Commits

Author SHA1 Message Date
niklas.ortmann c32f31204e Merge pull request 'Abgabe03: Profilbearbeitung: Reviewnacharbeitung' (#23) from dev into Abgabe03
Reviewed-on: #23
2026-06-03 22:26:24 +02:00
niklas.ortmann b130bf9e19 Merge pull request 'Profilbearbeitung: Reviewnacharbeitung' (#22) from Profilbearbeitung into dev
Reviewed-on: #22
2026-06-03 22:25:42 +02:00
caroline.slt 1314362df9 Buttonfix 2026-06-03 21:32:14 +02:00
caroline.slt 5a1c032f1b Reviewnacharbeitung 2026-06-03 21:27:08 +02:00
caroline.slt fae4bc86ad Reviewnacharbeitung 2026-06-03 21:16:31 +02:00
caroline.slt 664092d52f Reviewnacharbeitung 2026-06-03 21:14:01 +02:00
caroline.slt 22b1dd827d Reviewnacharbeitung 2026-06-03 21:09:34 +02:00
caroline.slt 50df844e23 Reviewnacharbeitung 2026-06-03 21:05:32 +02:00
caroline.slt 45b6b41d60 Reviewnacharbeitung 2026-06-03 21:01:28 +02:00
caroline.slt a0a79e0191 Reviewnacharbeitung 2026-06-03 20:58:26 +02:00
niklas.ortmann 722f4055a5 Merge pull request 'Abgabe03' (#21) from dev into Abgabe03
Reviewed-on: #21
2026-06-03 20:30:43 +02:00
niklas.ortmann 46def40a14 statische Beiträge löschen 2026-06-03 20:23:10 +02:00
niklas.ortmann a76113dcaf Merge branch 'dev' of https://git.gigaworld.ddns.net/niklas.ortmann/webprogrammierung into dev 2026-06-03 20:21:46 +02:00
niklas.ortmann f56a04c3ab css 2026-06-03 20:21:28 +02:00
niklas.ortmann 7f891b6ebf Merge pull request 'Kategorien nicht statisch sondern dynamisch' (#20) from dynamicCategories into dev
Reviewed-on: #20
2026-06-03 20:15:16 +02:00
niklas.ortmann 1343496a12 Merge pull request 'Vor und Nachname separat speichern sowie Profilbearbeitung' (#18) from Profilbearbeitung into dev
Reviewed-on: #18
2026-06-03 20:13:03 +02:00
niklas.ortmann 1735dd28a2 Update README.md 2026-06-03 20:12:14 +02:00
caroline.slt bfc9ee4d01 Reviewnacharbeitung 2026-06-03 20:07:57 +02:00
niklas.ortmann 9321d09489 Update home.php 2026-06-03 20:00:33 +02:00
niklas.ortmann 7269ea03db Update showCategory-controller.php 2026-06-03 19:58:09 +02:00
niklas.ortmann 2a3a15c92d Update showCategory.php 2026-06-03 19:58:05 +02:00
niklas.ortmann a7f1729e6e Update ArticleManager.php 2026-06-03 19:56:12 +02:00
niklas.ortmann cdccb0bfe8 debugging 2026-06-03 19:51:58 +02:00
niklas.ortmann 48501a9069 Update ArticleManager.php 2026-06-03 19:51:06 +02:00
niklas.ortmann a175765e33 Update main.css 2026-06-03 19:49:45 +02:00
niklas.ortmann 3d57c2e482 Update 404.php 2026-06-03 19:46:25 +02:00
niklas.ortmann bac4334fb8 Update showCategory-controller.php 2026-06-03 19:44:47 +02:00
niklas.ortmann aa3e7c2f36 Update showCategory.php 2026-06-03 19:43:41 +02:00
niklas.ortmann 46cd524f70 Update showCategory-controller.php 2026-06-03 19:43:40 +02:00
niklas.ortmann 86fb37abc4 Update showCategory-controller.php 2026-06-03 19:39:48 +02:00
niklas.ortmann 9349b91926 Update showCategory.php 2026-06-03 19:39:46 +02:00
niklas.ortmann b9c86e2074 Update showCategory-controller.php 2026-06-03 19:37:36 +02:00
niklas.ortmann 68672474e4 Update showCategory-controller.php 2026-06-03 19:36:49 +02:00
niklas.ortmann a08197cc10 Update showCategory-controller.php 2026-06-03 19:36:22 +02:00
niklas.ortmann e28620d9fb debugging 2026-06-03 19:35:13 +02:00
niklas.ortmann ded98ed757 Update LocalArticleManager.php 2026-06-03 19:34:51 +02:00
niklas.ortmann 18fe69cbcd Update showCategory-controller.php 2026-06-03 19:34:48 +02:00
niklas.ortmann e35d07ebc3 Update LocalArticleManager.php 2026-06-03 19:33:02 +02:00
niklas.ortmann e772a8b57f Kategorien nicht statisch sondern dynamisch 2026-06-03 19:29:29 +02:00
niklas.ortmann 9c3ebc9877 Merge pull request 'WIP Suche implementiert, sowie Sortieren der Ergebnisse' (#19) from ImplementedSearch into dev
Reviewed-on: #19
2026-06-03 16:07:41 +02:00
caroline.slt 92574a0f76 Profildaten bearbeiten 2026-06-02 22:42:47 +02:00
caroline.slt ade73f3105 Vor und Nachname separat speichern 2026-06-02 22:10:15 +02:00
caroline.slt ee75620cd8 Vor und Nachname separat speichern 2026-06-02 22:01:38 +02:00
caroline.slt 94486e2b0a Vor und Nachname separat speichern 2026-06-02 21:56:52 +02:00
NOrtmann1 a26e985edf Update README.md 2026-06-02 18:32:57 +02:00
NOrtmann1 cf9ac795eb Readme + Kommentare 2026-06-02 18:20:35 +02:00
niklas.ortmann a519387773 Update updateArticle-controller.php 2026-06-02 15:45:34 +02:00
niklas.ortmann ed40596389 Update createArticle.css 2026-06-02 15:43:37 +02:00
niklas.ortmann 4c855c05ed css 2026-06-02 15:42:07 +02:00
niklas.ortmann e7189245d5 css 2026-06-02 15:37:35 +02:00
niklas.ortmann 709a4ba83c commenting 2026-06-02 15:34:19 +02:00
niklas.ortmann fb54ba2462 updateArticle-Exceptions 2026-06-02 15:31:02 +02:00
niklas.ortmann c6b55030cf updateArticle - Exeptions 2026-06-02 15:22:18 +02:00
niklas.ortmann af04557f58 Update updateArticle-controller.php 2026-06-02 15:04:52 +02:00
niklas.ortmann 2c100bddf2 Update updateArticle-controller.php 2026-06-02 15:04:05 +02:00
28 changed files with 654 additions and 358 deletions
+29 -11
View File
@@ -1,13 +1,31 @@
Team Tag-Buchstabe: DI-14-C-Schulte-Eilers-Ortmann # Webprogrammierung: Gruppe DI-14-C
Namen der Studierenden:
- Name 1 Caroline Schulte
- Name 2 Jacques Eilers
- Name 3 Niklas Ortmann
Abgabe zu Aufgabenblatt 1
Hinweise: ## Beteiligte
index.html wurde zu einer index.php umbenannt. - Caroline Schulte
webhook.php bitte ignorieren. Diese dient nur als zukünftige Automatisierung des Repo-Pulls (s. https://docs.gitea.com/usage/webhooks) - Jacques Eilers
- Niklas Ortmann
Beim Verwenden der Navbar-Links bitte Folgendes beachten: nur die Kategorien Physik, Mathe, Informatik führen exemplarisch auf eine Beispiel-Seite. ## Login-Informationen für Dummy-User
Die anderen Links sind erstmal Platzhalter, dessen dynamischer Inhalt später mit PHP in die index.php eingefügt wird. Alle anderen Links führen auf eine 404-Seite. Jeweils im Format `Anmeldename, Passwort, Mailadresse`:
- `max.mustermann, test123, mustermann@web.de`
## Weitere Voraussetzungen zur Nutzung
- Per Klick auf das Logo gelangt man auf die Home-Seite.
## Ausgelassene Teilaufgaben
## Bekannte Fehler und Mängel
- Der Beitragseditor fügt beim Laden von Inhalten leere Zeichen ein.
- Bitte auf die gesetzten TODO's achten. Wenn Inhalte fehlen, sind sie i.d.R. als TODO kommentiert.
- Die Navbar hat noch keine onHover-Effekte und erschwert etwas die Bedienung.
- Suchleiste in der Nav ist in der mobilen Ansicht etwas schmal. Ggf. ein alternatives (kleineres) Logo implementieren.
## Besonderheiten des Projektes
- Es wurde ein einfacher Beitrags-Editor erstellt. Mit diesem können Beiträge erstellt oder bearbeitet werden.
Es handelt es sich um eine einfache Version. Später sollen z.B. Bilder und die Positionierung der Elemente folgen.
- Es sind drei Dummy-Beiträge für den Nutzer max.mustermann hinterlegt.
- Beim Verwenden der Navbar-Links bitte Folgendes beachten: nur die Kategorien Physik, Mathe, Informatik führen exemplarisch auf eine Beispiel-Seite.
Die anderen Links sind erstmal Platzhalter und führen auf eine 404-Seite.
- Die Such-Seite umfasst eine Suchfunktion (aber noch nicht nach Tags) und Sortierfunktion. Jedoch fehlt noch eine Filterfunktion (z.B. nur Mathe anzeigen).
Wenn die Filterfunktion implementiert ist, dann können die statischen Seiten "Informatik", "Mathe", "Physik" entfernt und dynamisch auf der Suchseite
nach gefiltertem Fach angezeigt werden. (Vorläufige showCategory.php implementiert)
+8
View File
@@ -4,6 +4,14 @@
--> -->
<main> <main>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "internal_error"): ?>
<p class="alert-message is-error">
Es ist ein interner Fehler beim Speichern aufgetreten. Bitte versuche es erneut.
</p>
<?php endif; ?>
<?php
unset($_SESSION["message"]);
?>
<h1>404 - Seite nicht vorhanden</h1> <h1>404 - Seite nicht vorhanden</h1>
<p> <p>
Später im Projekt sollen über index.php?pfad= ... der Inhalt der index.php dynamisch gesetzt werden. Später im Projekt sollen über index.php?pfad= ... der Inhalt der index.php dynamisch gesetzt werden.
+1 -1
View File
@@ -62,7 +62,7 @@ if (!isset($_SESSION["user"])) {
<aside class="editor-sidebar"> <aside class="editor-sidebar">
<div class="sidebar-block"> <div class="sidebar-block">
<button type="submit" class="btn-publish">Veröffentlichen</button> <button type="submit" id="editor-button" class="button">Veröffentlichen</button>
</div> </div>
<div class="sidebar-block"> <div class="sidebar-block">
+8 -3
View File
@@ -17,6 +17,11 @@ include_once 'php/controller/home-controller.php';
Dein Beitrag wurde erfolgreich veröffentlicht! Dein Beitrag wurde erfolgreich veröffentlicht!
</p> </p>
<?php endif; ?> <?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "invalid_category"): ?>
<p class="alert-message is-error">
Diese Kategorie ist nicht gültig.
</p>
<?php endif; ?>
<?php <?php
unset($_SESSION["message"]); unset($_SESSION["message"]);
?> ?>
@@ -34,21 +39,21 @@ include_once 'php/controller/home-controller.php';
<!-- Flexbox --> <!-- Flexbox -->
<div class="flexbox"> <div class="flexbox">
<div class="container"> <div class="container">
<a href="index.php?pfad=informatik" class="category-link">Informatik</a> <a href="index.php?pfad=showCategory&category=informatik" class="category-link">Informatik</a>
<div class="article-link"> <div class="article-link">
<a href="index.php?pfad=showArticle&id=<?php echo $dummy3->getId()?>"><?php if(isset($dummy3)){echo $dummy3->getTitle();}else{echo "Fehler: Beitrag nicht gefunden!";} ?></a> <a href="index.php?pfad=showArticle&id=<?php echo $dummy3->getId()?>"><?php if(isset($dummy3)){echo $dummy3->getTitle();}else{echo "Fehler: Beitrag nicht gefunden!";} ?></a>
</div> </div>
</div> </div>
<div class="container"> <div class="container">
<a href="index.php?pfad=mathe" class="category-link">Mathe</a> <a href="index.php?pfad=showCategory&category=mathe" class="category-link">Mathe</a>
<div class="article-link"> <div class="article-link">
<a href="index.php?pfad=showArticle&id=<?php echo $dummy1->getId()?>"><?php if(isset($dummy1)){echo $dummy1->getTitle();}else{echo "Fehler: Beitrag nicht gefunden!";} ?></a> <a href="index.php?pfad=showArticle&id=<?php echo $dummy1->getId()?>"><?php if(isset($dummy1)){echo $dummy1->getTitle();}else{echo "Fehler: Beitrag nicht gefunden!";} ?></a>
</div> </div>
</div> </div>
<div class="container"> <div class="container">
<a href="index.php?pfad=physik" class="category-link">Physik</a> <a href="index.php?pfad=showCategory&category=physik" class="category-link">Physik</a>
<div class="article-link"> <div class="article-link">
<a href="index.php?pfad=showArticle&id=<?php echo $dummy2->getId()?>"><?php if(isset($dummy2)){echo $dummy2->getTitle();}else{echo "Fehler: Beitrag nicht gefunden!";} ?></a> <a href="index.php?pfad=showArticle&id=<?php echo $dummy2->getId()?>"><?php if(isset($dummy2)){echo $dummy2->getTitle();}else{echo "Fehler: Beitrag nicht gefunden!";} ?></a>
</div> </div>
+1 -1
View File
@@ -37,7 +37,7 @@ $error = $error ?? null;
<button type="submit" <button type="submit"
value="anmelden" value="anmelden"
name="loginSubmit" name="loginSubmit"
class="login-button"> class="button">
anmelden anmelden
</button> </button>
+104 -30
View File
@@ -1,79 +1,144 @@
<?php <?php
include_once 'php/controller/profile-controller.php'; include_once 'php/controller/profile-controller.php';
$user = $user ?? null;
?>
<!-- $user = $user ?? null;
Content: Profil $isEditMode = (isset($_GET["edit"]) && $_GET["edit"] === "1") || !empty($error);
Inhalt: Das eigene Profil, wenn man angemeldet ist. Dort hat man die Möglichkeit seine Angaben zu ändern. ?>
-->
<main class="form-page"> <main class="form-page">
<div class="flexbox"> <div class="flexbox">
<!-- Linke Spalte: Profildaten -->
<div class="container"> <div class="container">
<form>
<label class="input-label">Name</label> <?php if (!empty($error)): ?>
<p class="alert-message is-error">
<?php echo htmlspecialchars($error); ?>
</p>
<?php endif; ?>
<form method="post" action="index.php?pfad=profile">
<label class="input-label">Vorname</label>
<input type="text" <input type="text"
name="vorname"
class="login-input" class="login-input"
readonly value="<?php echo htmlspecialchars($_POST["vorname"] ?? $user["vorname"] ?? ""); ?>"
value="<?php echo htmlspecialchars($user["username"] ?? ""); ?>"> <?php echo $isEditMode ? "" : "readonly"; ?>
required>
<label class="input-label">Nachname</label>
<input type="text"
name="nachname"
class="login-input"
value="<?php echo htmlspecialchars($_POST["nachname"] ?? $user["nachname"] ?? ""); ?>"
<?php echo $isEditMode ? "" : "readonly"; ?>
required>
<label class="input-label">Email-Adresse</label> <label class="input-label">Email-Adresse</label>
<input type="email" <input type="email"
name="email"
class="login-input" class="login-input"
readonly value="<?php echo htmlspecialchars($_POST["email"] ?? $user["email"] ?? ""); ?>"
value="<?php echo htmlspecialchars($user["email"] ?? ""); ?>"> <?php echo $isEditMode ? "" : "readonly"; ?>
required>
<label class="input-label">Passwort</label> <label class="input-label">
<?php echo $isEditMode ? "Neues Passwort" : "Passwort"; ?>
</label>
<?php if ($isEditMode): ?>
<input type="password" <input type="password"
name="password"
class="login-input" class="login-input"
readonly placeholder="Leer lassen, wenn es gleich bleiben soll">
value="********"> <?php else: ?>
<input type="password"
name="password"
class="login-input"
value="********"
readonly>
<?php endif; ?>
<br><br>
<?php if ($isEditMode): ?>
<button type="submit"
name="saveProfile"
class="button">
Speichern
</button>
<a href="index.php?pfad=profile" class="button">
Abbrechen
</a>
<?php else: ?>
<a href="index.php?pfad=profile&edit=1" class="button">
Bearbeiten
</a>
<?php endif; ?>
</form> </form>
<br> <br>
<a href="index.php?pfad=deleteAccount" class="login-button"> <a href="index.php?pfad=deleteAccount" class="button">
Account löschen Account löschen
</a> </a>
<br><br> <br><br>
<a href="index.php?pfad=logout" class="login-button"> <a href="index.php?pfad=logout" class="button">
Abmelden Abmelden
</a> </a>
</div> </div>
<!-- Rechte Spalte: Eigene Beiträge -->
<div class="container"> <div class="container">
<h2 class="section-title">Meine Beiträge</h2> <h2 class="section-title">Meine Beiträge</h2>
<div class="articles-list"> <div class="articles-list">
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "internal_error"): ?> <?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "internal_error"): ?>
<p class="alert-message is-error"> <p class="alert-message is-error">
Es ist ein interner Fehler aufgetreten. Bitte versuche es erneut. Es ist ein interner Fehler aufgetreten. Bitte versuche es erneut.
</p> </p>
<?php elseif (isset($userArticles) && count($userArticles) > 0): ?> <?php elseif (isset($userArticles) && count($userArticles) > 0): ?>
<?php foreach ($userArticles as $userArticle): ?> <?php foreach ($userArticles as $userArticle): ?>
<!-- Ein einzelner Artikel-Eintrag -->
<div class="article-item"> <div class="article-item">
<div class="article-meta"> <div class="article-meta">
<span class="article-date"><?php echo htmlspecialchars($userArticle->getCreationDate()); ?></span> <span class="article-date">
<span class="article-category"><?php echo htmlspecialchars($userArticle->getCategory()); ?></span> <?php echo htmlspecialchars($userArticle->getCreationDate()); ?>
</span>
<span class="article-category">
<?php echo htmlspecialchars($userArticle->getCategory()); ?>
</span>
</div> </div>
<h3 class="article-title"><?php echo htmlspecialchars($userArticle->getTitle()); ?></h3>
<h3 class="article-title">
<?php echo htmlspecialchars($userArticle->getTitle()); ?>
</h3>
<?php <?php
$tags = $userArticle->getTags(); $tags = $userArticle->getTags();
if (isset($tags) && !empty($tags)): ?> if (isset($tags) && !empty($tags)):
?>
<div class="article-view-bottom-section"> <div class="article-view-bottom-section">
<div class="article-view-tags-label">Tags:</div> <div class="article-view-tags-label">Tags:</div>
<div class="article-view-tags-list"> <div class="article-view-tags-list">
<?php <?php
$tagArray = is_array($tags) ? $tags : explode(',', $tags); $tagArray = is_array($tags) ? $tags : explode(',', $tags);
foreach ($tagArray as $tag): foreach ($tagArray as $tag):
$trimmedTag = trim($tag); $trimmedTag = trim($tag);
if (!empty($trimmedTag)): if (!empty($trimmedTag)):
?> ?>
<span class="article-view-tag-item"><?php echo htmlspecialchars($trimmedTag); ?></span> <span class="article-view-tag-item">
<?php echo htmlspecialchars($trimmedTag); ?>
</span>
<?php <?php
endif; endif;
endforeach; endforeach;
@@ -81,18 +146,27 @@ $user = $user ?? null;
</div> </div>
</div> </div>
<?php endif; ?> <?php endif; ?>
<a href="index.php?pfad=updateArticle&id=<?php echo $userArticle->getID(); ?>" class="edit-link-button">Bearbeiten</a>
<a href="index.php?pfad=updateArticle&id=<?php echo $userArticle->getID(); ?>"
class="edit-link-button">
Bearbeiten
</a>
</div> </div>
<?php endforeach; ?> <?php endforeach; ?>
<?php else: ?> <?php else: ?>
<p>Du hast noch keine Beiträge erstellt.</p> <p>Du hast noch keine Beiträge erstellt.</p>
<button type="button" class="login-button" onclick="window.location.href='index.php?pfad=createArticle';">
<button type="button"
class="button"
onclick="window.location.href='index.php?pfad=createArticle';">
Beitrag erstellen! Beitrag erstellen!
</button> </button>
<?php endif; ?> <?php endif; ?>
<?php
unset($_SESSION["message"]); <?php unset($_SESSION["message"]); ?>
?>
</div> </div>
</div> </div>
+6 -5
View File
@@ -1,6 +1,4 @@
<?php <?php
include_once 'php/controller/register-controller.php';
$error = $error ?? null; $error = $error ?? null;
?> ?>
@@ -13,8 +11,8 @@ $error = $error ?? null;
<h1>Jetzt Registrieren!</h1> <h1>Jetzt Registrieren!</h1>
<?php if ($error): ?> <?php if (!empty($error)): ?>
<p style="color:red;"> <p class="alert-message is-error" style="color:red;">
<?php echo htmlspecialchars($error); ?> <?php echo htmlspecialchars($error); ?>
</p> </p>
<?php endif; ?> <?php endif; ?>
@@ -26,6 +24,7 @@ $error = $error ?? null;
name="email" name="email"
class="login-input" class="login-input"
placeholder="mustermann@web.de" placeholder="mustermann@web.de"
value="<?php echo htmlspecialchars($_POST["email"] ?? ""); ?>"
required> required>
<p class="input-label">Vorname:</p> <p class="input-label">Vorname:</p>
@@ -33,6 +32,7 @@ $error = $error ?? null;
name="vorname" name="vorname"
class="login-input" class="login-input"
placeholder="Max" placeholder="Max"
value="<?php echo htmlspecialchars($_POST["vorname"] ?? ""); ?>"
required> required>
<p class="input-label">Nachname:</p> <p class="input-label">Nachname:</p>
@@ -40,6 +40,7 @@ $error = $error ?? null;
name="nachname" name="nachname"
class="login-input" class="login-input"
placeholder="Mustermann" placeholder="Mustermann"
value="<?php echo htmlspecialchars($_POST["nachname"] ?? ""); ?>"
required> required>
<p class="input-label">Passwort:</p> <p class="input-label">Passwort:</p>
@@ -52,7 +53,7 @@ $error = $error ?? null;
<button type="submit" <button type="submit"
value="register" value="register"
name="registerSubmit" name="registerSubmit"
class="login-button"> class="button">
kostenlos registrieren kostenlos registrieren
</button> </button>
+31
View File
@@ -0,0 +1,31 @@
<?php
include_once "php/controller/showCategory-controller.php";
?>
<main>
<h1><?php if (isset($category) && !empty($category)){ echo htmlspecialchars($category); } ?></h1>
<div class="s-res-list">
<?php
if (!empty($articles)): ?>
<?php foreach ($articles as $article): ?>
<div class="s-res-item">
<div class="s-res-content">
<h2 class="s-res-item-title">
<a href="index.php?pfad=showArticle&id=<?php echo $article->getId(); ?>" class="s-res-link">
<?php echo htmlspecialchars($article->getTitle()); ?>
</a>
</h2>
<p class="s-res-author">Von: <span class="s-res-author-name"><?php echo htmlspecialchars($article->getAuthor()); ?></span></p>
</div>
<div class="s-res-arrow">&rarr;</div>
</div>
<?php endforeach; ?>
<?php
else: ?>
<p> Es sind noch keine Beiträge in dieser Kategorie enthalten.</p>
<?php endif; ?>
</div>
</main>
+6 -1
View File
@@ -53,6 +53,11 @@ include_once 'php/controller/showArticle-controller.php';
Bei der Validierung deiner Daten ist ein Fehler aufgetreten. Bitte versuche es erneut. Bei der Validierung deiner Daten ist ein Fehler aufgetreten. Bitte versuche es erneut.
</p> </p>
<?php endif; ?> <?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "unauthorized_access"): ?>
<p class="alert-message is-error">
Sie sind nicht berechtigt, diesen Beitrag zu bearbeiten.
</p>
<?php endif; ?>
<?php <?php
unset($_SESSION["message"]); unset($_SESSION["message"]);
?> ?>
@@ -81,7 +86,7 @@ include_once 'php/controller/showArticle-controller.php';
<aside class="editor-sidebar"> <aside class="editor-sidebar">
<div class="sidebar-block"> <div class="sidebar-block">
<button type="submit" class="btn-publish">Änderungen speichern</button> <button type="submit" id="editor-button" class="button">Änderungen speichern</button>
</div> </div>
<div class="sidebar-block"> <div class="sidebar-block">
+2 -14
View File
@@ -86,20 +86,8 @@
} }
/* Button-Zeugs */ /* Button-Zeugs */
.article-editor-scope .btn-publish { .button#editor-button {
background-color: #007cba; padding: 18px 12px;
color: white;
border: none;
padding: 12px;
border-radius: 4px;
font-weight: 600;
cursor: pointer;
font-size: 1rem;
width: 100%;
}
.article-editor-scope .btn-publish:hover {
background-color: #006ba1;
} }
/* Responsive Anpassungen unter 760px (für z.B. Smartphones) */ /* Responsive Anpassungen unter 760px (für z.B. Smartphones) */
+6 -2
View File
@@ -22,6 +22,10 @@ a, button, input, select, textarea, label, main{
font-family: Arial, Helvetica, sans-serif; font-family: Arial, Helvetica, sans-serif;
} }
h1 {
text-transform: uppercase;
}
.flexbox { .flexbox {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
@@ -155,7 +159,7 @@ a, button, input, select, textarea, label, main{
color: #1f2937; color: #1f2937;
} }
.login-button { .button {
width: 100%; width: 100%;
padding: 12px; padding: 12px;
background-color: #2563eb; background-color: #2563eb;
@@ -168,7 +172,7 @@ a, button, input, select, textarea, label, main{
transition: background-color 0.2s, transform 0.2s, box-shadow 0.2s; transition: background-color 0.2s, transform 0.2s, box-shadow 0.2s;
} }
.login-button:hover { .button:hover {
background-color: #1d4ed8; background-color: #1d4ed8;
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0 4px 10px rgba(0,0,0,0.15); box-shadow: 0 4px 10px rgba(0,0,0,0.15);
-55
View File
@@ -1,55 +0,0 @@
<!--
Artikel: Datenschutz vs Datensicherheit
Funktion: Inhalt zum Fach Informatik
-->
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="description" content="EduForge">
<meta name="author" content="Niklas Ortmann">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/x-icon" href="images/logos/logo_icon.ico">
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/navbar.css">
<link rel="stylesheet" href="css/footer.css">
<title>EduForge</title>
</head>
<body>
<?php
include_once 'includes/navbar.php';
?>
<main>
<h1>Datenschutz vs Datensicherheit</h1>
<p>
Datenschutz ist in unserer digital vernetzten Welt allgegenwärtig ob in sozialen Netzwerken, beim
Online-Shopping oder dem Einsatz von Bonuskarten, bei der Auswertung von Konsumverhalten und selbstverständlich
auch im schulischen Kontext.
</p>
<h2>
Was ist Datenschutz?
</h2>
<p>
Datenschutz bedeutet, dass persönliche Daten nur gesammelt, gespeichert und verwendet werden dürfen, wenn
es wirklich nötig ist und nur für klar festgelegte Zwecke. Es geht darum, die Privatsphäre von Menschen
zu schützen.
</p>
<h2>
Was ist Datenschutz?
</h2>
<p>
Datensicherheit umfasst alle technischen und organisatorischen Maßnahmen, die verhindern sollen, dass Daten
verloren gehen, beschädigt oder unbemerkt verändert werden. Sie schützt Informationen vor Missbrauch.
</p>
</main>
<?php
include_once 'includes/footer.php';
?>
</body>
</html>
+52 -52
View File
@@ -39,50 +39,50 @@ Globales Menü, wird via PHP später in alle Seiten eingebunden
<li> <li>
<label class="nav__mobile-label">Sprachen</label> <label class="nav__mobile-label">Sprachen</label>
<ul class="nav__mobile-submenu"> <ul class="nav__mobile-submenu">
<li><a href="index.php?pfad=deutsch">Deutsch</a></li> <li><a href="index.php?pfad=showCategory&category=deutsch">Deutsch</a></li>
<li><a href="index.php?pfad=englisch">Englisch</a></li> <li><a href="index.php?pfad=showCategory&category=englisch">Englisch</a></li>
<li><a href="index.php?pfad=franzoesisch">Französisch</a></li> <li><a href="index.php?pfad=showCategory&category=franzoesisch">Französisch</a></li>
<li><a href="index.php?pfad=latein">Latein</a></li> <li><a href="index.php?pfad=showCategory&category=latein">Latein</a></li>
<li><a href="index.php?pfad=literatur">Literatur</a></li> <li><a href="index.php?pfad=showCategory&category=literatur">Literatur</a></li>
</ul> </ul>
</li> </li>
<li> <li>
<label class="nav__mobile-label">MINT</label> <label class="nav__mobile-label">MINT</label>
<ul class="nav__mobile-submenu"> <ul class="nav__mobile-submenu">
<li><a href="index.php?pfad=mathe">Mathematik</a></li> <li><a href="index.php?pfad=showCategory&category=mathe">Mathematik</a></li>
<li><a href="index.php?pfad=biologie">Biologie</a></li> <li><a href="index.php?pfad=showCategory&category=biologie">Biologie</a></li>
<li><a href="index.php?pfad=chemie">Chemie</a></li> <li><a href="index.php?pfad=showCategory&category=chemie">Chemie</a></li>
<li><a href="index.php?pfad=physik">Physik</a></li> <li><a href="index.php?pfad=showCategory&category=physik">Physik</a></li>
<li><a href="index.php?pfad=informatik">Informatik</a></li> <li><a href="index.php?pfad=showCategory&category=informatik">Informatik</a></li>
<li><a href="index.php?pfad=astronomie">Astronomie</a></li> <li><a href="index.php?pfad=showCategory&category=astronomie">Astronomie</a></li>
</ul> </ul>
</li> </li>
<li> <li>
<label class="nav__mobile-label">Gesellschaft & Werte</label> <label class="nav__mobile-label">Gesellschaft & Werte</label>
<ul class="nav__mobile-submenu"> <ul class="nav__mobile-submenu">
<li><a href="index.php?pfad=geschichte">Geschichte</a></li> <li><a href="index.php?pfad=showCategory&category=geschichte">Geschichte</a></li>
<li><a href="index.php?pfad=erdkunde">Erdkunde</a></li> <li><a href="index.php?pfad=showCategory&category=erdkunde">Erdkunde</a></li>
<li><a href="index.php?pfad=sozialkunde">Sozialkunde</a></li> <li><a href="index.php?pfad=showCategory&category=sozialkunde">Sozialkunde</a></li>
<li><a href="index.php?pfad=wirtschaft">Wirtschaftskunde</a></li> <li><a href="index.php?pfad=showCategory&category=wirtschaft">Wirtschaftskunde</a></li>
<li><a href="index.php?pfad=religion">Religion</a></li> <li><a href="index.php?pfad=showCategory&category=religion">Religion</a></li>
<li><a href="index.php?pfad=ethik">Ethikunterricht</a></li> <li><a href="index.php?pfad=showCategory&category=ethik">Ethikunterricht</a></li>
<li><a href="index.php?pfad=philosophie">Philosophie</a></li> <li><a href="index.php?pfad=showCategory&category=philosophie">Philosophie</a></li>
<li><a href="index.php?pfad=psychologie">Psychologie</a></li> <li><a href="index.php?pfad=showCategory&category=psychologie">Psychologie</a></li>
<li><a href="index.php?pfad=kunst">Kunst</a></li> <li><a href="index.php?pfad=showCategory&category=kunst">Kunst</a></li>
<li><a href="index.php?pfad=musik">Musik</a></li> <li><a href="index.php?pfad=showCategory&category=musik">Musik</a></li>
<li><a href="index.php?pfad=theater">Theater</a></li> <li><a href="index.php?pfad=showCategory&category=theater">Theater</a></li>
</ul> </ul>
</li> </li>
<li> <li>
<label class="nav__mobile-label">Technik & Praxis</label> <label class="nav__mobile-label">Technik & Praxis</label>
<ul class="nav__mobile-submenu"> <ul class="nav__mobile-submenu">
<li><a href="index.php?pfad=technik">Technik</a></li> <li><a href="index.php?pfad=showCategory&category=technik">Technik</a></li>
<li><a href="index.php?pfad=werken">Werken</a></li> <li><a href="index.php?pfad=showCategory&category=werken">Werken</a></li>
<li><a href="index.php?pfad=hauswirtschaft">Hauswirtschaft</a></li> <li><a href="index.php?pfad=showCategory&category=hauswirtschaft">Hauswirtschaft</a></li>
<li><a href="index.php?pfad=sport">Sport</a></li> <li><a href="index.php?pfad=showCategory&category=sport">Sport</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
@@ -92,50 +92,50 @@ Globales Menü, wird via PHP später in alle Seiten eingebunden
<div class="nav__item nav__dropdown"> <div class="nav__item nav__dropdown">
<button class="nav__dropdown-toggle">Sprachen</button> <button class="nav__dropdown-toggle">Sprachen</button>
<div class="nav__dropdown-menu"> <div class="nav__dropdown-menu">
<a href="index.php?pfad=deutsch">Deutsch</a> <a href="index.php?pfad=showCategory&category=deutsch">Deutsch</a>
<a href="index.php?pfad=englisch">Englisch</a> <a href="index.php?pfad=showCategory&category=englisch">Englisch</a>
<a href="index.php?pfad=franzoesisch">Französisch</a> <a href="index.php?pfad=showCategory&category=franzoesisch">Französisch</a>
<a href="index.php?pfad=latein">Latein</a> <a href="index.php?pfad=showCategory&category=latein">Latein</a>
<a href="index.php?pfad=literatur">Literatur</a> <a href="index.php?pfad=showCategory&category=literatur">Literatur</a>
</div> </div>
</div> </div>
<div class="nav__item nav__dropdown"> <div class="nav__item nav__dropdown">
<button class="nav__dropdown-toggle">MINT</button> <button class="nav__dropdown-toggle">MINT</button>
<div class="nav__dropdown-menu"> <div class="nav__dropdown-menu">
<a href="index.php?pfad=mathe">Mathematik</a> <a href="index.php?pfad=showCategory&category=mathe">Mathematik</a>
<a href="index.php?pfad=biologie">Biologie</a> <a href="index.php?pfad=showCategory&category=biologie">Biologie</a>
<a href="index.php?pfad=chemie">Chemie</a> <a href="index.php?pfad=showCategory&category=chemie">Chemie</a>
<a href="index.php?pfad=physik">Physik</a> <a href="index.php?pfad=showCategory&category=physik">Physik</a>
<a href="index.php?pfad=informatik">Informatik</a> <a href="index.php?pfad=showCategory&category=informatik">Informatik</a>
<a href="index.php?pfad=astronomie">Astronomie</a> <a href="index.php?pfad=showCategory&category=astronomie">Astronomie</a>
</div> </div>
</div> </div>
<div class="nav__item nav__dropdown"> <div class="nav__item nav__dropdown">
<button class="nav__dropdown-toggle">Gesellschaft & Werte</button> <button class="nav__dropdown-toggle">Gesellschaft & Werte</button>
<div class="nav__dropdown-menu"> <div class="nav__dropdown-menu">
<a href="index.php?pfad=geschichte">Geschichte</a> <a href="index.php?pfad=showCategory&category=geschichte">Geschichte</a>
<a href="index.php?pfad=erdkunde">Erdkunde</a> <a href="index.php?pfad=showCategory&category=erdkunde">Erdkunde</a>
<a href="index.php?pfad=sozialkunde">Sozialkunde</a> <a href="index.php?pfad=showCategory&category=sozialkunde">Sozialkunde</a>
<a href="index.php?pfad=wirtschaft">Wirtschaftskunde</a> <a href="index.php?pfad=showCategory&category=wirtschaft">Wirtschaftskunde</a>
<a href="index.php?pfad=religion">Religion</a> <a href="index.php?pfad=showCategory&category=religion">Religion</a>
<a href="index.php?pfad=ethik">Ethikunterricht</a> <a href="index.php?pfad=showCategory&category=ethik">Ethikunterricht</a>
<a href="index.php?pfad=philosophie">Philosophie</a> <a href="index.php?pfad=showCategory&category=philosophie">Philosophie</a>
<a href="index.php?pfad=psychologie">Psychologie</a> <a href="index.php?pfad=showCategory&category=psychologie">Psychologie</a>
<a href="index.php?pfad=kunst">Kunst</a> <a href="index.php?pfad=showCategory&category=kunst">Kunst</a>
<a href="index.php?pfad=musik">Musik</a> <a href="index.php?pfad=showCategory&category=musik">Musik</a>
<a href="index.php?pfad=theater">Theater</a> <a href="index.php?pfad=showCategory&category=theater">Theater</a>
</div> </div>
</div> </div>
<div class="nav__item nav__dropdown"> <div class="nav__item nav__dropdown">
<button class="nav__dropdown-toggle">Technik & Praxis</button> <button class="nav__dropdown-toggle">Technik & Praxis</button>
<div class="nav__dropdown-menu"> <div class="nav__dropdown-menu">
<a href="index.php?pfad=technik">Technik</a> <a href="index.php?pfad=showCategory&category=technik">Technik</a>
<a href="index.php?pfad=werken">Werken</a> <a href="index.php?pfad=showCategory&category=werken">Werken</a>
<a href="index.php?pfad=hauswirtschaft">Hauswirtschaft</a> <a href="index.php?pfad=showCategory&category=hauswirtschaft">Hauswirtschaft</a>
<a href="index.php?pfad=sport">Sport</a> <a href="index.php?pfad=showCategory&category=sport">Sport</a>
</div> </div>
</div> </div>
</div> </div>
+3 -9
View File
@@ -1,4 +1,3 @@
<?php <?php
session_start(); session_start();
ob_start(); ob_start();
@@ -52,8 +51,8 @@ if ($pfad === "deleteAccount") {
<title>EduForge</title> <title>EduForge</title>
</head> </head>
<body> <body>
<?php <?php
include_once 'includes/navbar.php'; include_once 'includes/navbar.php';
@@ -61,20 +60,15 @@ if ($pfad === "deleteAccount") {
Dynamischer Inhalt: Dynamischer Inhalt:
Je nach pfad-Parameter wird die passende Datei aus content geladen. Je nach pfad-Parameter wird die passende Datei aus content geladen.
*/ */
if (isset($_GET["pfad"])) { if (file_exists('content/' . $pfad . '.php')) {
if (file_exists('content/' . $_GET["pfad"] . '.php')) { include_once 'content/' . $pfad . '.php';
include_once 'content/' . $_GET["pfad"] . '.php';
} else { } else {
include_once 'content/404.php'; include_once 'content/404.php';
} }
} else {
include_once 'content/home.php';
}
include_once 'includes/footer.php'; include_once 'includes/footer.php';
?> ?>
</body> </body>
</html> </html>
-4
View File
@@ -1,4 +0,0 @@
<?php
// mit $_SERVER['DOCUMENT_ROOT'] später umbauen?
$abs_path = __DIR__;
?>
+6 -1
View File
@@ -18,7 +18,12 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") {
if ($user && password_verify($password, $user["password"])) { if ($user && password_verify($password, $user["password"])) {
$_SESSION["user"] = $user["username"]; if (isset($user["vorname"]) && isset($user["nachname"])) {
$_SESSION["user"] = $user["vorname"] . " " . $user["nachname"];
} else {
$_SESSION["user"] = $user["username"] ?? "";
}
$_SESSION["user_email"] = $user["email"]; $_SESSION["user_email"] = $user["email"];
header("Location: index.php"); header("Location: index.php");
+71 -11
View File
@@ -1,8 +1,11 @@
<?php <?php
require_once "php/model/LocalUserDAO.php"; require_once "php/model/LocalUserDAO.php";
require_once 'php/model/Article.php'; require_once "php/model/Article.php";
require_once 'php/model/ArticleManager.php'; require_once "php/model/ArticleManager.php";
require_once "php/validator/user-validator.php";
$error = null;
if (!isset($_SESSION["user"])) { if (!isset($_SESSION["user"])) {
header("Location: index.php?pfad=login"); header("Location: index.php?pfad=login");
@@ -11,16 +14,8 @@ if (!isset($_SESSION["user"])) {
try { try {
$dao = new LocalUserDAO(); $dao = new LocalUserDAO();
$user = $dao->findUser($_SESSION["user_email"] ?? ""); $user = $dao->findUser($_SESSION["user_email"] ?? "");
$articleManager = ArticleManager::getInstance();
$userArticles = $articleManager->getArticlesByAuthor($_SESSION["user_email"]);
if(!isset($userArticles)) {
$_SESSION["message"] = "user_has_no_articles";
}
} catch (Exception $e) {
$_SESSION["message"] = "internal_error";
exit();
}
if (!$user) { if (!$user) {
$_SESSION = []; $_SESSION = [];
@@ -29,3 +24,68 @@ if (!$user) {
header("Location: index.php?pfad=login"); header("Location: index.php?pfad=login");
exit(); exit();
} }
if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST["saveProfile"])) {
$oldEmail = $_SESSION["user_email"];
$newEmail = trim($_POST["email"] ?? "");
$vorname = trim($_POST["vorname"] ?? "");
$nachname = trim($_POST["nachname"] ?? "");
$password = $_POST["password"] ?? "";
if (!userEmailValidator($newEmail)) {
$error = "Bitte gib eine gültige E-Mail-Adresse ein.";
$_GET["edit"] = "1";
} elseif (!userNameValidator($vorname)) {
$error = "Der Vorname muss 2 bis 50 Zeichen lang sein und darf nur Buchstaben, Leerzeichen und Bindestriche enthalten.";
$_GET["edit"] = "1";
} elseif (!userNameValidator($nachname)) {
$error = "Der Nachname muss 2 bis 50 Zeichen lang sein und darf nur Buchstaben, Leerzeichen und Bindestriche enthalten.";
$_GET["edit"] = "1";
} elseif (!userOptionalPasswordValidator($password)) {
$error = "Das Passwort muss 8 bis 72 Zeichen lang sein.";
$_GET["edit"] = "1";
} else {
$updated = $dao->updateUser(
$oldEmail,
$newEmail,
$vorname,
$nachname,
$password
);
if ($updated) {
$_SESSION["user"] = $vorname . " " . $nachname;
$_SESSION["user_email"] = $newEmail;
header("Location: index.php?pfad=profile");
exit();
} else {
$error = "Die Daten konnten nicht gespeichert werden.";
$_GET["edit"] = "1";
}
}
}
$user = $dao->findUser($_SESSION["user_email"] ?? "");
$articleManager = ArticleManager::getInstance();
$userArticles = $articleManager->getArticlesByAuthor($_SESSION["user_email"]);
if (!isset($userArticles)) {
$_SESSION["message"] = "user_has_no_articles";
}
} catch (InvalidArgumentException $e) {
$error = $e->getMessage();
$_GET["edit"] = "1";
} catch (Exception $e) {
$error = "Es ist ein interner Fehler aufgetreten. Bitte versuche es erneut.";
$_SESSION["message"] = "internal_error";
$_GET["edit"] = "1";
}
+24 -21
View File
@@ -1,40 +1,43 @@
<?php <?php
require_once "php/model/LocalUserDAO.php"; require_once "php/model/LocalUserDAO.php";
require_once "php/validator/user-validator.php";
$dao = new LocalUserDAO();
$error = null; $error = null;
/*
Verarbeitung des Registrierungs-Formulars
Funktion: Erstellt neuen Benutzer und speichert ihn im DAO + Session
*/
if ($_SERVER["REQUEST_METHOD"] === "POST") { if ($_SERVER["REQUEST_METHOD"] === "POST") {
$email = $_POST["email"] ?? ""; $email = trim($_POST["email"] ?? "");
$vorname = $_POST["vorname"] ?? ""; $vorname = trim($_POST["vorname"] ?? "");
$nachname = $_POST["nachname"] ?? ""; $nachname = trim($_POST["nachname"] ?? "");
$password = password_hash( $plainPassword = $_POST["password"] ?? "";
$_POST["password"] ?? "",
PASSWORD_DEFAULT
);
if ($dao->findUser($email)) {
$error = "Diese E-Mail-Adresse ist bereits registriert.";
if (!userEmailValidator($email)) {
$error = "Bitte gib eine gültige E-Mail-Adresse ein.";
} elseif (!userNameValidator($vorname)) {
$error = "Der Vorname muss 2 bis 50 Zeichen lang sein und darf nur Buchstaben, Umlaute, Leerzeichen und Bindestriche enthalten.";
} elseif (!userNameValidator($nachname)) {
$error = "Der Nachname muss 2 bis 50 Zeichen lang sein und darf nur Buchstaben, Umlaute, Leerzeichen und Bindestriche enthalten.";
} elseif (!userPasswordValidator($plainPassword)) {
$error = "Das Passwort muss 8 bis 72 Zeichen lang sein.";
} else { } else {
try {
$dao = new LocalUserDAO();
$dao->addUser( $password = password_hash($plainPassword, PASSWORD_DEFAULT);
$email,
$vorname . " " . $nachname, $dao->addUser($email, $vorname, $nachname, $password);
$password
);
$_SESSION["user"] = $vorname . " " . $nachname; $_SESSION["user"] = $vorname . " " . $nachname;
$_SESSION["user_email"] = $email; $_SESSION["user_email"] = $email;
header("Location: index.php"); header("Location: index.php");
exit(); exit();
} catch (InvalidArgumentException $e) {
$error = $e->getMessage();
} catch (Exception $e) {
$error = "Die Registrierung konnte nicht gespeichert werden.";
}
} }
} }
@@ -0,0 +1,21 @@
<?php
require_once 'php/model/Article.php';
require_once 'php/model/ArticleManager.php';
require_once 'php/validator/article-validator.php';
if (isset($_GET["category"]) && !empty($_GET["category"]) && articleCategoryValidator($_GET["category"])){
$category = $_GET["category"];
try {
$articleManager = ArticleManager::getInstance();
$articles = $articleManager->getArticlesByCategory($category);
} catch (Exception $e) {
$_SESSION["message"] = "internal_error";
include_once "content/404.php";
exit();
}
}else{
$_SESSION["message"] = "invalid_category";
include_once "content/404.php";
exit();
}
?>
+4 -4
View File
@@ -1,5 +1,5 @@
<?php <?php
session_start(); SESSION_START();
require_once '../model/LocalArticleManager.php'; require_once '../model/LocalArticleManager.php';
require_once '../model/ArticleManager.php'; require_once '../model/ArticleManager.php';
require_once '../model/Article.php'; require_once '../model/Article.php';
@@ -8,7 +8,7 @@ require_once '../validator/article-validator.php';
if ($_SERVER["REQUEST_METHOD"] === "POST") { if ($_SERVER["REQUEST_METHOD"] === "POST") {
$_SESSION["old_title"] = $_POST["title"] ?? ''; $_SESSION["old_title"] = $_POST["title"] ?? '';
$_SESSION["old_content"] = $_POST["content"] ?? ''; $_SESSION["old_content"] = $_POST["content"] ?? '';
$_SESSION["old_category"] = $_POST["category"] ?? ''; $_SESSION["old_category"] = $_POST["category"] ?? ''; // TODO: die Kategorie im Dropdown setzen, wenn der Editor erneut geöffnet wird.
$_SESSION["old_tags"] = $_POST["tags"] ?? ''; $_SESSION["old_tags"] = $_POST["tags"] ?? '';
if (isset($_GET["id"]) && !empty($_GET["id"])) { if (isset($_GET["id"]) && !empty($_GET["id"])) {
@@ -26,7 +26,7 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") {
}else{ }else{
$title = $_POST["title"]; $title = $_POST["title"];
$content = $_POST["content"]; $content = $_POST["content"];
$author = "max.mustermann"; // TODO: später aus Session den angemeldeten Nutzer beziehen. $author = $_SESSION["user_email"];
$category = $_POST["category"]; $category = $_POST["category"];
$tags = $_POST['tags'] ?? ''; $tags = $_POST['tags'] ?? '';
@@ -82,7 +82,7 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") {
$article->setTags($cleanedTags); $article->setTags($cleanedTags);
$articleManager->updateArticle($id ,$article, $author); $articleManager->updateArticle($id ,$article, $author);
} catch (Exception $e){ } catch (Exception $e){
$_SESSION["message"] = "internal_error"; $_SESSION["message"] = $e->getMessage();
header("location: ../../index.php?pfad=updateArticle"); header("location: ../../index.php?pfad=updateArticle");
exit(); exit();
} }
+3 -3
View File
@@ -19,7 +19,7 @@ class ArticleManager extends LocalArticleManager
"Satz des Pythagoras", "Satz des Pythagoras",
"Der Satz des Pythagoras wurde von dem griechischen Philosophen Pythagoras von Samos formuliert und im dritten Jahrhundert vor Christus veröffentlicht. In der beigefügten Abbildung sehen wir ein rechtwinkliges Dreieck...", "Der Satz des Pythagoras wurde von dem griechischen Philosophen Pythagoras von Samos formuliert und im dritten Jahrhundert vor Christus veröffentlicht. In der beigefügten Abbildung sehen wir ein rechtwinkliges Dreieck...",
"max.mustermann", "max.mustermann",
"Mathe", "mathe",
"Dreiecke, Dreiecksseiten berechnen" "Dreiecke, Dreiecksseiten berechnen"
); );
} }
@@ -28,7 +28,7 @@ class ArticleManager extends LocalArticleManager
"Tunneleffekt", "Tunneleffekt",
"Der Tunneleffekt ist ein quantenmechanisches Phänomen, bei dem Teilchen...", "Der Tunneleffekt ist ein quantenmechanisches Phänomen, bei dem Teilchen...",
"max.mustermann", "max.mustermann",
"Physik", "physik",
"Quantenphysik, Energie" "Quantenphysik, Energie"
); );
} }
@@ -37,7 +37,7 @@ class ArticleManager extends LocalArticleManager
"Datenschutz vs Datensicherheit", "Datenschutz vs Datensicherheit",
"Datenschutz ist in unserer digital vernetzten Welt allgegenwärtig...", "Datenschutz ist in unserer digital vernetzten Welt allgegenwärtig...",
"max.mustermann", "max.mustermann",
"Informatik", "informatik",
"Daten, DSGVO" "Daten, DSGVO"
); );
} }
+21 -5
View File
@@ -1,5 +1,10 @@
<?php <?php
require_once "Article.php"; require_once "Article.php";
class NotFoundException extends Exception {}
class UnauthorizedAccessException extends Exception {}
class InternalServerErrorException extends Exception {}
/** /**
* Die Klasse beinhaltet alle Methoden für die Operation mit den Artikel-Daten. * Die Klasse beinhaltet alle Methoden für die Operation mit den Artikel-Daten.
* *
@@ -16,7 +21,7 @@ interface ArticleManagerDAO
* @param $tags string optionale Schlagworte für eine bessere Suche * @param $tags string optionale Schlagworte für eine bessere Suche
* *
* Mögliche Exceptions: * Mögliche Exceptions:
* TODO Fehlerbeschreibung hinzufügen & tags hinzufügen * TODO: Exceptions implementieren.
*/ */
public function addArticle($title, $content, $author, $category, $tags); public function addArticle($title, $content, $author, $category, $tags);
@@ -29,7 +34,10 @@ interface ArticleManagerDAO
* @param $author * @param $author
* @return void * @return void
* *
* TODO: Fehlerbeschreibung hinzufügen * @throws InternalServerErrorException
* @throws NotFoundException
* @throws UnauthorizedAccessException
* /
*/ */
public function updateArticle($id, $article, $author); public function updateArticle($id, $article, $author);
@@ -38,7 +46,7 @@ interface ArticleManagerDAO
* @param $id * @param $id
* @return void * @return void
* *
* TODO: Fehlerbeschreibung hinzufügen * TODO: Exceptions implementieren.
*/ */
public function deleteArticle($id); public function deleteArticle($id);
@@ -48,7 +56,7 @@ interface ArticleManagerDAO
* *
* @return Article * @return Article
* Mögliche Exceptions: * Mögliche Exceptions:
* TODO Fehlerbeschreibung hinzufügen * TODO: Exceptions implementieren.
*/ */
public function getArticle($id); public function getArticle($id);
@@ -56,7 +64,7 @@ interface ArticleManagerDAO
* Alle Beiträge aufrufen. * Alle Beiträge aufrufen.
* *
* Mögliche Exceptions: * Mögliche Exceptions:
* TODO Fehlerbeschreibung hinzufügen * TODO: Exceptions implementieren.
*/ */
public function getAllArticles(); public function getAllArticles();
@@ -64,6 +72,7 @@ interface ArticleManagerDAO
* Gibt alle Beiträge eines Nutzer mit einer gegebenen ID aus. * Gibt alle Beiträge eines Nutzer mit einer gegebenen ID aus.
* @param $author * @param $author
* @return Article[] * @return Article[]
* TODO: Exceptions implementieren.
*/ */
public function getArticlesByAuthor($author); public function getArticlesByAuthor($author);
@@ -76,6 +85,13 @@ interface ArticleManagerDAO
*/ */
public function search(string $keyword): array; public function search(string $keyword): array;
/**
* Gibt alle Beiträge einer gegebenen Kategorie aus.
* @param $category
* @return mixed
*/
public function getArticlesByCategory($category);
} }
?> ?>
+26 -7
View File
@@ -36,6 +36,7 @@ class LocalArticleManager implements ArticleManagerDAO {
* Speichert alle Artikel/Beiträge in der Datei. * Speichert alle Artikel/Beiträge in der Datei.
* @param $articles * @param $articles
* @return void * @return void
* TODO: Exceptions implementieren.
*/ */
public function saveArticle($articles) public function saveArticle($articles)
{ {
@@ -65,14 +66,12 @@ class LocalArticleManager implements ArticleManagerDAO {
public function updateArticle($id, $article, $author) public function updateArticle($id, $article, $author)
{ {
if (empty($article)) { if (empty($article)) {
// TODO: Implement Exception. throw new InternalServerErrorException("internal_error");
return;
} }
// Berechtigungsprüfung: // Berechtigungsprüfung:
if ($article->getAuthor() !== $author) { if ($article->getAuthor() !== $author) {
// TODO: Implement Exception. throw new UnauthorizedAccessException("unauthorized_access");
return;
} }
// Beitrag aktualisieren: // Beitrag aktualisieren:
@@ -92,15 +91,14 @@ class LocalArticleManager implements ArticleManagerDAO {
]; ];
$updated = true; $updated = true;
break; break;
}else{
// TODO: Implement Exception.
return;
} }
} }
// Nur speichern, wenn Beitrag geändert wurde: // Nur speichern, wenn Beitrag geändert wurde:
if ($updated) { if ($updated) {
$this->saveArticle($articles); $this->saveArticle($articles);
} else {
throw new NotFoundException("missing_id");
} }
} }
@@ -203,5 +201,26 @@ class LocalArticleManager implements ArticleManagerDAO {
return $filteredArticles; return $filteredArticles;
} }
public function getArticlesByCategory($category)
{
$articles = $this->getAllArticles();
$filteredArticles = [];
foreach ($articles as $article) {
if (isset($article['category']) && $article['category'] == $category) {
$filteredArticles[] = new Article(
intval($article['id']),
$article['title'],
$article['content'],
$article['author'],
$article['category'],
$article['tags'],
$article['creationDate']
);
}
}
return $filteredArticles;
}
} }
?> ?>
+123 -8
View File
@@ -1,33 +1,78 @@
<?php <?php
require_once "UserDAOInterface.php"; require_once "UserDAOInterface.php";
class LocalUserDAO implements UserDAOInterface { class LocalUserDAO implements UserDAOInterface {
private string $file = "data/users.json"; private string $file = "data/users.json";
/**
* Lädt alle Benutzer aus der JSON-Datei.
*
* @return array Liste aller Benutzer
* @throws RuntimeException wenn die Datei nicht gelesen werden kann
* oder fehlerhafte JSON-Daten enthält
*/
private function loadUsers() { private function loadUsers() {
if (!file_exists($this->file)) { if (!file_exists($this->file)) {
return []; return [];
} }
$json = file_get_contents($this->file); $json = file_get_contents($this->file);
if ($json === false) {
throw new RuntimeException("Benutzerdaten konnten nicht gelesen werden.");
}
$users = json_decode($json, true); $users = json_decode($json, true);
if ($users === null && json_last_error() !== JSON_ERROR_NONE) {
throw new RuntimeException("Benutzerdaten sind fehlerhaft.");
}
return is_array($users) ? $users : []; return is_array($users) ? $users : [];
} }
/**
* Speichert alle Benutzer in die JSON-Datei.
*
* @param array $users Liste aller Benutzer
* @return void
* @throws RuntimeException wenn die Daten nicht gespeichert werden können
*/
private function saveUsers($users) { private function saveUsers($users) {
file_put_contents( $json = json_encode($users, JSON_PRETTY_PRINT);
$this->file,
json_encode($users, JSON_PRETTY_PRINT) if ($json === false) {
); throw new RuntimeException("Benutzerdaten konnten nicht umgewandelt werden.");
} }
$result = file_put_contents($this->file, $json);
if ($result === false) {
throw new RuntimeException("Benutzerdaten konnten nicht gespeichert werden.");
}
}
/**
* Sucht einen Benutzer anhand seiner E-Mail-Adresse.
*
* @param string $email E-Mail-Adresse des gesuchten Benutzers
* @return array|null Benutzerdaten oder null, wenn kein Benutzer gefunden wurde
* @throws RuntimeException wenn die Benutzerdaten nicht gelesen werden können
*/
public function findUser($email) { public function findUser($email) {
$users = $this->loadUsers(); $users = $this->loadUsers();
foreach ($users as $user) { foreach ($users as $user) {
if ($user["email"] === $email) { if (isset($user["email"]) && $user["email"] === $email) {
if (!isset($user["vorname"]) && isset($user["username"])) {
$nameParts = explode(" ", $user["username"], 2);
$user["vorname"] = $nameParts[0] ?? "";
$user["nachname"] = $nameParts[1] ?? "";
}
return $user; return $user;
} }
} }
@@ -35,23 +80,93 @@ class LocalUserDAO implements UserDAOInterface {
return null; return null;
} }
public function addUser($email, $username, $password) { /**
* Fügt einen neuen Benutzer hinzu.
*
* @param string $email E-Mail-Adresse
* @param string $vorname Vorname
* @param string $nachname Nachname
* @param string $password Passwort-Hash
* @return void
* @throws InvalidArgumentException wenn die E-Mail-Adresse bereits verwendet wird
* @throws RuntimeException wenn die Benutzerdaten nicht gelesen oder gespeichert werden können
*/
public function addUser($email, $vorname, $nachname, $password) {
$users = $this->loadUsers(); $users = $this->loadUsers();
foreach ($users as $user) {
if (isset($user["email"]) && $user["email"] === $email) {
throw new InvalidArgumentException("Diese E-Mail-Adresse wird bereits verwendet.");
}
}
$users[] = [ $users[] = [
"email" => $email, "email" => $email,
"username" => $username, "vorname" => $vorname,
"nachname" => $nachname,
"password" => $password "password" => $password
]; ];
$this->saveUsers($users); $this->saveUsers($users);
} }
/**
* Aktualisiert einen bestehenden Benutzer.
*
* @param string $oldEmail Alte E-Mail-Adresse
* @param string $newEmail Neue E-Mail-Adresse
* @param string $vorname Neuer Vorname
* @param string $nachname Neuer Nachname
* @param string|null $password Neues Passwort oder null
* @return bool true, wenn der Benutzer aktualisiert wurde, sonst false
* @throws InvalidArgumentException wenn die neue E-Mail-Adresse bereits verwendet wird
* @throws RuntimeException wenn die Benutzerdaten nicht gelesen oder gespeichert werden können
*/
public function updateUser($oldEmail, $newEmail, $vorname, $nachname, $password = null) {
$users = $this->loadUsers();
foreach ($users as $user) {
if (
isset($user["email"])
&& $user["email"] === $newEmail
&& $newEmail !== $oldEmail
) {
throw new InvalidArgumentException("Diese E-Mail-Adresse wird bereits verwendet.");
}
}
foreach ($users as $i => $user) {
if (isset($user["email"]) && $user["email"] === $oldEmail) {
$users[$i]["email"] = $newEmail;
$users[$i]["vorname"] = $vorname;
$users[$i]["nachname"] = $nachname;
unset($users[$i]["username"]);
if (!empty($password)) {
$users[$i]["password"] = password_hash($password, PASSWORD_DEFAULT);
}
$this->saveUsers($users);
return true;
}
}
return false;
}
/**
* Löscht einen Benutzer anhand seiner E-Mail-Adresse.
*
* @param string $email E-Mail-Adresse des zu löschenden Benutzers
* @return bool true, wenn der Benutzer gelöscht wurde, sonst false
* @throws RuntimeException wenn die Benutzerdaten nicht gelesen oder gespeichert werden können
*/
public function deleteUser($email) { public function deleteUser($email) {
$users = $this->loadUsers(); $users = $this->loadUsers();
foreach ($users as $i => $user) { foreach ($users as $i => $user) {
if ($user["email"] === $email) { if (isset($user["email"]) && $user["email"] === $email) {
unset($users[$i]); unset($users[$i]);
$users = array_values($users); $users = array_values($users);
$this->saveUsers($users); $this->saveUsers($users);
+55 -2
View File
@@ -11,26 +11,79 @@ interface UserDAOInterface {
/** /**
* Sucht einen Benutzer anhand seiner E-Mail-Adresse. * Sucht einen Benutzer anhand seiner E-Mail-Adresse.
* *
* Funktion:
* Liefert die gespeicherten Benutzerdaten zu einer E-Mail-Adresse.
*
* Eingabe:
* @param string $email E-Mail-Adresse des gesuchten Benutzers * @param string $email E-Mail-Adresse des gesuchten Benutzers
*
* Ausgabe:
* @return array|null Benutzerdaten als Array oder null * @return array|null Benutzerdaten als Array oder null
*
* Mögliche Fehler:
* @throws RuntimeException wenn die Benutzerdaten nicht gelesen werden können
*/ */
public function findUser($email); public function findUser($email);
/** /**
* Fügt einen neuen Benutzer hinzu. * Fügt einen neuen Benutzer hinzu.
* *
* Funktion:
* Erstellt einen neuen Benutzereintrag und speichert ihn
* in der jeweiligen Datenquelle.
*
* Eingabe:
* @param string $email E-Mail-Adresse des Benutzers * @param string $email E-Mail-Adresse des Benutzers
* @param string $username Benutzername des Benutzers * @param string $vorname Vorname des Benutzers
* @param string $nachname Nachname des Benutzers
* @param string $password Passwort des Benutzers * @param string $password Passwort des Benutzers
*
* Ausgabe:
* @return void * @return void
*
* Mögliche Fehler:
* @throws InvalidArgumentException wenn die E-Mail-Adresse bereits verwendet wird
* @throws RuntimeException wenn die Benutzerdaten nicht gelesen oder gespeichert werden können
*/ */
public function addUser($email, $username, $password); public function addUser($email, $vorname, $nachname, $password);
/**
* Aktualisiert einen bestehenden Benutzer.
*
* Funktion:
* Ändert die E-Mail-Adresse, den Vornamen, den Nachnamen
* und optional das Passwort eines bestehenden Benutzers.
*
* Eingabe:
* @param string $oldEmail Alte E-Mail-Adresse
* @param string $newEmail Neue E-Mail-Adresse
* @param string $vorname Neuer Vorname
* @param string $nachname Neuer Nachname
* @param string|null $password Neues Passwort oder null
*
* Ausgabe:
* @return bool true, wenn der Benutzer aktualisiert wurde, sonst false
*
* Mögliche Fehler:
* @throws InvalidArgumentException wenn die neue E-Mail-Adresse bereits verwendet wird
* @throws RuntimeException wenn die Benutzerdaten nicht gelesen oder gespeichert werden können
*/
public function updateUser($oldEmail, $newEmail, $vorname, $nachname, $password = null);
/** /**
* Löscht einen Benutzer anhand seiner E-Mail-Adresse. * Löscht einen Benutzer anhand seiner E-Mail-Adresse.
* *
* Funktion:
* Entfernt einen vorhandenen Benutzer aus der Datenquelle.
*
* Eingabe:
* @param string $email E-Mail-Adresse des zu löschenden Benutzers * @param string $email E-Mail-Adresse des zu löschenden Benutzers
*
* Ausgabe:
* @return bool true, wenn der Benutzer gelöscht wurde, sonst false * @return bool true, wenn der Benutzer gelöscht wurde, sonst false
*
* Mögliche Fehler:
* @throws RuntimeException wenn die Benutzerdaten nicht gelesen oder gespeichert werden können
*/ */
public function deleteUser($email); public function deleteUser($email);
} }
+33
View File
@@ -0,0 +1,33 @@
<?php
function userNameValidator($name)
{
$name = trim($name);
$namePattern = '/^[a-zA-ZäöüÄÖÜß\s-]{2,50}$/u';
return preg_match($namePattern, $name) === 1;
}
function userEmailValidator($email)
{
$email = trim($email);
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false
&& mb_strlen($email) <= 100;
}
function userPasswordValidator($password)
{
$zeichenAnzahl = mb_strlen($password);
return $zeichenAnzahl >= 8 && $zeichenAnzahl <= 72;
}
function userOptionalPasswordValidator($password)
{
if (!isset($password) || $password === '') {
return true;
}
return userPasswordValidator($password);
}
-52
View File
@@ -1,52 +0,0 @@
<!--
Artikel: Satz des Pythagoras
Funktion: Inhalt zum Fach Mathe
-->
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="description" content="EduForge">
<meta name="author" content="Niklas Ortmann">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/x-icon" href="images/logos/logo_icon.ico">
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/navbar.css">
<link rel="stylesheet" href="css/footer.css">
<title>EduForge</title>
</head>
<body>
<?php
include_once 'includes/navbar.php';
?>
<main>
<h1>Satz des Pythagoras</h1>
<p>
Der Satz des Pythagoras wurde von dem griechischen Philosophen Pythagoras von Samos formuliert und im
dritten Jahrhundert vor Christus veröffentlicht.
</p>
<figure>
<img src="https://cdn8.picryl.com/photo/2016/05/14/pythagoras-e9560b-1024.jpg" alt="Trulli" style="width:10%">
<figcaption><a href="https://cdn8.picryl.com/photo/2016/05/14/pythagoras-e9560b-1024.jpg">Quelle</a></figcaption>
</figure>
<p>
In der beigefügten Abbildung sehen wir ein rechtwinkliges Dreieck, dessen drei Seiten die Längen a, b und c
besitzen. Auf jeder Seite ist ein Quadrat konstruiert. Das Quadrat auf der Seite a hat die Fläche a2, das
Quadrat auf der Seite b hat die Fläche b2 und das Quadrat auf der Seite c hat die Fläche c2. Der Satz des
Pythagoras besagt, dass die Summe der Flächen der beiden kleineren Quadrate gleich der Fläche des größten
Quadrats ist. Das bedeutet, dass a^2+b^2=c^2 (Satz des Pythagoras).
</p>
<a href="docs/Uebungsaufgaben_Pythagoras.pdf">Lernzettel-Download</a>
</main>
<?php
include_once 'includes/footer.php';
?>
</body>
</html>
-46
View File
@@ -1,46 +0,0 @@
<!--
Artikel: Tunneleffekt
Funktion: Inhalt zum Fach Physik
-->
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="description" content="EduForge">
<meta name="author" content="Niklas Ortmann">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/x-icon" href="images/logos/logo_icon.ico">
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/navbar.css">
<link rel="stylesheet" href="css/footer.css">
<title>EduForge</title>
</head>
<body>
<?php
include_once 'includes/navbar.php';
?>
<main>
<h1>Tunneleffekt</h1>
<p>
Der Tunneleffekt ist ein quantenmechanisches Phänomen, bei dem Teilchen vor allem Elektronen eine
Energiebarriere überwinden können, obwohl sie nach den Regeln der klassischen Physik nicht genügend Energie
dafür besitzen. In der klassischen Vorstellung müsste ein Elektron entweder genügend Energie haben, um über
eine Barriere zu „springen“, oder es würde vollständig zurückgeworfen. In der Quantenphysik wird ein Elektron
jedoch nicht als punktförmiges Teilchen beschrieben, sondern als Wellenfunktion, die sich räumlich ausdehnt.
Dadurch besteht eine endliche Wahrscheinlichkeit, dass sich das Elektron auf der anderen Seite einer Barriere
befindet (Griffiths & Schroeter, 2018).
</p>
</main>
<?php
include_once 'includes/footer.php';
?>
</body>
</html>