Compare commits

...

43 Commits

Author SHA1 Message Date
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
26 changed files with 584 additions and 174 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>
+96 -30
View File
@@ -1,79 +1,136 @@
<?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";
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 (isset($error) && $error): ?>
<p style="color:red;">
<?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($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($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($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>
<input type="password" <input type="password"
name="password"
class="login-input" class="login-input"
readonly placeholder="<?php echo $isEditMode ? "Leer lassen, wenn es gleich bleiben soll" : "********"; ?>"
value="********"> <?php echo $isEditMode ? "" : "readonly"; ?>>
<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 +138,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>
+1 -5
View File
@@ -4,10 +4,6 @@ include_once 'php/controller/register-controller.php';
$error = $error ?? null; $error = $error ?? null;
?> ?>
<!--
Form: Registrierung
Funktion: Erstellung neuer Benutzerkonten
-->
<main class="login-page"> <main class="login-page">
<div class="login-container"> <div class="login-container">
@@ -52,7 +48,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);
+1
View File
@@ -1,6 +1,7 @@
<!-- <!--
Artikel: Datenschutz vs Datensicherheit Artikel: Datenschutz vs Datensicherheit
Funktion: Inhalt zum Fach Informatik Funktion: Inhalt zum Fach Informatik
TODO: entfernen, wenn die Kategorie-Anzeige implementiert ist.
--> -->
<!DOCTYPE html> <!DOCTYPE html>
<html lang="de"> <html lang="de">
+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>
-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");
+88 -10
View File
@@ -4,28 +4,106 @@ 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';
$error = null;
if (!isset($_SESSION["user"])) { if (!isset($_SESSION["user"])) {
header("Location: index.php?pfad=login"); header("Location: index.php?pfad=login");
exit(); exit();
} }
/*
* Prüft Vor- und Nachnamen.
* Erlaubt sind Buchstaben, Umlaute, Leerzeichen und Bindestriche.
*/
function isValidName($name): bool {
return preg_match("/^[a-zA-ZäöüÄÖÜß -]{2,50}$/", $name);
}
/*
* Prüft, ob die E-Mail-Adresse ein gültiges Format hat.
*/
function isValidEmailAddress($email): bool {
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false
&& strlen($email) <= 100;
}
/*
* Prüft das neue Passwort.
* Leeres Passwort ist erlaubt, wenn der Nutzer es nicht ändern möchte.
*/
function isValidProfilePassword($password): bool {
if ($password === "") {
return true;
}
return strlen($password) >= 8 && strlen($password) <= 72;
}
try { try {
$dao = new LocalUserDAO(); $dao = new LocalUserDAO();
$user = $dao->findUser($_SESSION["user_email"] ?? ""); $user = $dao->findUser($_SESSION["user_email"] ?? "");
if (!$user) {
$_SESSION = [];
session_destroy();
header("Location: index.php?pfad=login");
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 (!isValidName($vorname)) {
$error = "Der Vorname darf nur Buchstaben, Leerzeichen und Bindestriche enthalten und muss 2 bis 50 Zeichen lang sein.";
} elseif (!isValidName($nachname)) {
$error = "Der Nachname darf nur Buchstaben, Leerzeichen und Bindestriche enthalten und muss 2 bis 50 Zeichen lang sein.";
} elseif (!isValidEmailAddress($newEmail)) {
$error = "Bitte gib eine gültige E-Mail-Adresse ein.";
} elseif (!isValidProfilePassword($password)) {
$error = "Das Passwort muss mindestens 8 Zeichen lang sein.";
} else {
$existingUser = $dao->findUser($newEmail);
if ($existingUser && $newEmail !== $oldEmail) {
$error = "Diese E-Mail-Adresse wird bereits verwendet.";
} 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.";
}
}
}
}
$user = $dao->findUser($_SESSION["user_email"] ?? "");
$articleManager = ArticleManager::getInstance(); $articleManager = ArticleManager::getInstance();
$userArticles = $articleManager->getArticlesByAuthor($_SESSION["user_email"]); $userArticles = $articleManager->getArticlesByAuthor($_SESSION["user_email"]);
if(!isset($userArticles)) {
if (!isset($userArticles)) {
$_SESSION["message"] = "user_has_no_articles"; $_SESSION["message"] = "user_has_no_articles";
} }
} catch (Exception $e) { } catch (Exception $e) {
$_SESSION["message"] = "internal_error"; $_SESSION["message"] = "internal_error";
exit();
}
if (!$user) {
$_SESSION = [];
session_destroy();
header("Location: index.php?pfad=login");
exit();
} }
+2 -5
View File
@@ -5,10 +5,6 @@ require_once "php/model/LocalUserDAO.php";
$dao = new LocalUserDAO(); $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 = $_POST["email"] ?? "";
@@ -27,7 +23,8 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") {
$dao->addUser( $dao->addUser(
$email, $email,
$vorname . " " . $nachname, $vorname,
$nachname,
$password $password
); );
@@ -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;
}
} }
?> ?>
+100 -5
View File
@@ -1,4 +1,5 @@
<?php <?php
require_once "UserDAOInterface.php"; require_once "UserDAOInterface.php";
class LocalUserDAO implements UserDAOInterface { class LocalUserDAO implements UserDAOInterface {
@@ -11,23 +12,65 @@ class LocalUserDAO implements UserDAOInterface {
} }
$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 : [];
} }
private function saveUsers($users) { private function saveUsers($users) {
file_put_contents( $result = file_put_contents(
$this->file, $this->file,
json_encode($users, JSON_PRETTY_PRINT) json_encode($users, JSON_PRETTY_PRINT)
); );
if ($result === false) {
throw new RuntimeException("Benutzerdaten konnten nicht gespeichert werden.");
}
}
private function validateEmail($email) {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException("Ungültige E-Mail-Adresse.");
}
}
private function validateName($name, $fieldName) {
if (!preg_match("/^[a-zA-ZäöüÄÖÜß -]{2,50}$/", $name)) {
throw new InvalidArgumentException(
$fieldName . " darf nur Buchstaben, Leerzeichen und Bindestriche enthalten."
);
}
}
private function validatePassword($password) {
if (empty($password)) {
throw new InvalidArgumentException("Passwort darf nicht leer sein.");
}
} }
public function findUser($email) { public function findUser($email) {
$this->validateEmail($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 +78,75 @@ class LocalUserDAO implements UserDAOInterface {
return null; return null;
} }
public function addUser($email, $username, $password) { public function addUser($email, $vorname, $nachname, $password) {
$this->validateEmail($email);
$this->validateName($vorname, "Vorname");
$this->validateName($nachname, "Nachname");
$this->validatePassword($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);
} }
public function updateUser($oldEmail, $newEmail, $vorname, $nachname, $password = null) {
$this->validateEmail($oldEmail);
$this->validateEmail($newEmail);
$this->validateName($vorname, "Vorname");
$this->validateName($nachname, "Nachname");
$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;
}
public function deleteUser($email) { public function deleteUser($email) {
$this->validateEmail($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);
+61 -2
View File
@@ -11,26 +11,85 @@ 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 InvalidArgumentException wenn die E-Mail-Adresse ungültig ist
* @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 Eingabedaten ungültig sind
* oder die E-Mail-Adresse bereits verwendet wird
* @throws RuntimeException wenn die Benutzerdaten nicht 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 Eingabedaten ungültig sind
* oder 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 InvalidArgumentException wenn die E-Mail-Adresse ungültig ist
* @throws RuntimeException wenn die Benutzerdaten nicht gelesen
* oder gespeichert werden können
*/ */
public function deleteUser($email); public function deleteUser($email);
} }
+1
View File
@@ -1,6 +1,7 @@
<!-- <!--
Artikel: Satz des Pythagoras Artikel: Satz des Pythagoras
Funktion: Inhalt zum Fach Mathe Funktion: Inhalt zum Fach Mathe
TODO: entfernen, wenn die Kategorie-Anzeige implementiert ist.
--> -->
<!DOCTYPE html> <!DOCTYPE html>
<html lang="de"> <html lang="de">
+1
View File
@@ -1,6 +1,7 @@
<!-- <!--
Artikel: Tunneleffekt Artikel: Tunneleffekt
Funktion: Inhalt zum Fach Physik Funktion: Inhalt zum Fach Physik
TODO: entfernen, wenn die Kategorie-Anzeige implementiert ist.
--> -->
<!DOCTYPE html> <!DOCTYPE html>
<html lang="de"> <html lang="de">