Compare commits

..

24 Commits

Author SHA1 Message Date
niklas.ortmann 8e3642c668 Merge branch 'dev' into ImplementedSearch 2026-06-02 14:48:37 +02:00
rirat-0 87d78b749b Finale Aktualisierung 2026-06-02 14:09:06 +02:00
rirat-0 604dbeca93 Aktualisierung 2026-06-02 14:07:33 +02:00
rirat-0 8e9e7d65d0 noch mehr debugging 2026-06-02 13:59:21 +02:00
rirat-0 e2c317e507 mehr debugging 2026-06-02 13:57:30 +02:00
rirat-0 5a7fa35465 test mit absoluten pfaden 2026-06-02 13:55:58 +02:00
rirat-0 2601a1c1ca naechster debugging versuch 2026-06-02 13:54:04 +02:00
rirat-0 0e26679f24 anpassung beider article manager 2026-06-02 13:48:51 +02:00
rirat-0 d5ab659217 anpassung von article managerdao 2026-06-02 13:44:37 +02:00
rirat-0 2d5919d572 alte aenderung reverted 2026-06-02 13:41:51 +02:00
rirat-0 f56a074a3c search results controller wird ueber die results seite geladen 2026-06-02 13:38:19 +02:00
rirat-0 24dc432f01 entfernung mancher aenderungen 2026-06-02 13:26:11 +02:00
rirat-0 016193de07 weitere anpassung von index.php 2026-06-02 13:24:17 +02:00
rirat-0 f04d8fecd3 Anpassung der index.php damit der richtige controller geladen wird 2026-06-02 13:20:54 +02:00
rirat-0 36276c7c88 debug versuch nr.5 2026-06-02 13:16:53 +02:00
rirat-0 4a2cf0b55b 4. versuch 2026-06-02 13:14:04 +02:00
rirat-0 400436a73f 3. versuch die homepage zu reparieren 2026-06-02 13:13:02 +02:00
rirat-0 4c378dfba6 2. versuch das problem der homepage zu loesen 2026-06-02 13:08:17 +02:00
rirat-0 c3a9de71f4 1. versuch, das problem der homepage zu beheben 2026-06-02 13:06:29 +02:00
rirat-0 ecf2e9ef57 Update von ArticleManagerDAO, damit die search Methode auch genutzt werden kann 2026-06-02 13:00:21 +02:00
rirat-0 45ac70eba2 Weitere Anpassung der search.php 2026-06-02 12:54:15 +02:00
rirat-0 3b66c6aa3a aenderung des such formulars um korrekte action zu nutzen 2026-06-02 12:49:24 +02:00
rirat-0 e37b882481 anpassung von controllern und results
search function implementiert, search controller entsprechend angepasst und die results seite angepasst
2026-06-02 12:43:59 +02:00
rirat-0 b328c2613c search.php form erstellt 2026-06-01 21:04:37 +02:00
26 changed files with 229 additions and 546 deletions
+11 -23
View File
@@ -1,25 +1,13 @@
# Webprogrammierung: Gruppe DI-14-C Team Tag-Buchstabe: DI-14-C-Schulte-Eilers-Ortmann
Namen der Studierenden:
- Name 1 Caroline Schulte
- Name 2 Jacques Eilers
- Name 3 Niklas Ortmann
Abgabe zu Aufgabenblatt 1
## Beteiligte Hinweise:
- Caroline Schulte index.html wurde zu einer index.php umbenannt.
- Jacques Eilers webhook.php bitte ignorieren. Diese dient nur als zukünftige Automatisierung des Repo-Pulls (s. https://docs.gitea.com/usage/webhooks)
- Niklas Ortmann
## Login-Informationen für Dummy-User Beim Verwenden der Navbar-Links bitte Folgendes beachten: nur die Kategorien Physik, Mathe, Informatik führen exemplarisch auf eine Beispiel-Seite.
Jeweils im Format `Anmeldename, Passwort, Mailadresse`: 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.
- `max.mustermann, test123, mustermann@web.de`
## Weitere Voraussetzungen zur Nutzung
## 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.
## 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.
+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" id="editor-button" class="button">Veröffentlichen</button> <button type="submit" class="btn-publish">Veröffentlichen</button>
</div> </div>
<div class="sidebar-block"> <div class="sidebar-block">
+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="button"> class="login-button">
anmelden anmelden
</button> </button>
+29 -103
View File
@@ -1,144 +1,79 @@
<?php <?php
include_once 'php/controller/profile-controller.php'; include_once 'php/controller/profile-controller.php';
$user = $user ?? null; $user = $user ?? null;
$isEditMode = (isset($_GET["edit"]) && $_GET["edit"] === "1") || !empty($error);
?> ?>
<!--
Content: Profil
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>
<?php if (!empty($error)): ?> <label class="input-label">Name</label>
<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"
value="<?php echo htmlspecialchars($_POST["vorname"] ?? $user["vorname"] ?? ""); ?>" readonly
<?php echo $isEditMode ? "" : "readonly"; ?> value="<?php echo htmlspecialchars($user["username"] ?? ""); ?>">
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"
value="<?php echo htmlspecialchars($_POST["email"] ?? $user["email"] ?? ""); ?>" readonly
<?php echo $isEditMode ? "" : "readonly"; ?> value="<?php echo htmlspecialchars($user["email"] ?? ""); ?>">
required>
<label class="input-label"> <label class="input-label">Passwort</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"
placeholder="Leer lassen, wenn es gleich bleiben soll"> readonly
<?php else: ?> value="********">
<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="button"> <a href="index.php?pfad=deleteAccount" class="login-button">
Account löschen Account löschen
</a> </a>
<br><br> <br><br>
<a href="index.php?pfad=logout" class="button"> <a href="index.php?pfad=logout" class="login-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"> <span class="article-date"><?php echo htmlspecialchars($userArticle->getCreationDate()); ?></span>
<?php echo htmlspecialchars($userArticle->getCreationDate()); ?> <span class="article-category"><?php echo htmlspecialchars($userArticle->getCategory()); ?></span>
</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"> <span class="article-view-tag-item"><?php echo htmlspecialchars($trimmedTag); ?></span>
<?php echo htmlspecialchars($trimmedTag); ?>
</span>
<?php <?php
endif; endif;
endforeach; endforeach;
@@ -146,27 +81,18 @@ $isEditMode = (isset($_GET["edit"]) && $_GET["edit"] === "1") || !empty($error);
</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
<?php unset($_SESSION["message"]); ?> unset($_SESSION["message"]);
?>
</div> </div>
</div> </div>
+5 -6
View File
@@ -1,4 +1,6 @@
<?php <?php
include_once 'php/controller/register-controller.php';
$error = $error ?? null; $error = $error ?? null;
?> ?>
@@ -11,8 +13,8 @@ $error = $error ?? null;
<h1>Jetzt Registrieren!</h1> <h1>Jetzt Registrieren!</h1>
<?php if (!empty($error)): ?> <?php if ($error): ?>
<p class="alert-message is-error" style="color:red;"> <p style="color:red;">
<?php echo htmlspecialchars($error); ?> <?php echo htmlspecialchars($error); ?>
</p> </p>
<?php endif; ?> <?php endif; ?>
@@ -24,7 +26,6 @@ $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>
@@ -32,7 +33,6 @@ $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,7 +40,6 @@ $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>
@@ -53,7 +52,7 @@ $error = $error ?? null;
<button type="submit" <button type="submit"
value="register" value="register"
name="registerSubmit" name="registerSubmit"
class="button"> class="login-button">
kostenlos registrieren kostenlos registrieren
</button> </button>
+30 -34
View File
@@ -1,5 +1,17 @@
<?php <?php
session_start(); session_start();
//debugging
echo "<pre style='background:#fff; color:#000; padding:10px; border:2px solid red; position:relative; z-index:9999;'>";
echo "Aktuelle URL-Parameter (GET): "; print_r($_GET);
echo "Aktueller Session-Inhalt (SESSION): "; print_r($_SESSION);
echo "</pre>";
// debugging
$results = $_SESSION["search_results"] ?? [];
$query = $_SESSION["search_query"] ?? "";
$resultCount = count($results);
?> ?>
<!-- <!--
Seite: Suchergebnisse Seite: Suchergebnisse
@@ -48,7 +60,7 @@ session_start();
<div class="s-res-header"> <div class="s-res-header">
<h1 class="s-res-main-title">Suchergebnisse</h1> <h1 class="s-res-main-title">Suchergebnisse</h1>
<p class="s-res-meta">3 Treffer für Ihre Suchanfrage</p> <p class="s-res-meta"><?php echo $resultCount; ?> Treffer für Ihre Suchanfrage "<?php echo htmlspecialchars($query); ?>"</p>
</div> </div>
<!-- Ergebnisliste --> <!-- Ergebnisliste -->
@@ -56,7 +68,23 @@ session_start();
<?php <?php
if(isset($_SESSION['message']) && $_SESSION['message'] == "new_search_results"): ?> if(isset($_SESSION['message']) && $_SESSION['message'] == "new_search_results"): ?>
<!-- TODO: Hier die Beiträge ausgeben. -->
<?php if ($resultCount === 0): ?>
<p>Keine Beiträge zu diesem Suchbegriff gefunden.</p>
<?php else: ?>
<?php foreach ($results as $item): ?>
<div class="s-res-item">
<div class="s-res-content">
<h2 class="s-res-item-title">
<a href="<?php echo $item['link']; ?>" class="s-res-link"><?php echo $item['title']; ?></a>
</h2>
<p class="s-res-author">Kategorie: <span class="s-res-author-name">Beitrag</span></p>
</div>
<div class="s-res-arrow">&rarr;</div>
</div>
<?php endforeach; ?>
<?php endif; ?>
<?php elseif (isset($_SESSION["message"]) && $_SESSION["message"] == "missing_parameters"): ?> <?php elseif (isset($_SESSION["message"]) && $_SESSION["message"] == "missing_parameters"): ?>
<p> <p>
Bitte überprüfe deine Sucheingabe und versuche es erneut! Bitte überprüfe deine Sucheingabe und versuche es erneut!
@@ -66,38 +94,6 @@ session_start();
unset($_SESSION["message"]); unset($_SESSION["message"]);
?> ?>
<!-- Beispielbeitrag -->
<div class="s-res-item">
<div class="s-res-content">
<h2 class="s-res-item-title">
<a href="#" class="s-res-link">Pythagoras</a>
</h2>
<p class="s-res-author">Von: <span class="s-res-author-name">Max Mustermann</span></p>
</div>
<div class="s-res-arrow">&rarr;</div>
</div>
<!-- Beispielbeitrag -->
<div class="s-res-item">
<div class="s-res-content">
<h2 class="s-res-item-title">
<a href="#" class="s-res-link">Pythagoras</a>
</h2>
<p class="s-res-author">Von: <span class="s-res-author-name">Max Mustermann</span></p>
</div>
<div class="s-res-arrow">&rarr;</div>
</div>
<!-- Beispielbeitrag -->
<div class="s-res-item">
<div class="s-res-content">
<h2 class="s-res-item-title">
<a href="#" class="s-res-link">Pythagoras</a>
</h2>
<p class="s-res-author">Von: <span class="s-res-author-name">Max Mustermann</span></p>
</div>
<div class="s-res-arrow">&rarr;</div>
</div>
</div> </div>
<div class="s-res-pagination-footer"> <div class="s-res-pagination-footer">
+1 -6
View File
@@ -53,11 +53,6 @@ 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"]);
?> ?>
@@ -86,7 +81,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="button">Änderungen speichern</button> <button type="submit" class="btn-publish">Änderungen speichern</button>
</div> </div>
<div class="sidebar-block"> <div class="sidebar-block">
+14 -2
View File
@@ -86,8 +86,20 @@
} }
/* Button-Zeugs */ /* Button-Zeugs */
.button#editor-button { .article-editor-scope .btn-publish {
padding: 18px 12px; background-color: #007cba;
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) */
+2 -2
View File
@@ -155,7 +155,7 @@ a, button, input, select, textarea, label, main{
color: #1f2937; color: #1f2937;
} }
.button { .login-button {
width: 100%; width: 100%;
padding: 12px; padding: 12px;
background-color: #2563eb; background-color: #2563eb;
@@ -168,7 +168,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;
} }
.button:hover { .login-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,7 +1,6 @@
<!-- <!--
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">
+6 -1
View File
@@ -2,5 +2,10 @@
Suchleiste. Wird via PHP später in alle Seiten eingebunden Suchleiste. Wird via PHP später in alle Seiten eingebunden
--> -->
<!--<label for="site-search">Suche</label>--> <!--<label for="site-search">Suche</label>-->
<input type="search" id="site-search" name="q" placeholder="Suchen..." class="nav__search"> <form action="index.php" method="GET" class="search-form">
<input type="hidden" name="pfad" value="search-results">
<input type="search" id="site-search" name="q" placeholder="Suchen..." class="nav__search" required>
<button type="submit" class="nav__search-button">Suchen</button> <button type="submit" class="nav__search-button">Suchen</button>
</form>
+9 -3
View File
@@ -1,3 +1,4 @@
<?php <?php
session_start(); session_start();
ob_start(); ob_start();
@@ -51,8 +52,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';
@@ -60,15 +61,20 @@ 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 (file_exists('content/' . $pfad . '.php')) { if (isset($_GET["pfad"])) {
include_once 'content/' . $pfad . '.php'; if (file_exists('content/' . $_GET["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
@@ -0,0 +1,4 @@
<?php
// mit $_SERVER['DOCUMENT_ROOT'] später umbauen?
$abs_path = __DIR__;
?>
+1 -6
View File
@@ -18,12 +18,7 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") {
if ($user && password_verify($password, $user["password"])) { if ($user && password_verify($password, $user["password"])) {
if (isset($user["vorname"]) && isset($user["nachname"])) { $_SESSION["user"] = $user["username"];
$_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");
+11 -71
View File
@@ -1,11 +1,8 @@
<?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");
@@ -14,8 +11,16 @@ 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 = [];
@@ -24,68 +29,3 @@ try {
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";
}
+21 -24
View File
@@ -1,43 +1,40 @@
<?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 = trim($_POST["email"] ?? ""); $email = $_POST["email"] ?? "";
$vorname = trim($_POST["vorname"] ?? ""); $vorname = $_POST["vorname"] ?? "";
$nachname = trim($_POST["nachname"] ?? ""); $nachname = $_POST["nachname"] ?? "";
$plainPassword = $_POST["password"] ?? ""; $password = password_hash(
$_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();
$password = password_hash($plainPassword, PASSWORD_DEFAULT); $dao->addUser(
$email,
$dao->addUser($email, $vorname, $nachname, $password); $vorname . " " . $nachname,
$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.";
}
} }
} }
+16 -15
View File
@@ -1,29 +1,30 @@
<?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';
if ($_SERVER["REQUEST_METHOD"] === "POST") {
if(!isset($_POST["search"])){ if ($_SERVER["REQUEST_METHOD"] === "GET" && isset($_GET["q"])) {
$search = trim($_GET["q"]);
if (empty($search)) {
$_SESSION["search_results"] = [];
$_SESSION["search_query"] = "";
$_SESSION["message"] = "missing_parameters"; $_SESSION["message"] = "missing_parameters";
header("location: ../../index.php?pfad=search-results");
} else { } else {
$search = $_POST["search"];
try { try {
$articleManager = ArticleManager::getInstance(); $articleManager = ArticleManager::getInstance();
$articleManager->search($search); // TODO: Methode implementieren.
$results = $articleManager->search($search);
$_SESSION["search_results"] = $results;
$_SESSION["search_query"] = $search;
$_SESSION["message"] = "new_search_results";
} catch (Exception $e){ } catch (Exception $e){
$_SESSION["message"] = "internal_error"; $_SESSION["message"] = "internal_error";
} }
$_SESSION["message"] = "new_search_results";
// TODO: Liste mit Artikeln in der Suchreihenfolge übertragen.
// Weiterleitung zur Suchergebnisanzeige
header("location: ../../index.php?pfad=search-results");
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"] ?? ''; // TODO: die Kategorie im Dropdown setzen, wenn der Editor erneut geöffnet wird. $_SESSION["old_category"] = $_POST["category"] ?? '';
$_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 = $_SESSION["user_email"]; $author = "max.mustermann"; // TODO: später aus Session den angemeldeten Nutzer beziehen.
$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"] = $e->getMessage(); $_SESSION["message"] = "internal_error";
header("location: ../../index.php?pfad=updateArticle"); header("location: ../../index.php?pfad=updateArticle");
exit(); exit();
} }
+1
View File
@@ -44,4 +44,5 @@ class ArticleManager extends LocalArticleManager
return $articleManager; return $articleManager;
} }
} }
+13 -14
View File
@@ -1,10 +1,5 @@
<?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.
* *
@@ -21,7 +16,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: Exceptions implementieren. * TODO Fehlerbeschreibung hinzufügen & tags hinzufügen
*/ */
public function addArticle($title, $content, $author, $category, $tags); public function addArticle($title, $content, $author, $category, $tags);
@@ -34,10 +29,7 @@ interface ArticleManagerDAO
* @param $author * @param $author
* @return void * @return void
* *
* @throws InternalServerErrorException * TODO: Fehlerbeschreibung hinzufügen
* @throws NotFoundException
* @throws UnauthorizedAccessException
* /
*/ */
public function updateArticle($id, $article, $author); public function updateArticle($id, $article, $author);
@@ -46,7 +38,7 @@ interface ArticleManagerDAO
* @param $id * @param $id
* @return void * @return void
* *
* TODO: Exceptions implementieren. * TODO: Fehlerbeschreibung hinzufügen
*/ */
public function deleteArticle($id); public function deleteArticle($id);
@@ -56,7 +48,7 @@ interface ArticleManagerDAO
* *
* @return Article * @return Article
* Mögliche Exceptions: * Mögliche Exceptions:
* TODO: Exceptions implementieren. * TODO Fehlerbeschreibung hinzufügen
*/ */
public function getArticle($id); public function getArticle($id);
@@ -64,7 +56,7 @@ interface ArticleManagerDAO
* Alle Beiträge aufrufen. * Alle Beiträge aufrufen.
* *
* Mögliche Exceptions: * Mögliche Exceptions:
* TODO: Exceptions implementieren. * TODO Fehlerbeschreibung hinzufügen
*/ */
public function getAllArticles(); public function getAllArticles();
@@ -72,9 +64,16 @@ 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);
/**
* Such-Funktion
*
* $keyword Wort, nach dem gesucht wird als string
*/
public function search(string $keyword): array;
} }
?> ?>
+28 -5
View File
@@ -36,7 +36,6 @@ 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)
{ {
@@ -66,12 +65,14 @@ class LocalArticleManager implements ArticleManagerDAO {
public function updateArticle($id, $article, $author) public function updateArticle($id, $article, $author)
{ {
if (empty($article)) { if (empty($article)) {
throw new InternalServerErrorException("internal_error"); // TODO: Implement Exception.
return;
} }
// Berechtigungsprüfung: // Berechtigungsprüfung:
if ($article->getAuthor() !== $author) { if ($article->getAuthor() !== $author) {
throw new UnauthorizedAccessException("unauthorized_access"); // TODO: Implement Exception.
return;
} }
// Beitrag aktualisieren: // Beitrag aktualisieren:
@@ -91,14 +92,15 @@ 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");
} }
} }
@@ -166,5 +168,26 @@ class LocalArticleManager implements ArticleManagerDAO {
} }
return $filteredArticles; return $filteredArticles;
} }
public function search(string $keyword): array
{
$results = [];
$contentFolder = __DIR__ . '/../content/';
$files = glob($contentFolder . "*.php");
foreach ($files as $file) {
$content = file_get_contents($file);
if (stripos($content, $keyword) !== false) {
$filename = basename($file, ".php");
$results[] = [
'title' => ucfirst($filename),
'link' => "index.php?pfad=" . $filename
];
}
}
return $results;
}
} }
?> ?>
+8 -123
View File
@@ -1,78 +1,33 @@
<?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) {
$json = json_encode($users, JSON_PRETTY_PRINT); file_put_contents(
$this->file,
if ($json === false) { json_encode($users, JSON_PRETTY_PRINT)
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 (isset($user["email"]) && $user["email"] === $email) { if ($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;
} }
} }
@@ -80,93 +35,23 @@ 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,
"vorname" => $vorname, "username" => $username,
"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 (isset($user["email"]) && $user["email"] === $email) { if ($user["email"] === $email) {
unset($users[$i]); unset($users[$i]);
$users = array_values($users); $users = array_values($users);
$this->saveUsers($users); $this->saveUsers($users);
+2 -55
View File
@@ -11,79 +11,26 @@ 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 $vorname Vorname des Benutzers * @param string $username Benutzername 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, $vorname, $nachname, $password); public function addUser($email, $username, $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
@@ -1,33 +0,0 @@
<?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);
}
-1
View File
@@ -1,7 +1,6 @@
<!-- <!--
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,7 +1,6 @@
<!-- <!--
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">