Compare commits

...

108 Commits

Author SHA1 Message Date
niklas.ortmann a33f3b27fb Update createArticle-controller.php 2026-06-01 10:08:01 +02:00
niklas.ortmann 71a8dd5f17 updateArticle funktioniert 2026-06-01 09:41:34 +02:00
niklas.ortmann e86fef1766 Update updateArticle-controller.php 2026-06-01 09:36:31 +02:00
niklas.ortmann 3cb63f791a Update updateArticle.php 2026-06-01 09:36:28 +02:00
niklas.ortmann f96415bfe6 Update showArticle.php 2026-06-01 09:36:23 +02:00
niklas.ortmann 365f70af98 Update updateArticle.php 2026-06-01 09:29:06 +02:00
niklas.ortmann c1ddbfdf48 Update updateArticle.php 2026-06-01 09:28:29 +02:00
niklas.ortmann e575e3dfa8 Update updateArticle-controller.php 2026-06-01 09:25:22 +02:00
niklas.ortmann 560f53cfb6 Update updateArticle-controller.php 2026-06-01 09:24:51 +02:00
niklas.ortmann d8c350c20f Update showArticle-controller.php 2026-06-01 09:19:28 +02:00
niklas.ortmann 5b718f24ed Update updateArticle-controller.php 2026-06-01 09:17:00 +02:00
niklas.ortmann 6634bee77b Update home.php 2026-06-01 09:16:58 +02:00
niklas.ortmann 2a3e73d409 updateArticle 2026-06-01 09:11:11 +02:00
NOrtmann1 2cd68873de Update updateArticle.php 2026-05-29 17:50:11 +01:00
NOrtmann1 d987ca271f Update updateArticle.php 2026-05-29 17:48:05 +01:00
NOrtmann1 0a37dd4b8b Update showArticle-controller.php 2026-05-29 17:45:04 +01:00
NOrtmann1 b4ca25db3d Update showArticle-controller.php 2026-05-29 17:44:30 +01:00
NOrtmann1 738b36c406 Update updateArticle-controller.php 2026-05-29 17:43:05 +01:00
NOrtmann1 c785363384 missing_id 2026-05-29 17:40:56 +01:00
NOrtmann1 32cb8a9d9e updateArticle Anpassungen 2026-05-29 17:36:29 +01:00
NOrtmann1 29e23a8d3b Update updateArticle.php 2026-05-29 17:32:57 +01:00
NOrtmann1 1a6403963a Update updateArticle.php 2026-05-29 17:29:26 +01:00
NOrtmann1 e096774233 Update updateArticle-controller.php 2026-05-29 17:29:24 +01:00
NOrtmann1 222759a1bc Update updateArticle.php 2026-05-29 18:21:46 +02:00
NOrtmann1 7a3043f644 Update profile.php 2026-05-29 18:20:27 +02:00
NOrtmann1 f1986bc3f7 Update LocalArticleManager.php 2026-05-29 18:18:31 +02:00
NOrtmann1 75d2f17a3f Update updateArticle-controller.php 2026-05-29 18:18:26 +02:00
NOrtmann1 317f4c0ce9 ArticleManager fehlende Implementationen 2026-05-29 18:13:06 +02:00
NOrtmann1 4a7bfa9567 Update profileArticles-controller.php 2026-05-29 17:37:48 +02:00
NOrtmann1 fec3cbb550 Update profile.php 2026-05-29 17:36:46 +02:00
NOrtmann1 497ce5bdb4 Update profile.php 2026-05-29 17:33:45 +02:00
NOrtmann1 53b593b380 Update profile.php 2026-05-29 17:32:51 +02:00
NOrtmann1 2d03b1f051 Update profile.php 2026-05-29 17:31:00 +02:00
NOrtmann1 d3c190096a Update profile.php 2026-05-29 17:30:09 +02:00
NOrtmann1 2998a7bf22 testing 2026-05-29 17:28:38 +02:00
NOrtmann1 43bd452a30 Update profile.php 2026-05-29 17:26:46 +02:00
NOrtmann1 dfdcc99111 Update profile.php 2026-05-29 17:23:30 +02:00
NOrtmann1 ea409dae07 Update LocalArticleManager.php 2026-05-29 17:20:07 +02:00
NOrtmann1 2810bfdce2 Update profile.php 2026-05-29 17:15:00 +02:00
NOrtmann1 ff23e6c9a2 profileArticle-controller.php Implementierung 2026-05-29 17:00:32 +02:00
niklas.ortmann 88c369de32 profile.php dynamisch Beiträge anzeigen (unvollständig 2026-05-29 16:00:31 +02:00
niklas.ortmann 52a34cd9b4 Update profile.css 2026-05-29 15:45:13 +02:00
niklas.ortmann 46eb99b534 Update profile.php 2026-05-29 15:44:14 +02:00
niklas.ortmann 0eba5f875a Update profile.php 2026-05-29 15:43:31 +02:00
niklas.ortmann b93692c160 css 2026-05-29 15:42:55 +02:00
niklas.ortmann 00f9f9cd91 Update main.css 2026-05-29 15:39:32 +02:00
niklas.ortmann 2c0d52a3d5 Update main.css 2026-05-29 15:38:57 +02:00
niklas.ortmann 4a67932002 debugging 2026-05-29 15:37:01 +02:00
niklas.ortmann 339e3025b8 debugging 2026-05-29 15:36:38 +02:00
niklas.ortmann 4d88605192 Update profile.css 2026-05-29 15:35:50 +02:00
niklas.ortmann bd3d81e80c css 2026-05-29 15:35:01 +02:00
niklas.ortmann 98683197e0 Update profile.css 2026-05-29 15:33:00 +02:00
niklas.ortmann 2ded6300ab Update profile.css 2026-05-29 15:31:47 +02:00
niklas.ortmann 79efee0979 css 2026-05-29 15:29:38 +02:00
niklas.ortmann 9db31d4b8c testing 2026-05-29 15:25:51 +02:00
niklas.ortmann d7c7ef1041 Update main.css 2026-05-29 15:24:34 +02:00
niklas.ortmann 483dd4182e css 2026-05-29 15:23:09 +02:00
niklas.ortmann f63a2be01a Update main.css 2026-05-29 15:21:54 +02:00
niklas.ortmann 838b13e39f css 2026-05-29 15:19:51 +02:00
niklas.ortmann 7b4abe32a7 Update profile.css 2026-05-29 15:18:13 +02:00
niklas.ortmann 26889a8b59 Update profile.css 2026-05-29 15:17:14 +02:00
niklas.ortmann 60302e02b6 Update profile.css 2026-05-29 15:15:15 +02:00
niklas.ortmann 72023a6634 testing 2026-05-29 15:14:28 +02:00
niklas.ortmann dd1194a1c7 Update index.php 2026-05-29 15:13:29 +02:00
niklas.ortmann d5fbfc950f Update profile.css 2026-05-29 15:12:47 +02:00
niklas.ortmann d4fa588c8f refactoring 2026-05-29 15:11:40 +02:00
niklas.ortmann 2a5ff14cb5 profile.php mit Nutzerbeiträgen + css 2026-05-29 15:09:45 +02:00
niklas.ortmann df17478d72 Update navbar.css 2026-05-29 13:33:19 +02:00
niklas.ortmann 38fba55798 Update navbar.css 2026-05-29 13:32:38 +02:00
niklas.ortmann 5b3e7bf426 Update createArticle.css 2026-05-29 13:31:10 +02:00
niklas.ortmann cb07a4c80f Update createArticle.php 2026-05-29 13:29:08 +02:00
niklas.ortmann 85512e61a2 Merge branch 'suchseite' into dev
# Conflicts:
#	index.php
2026-05-29 13:25:03 +02:00
niklas.ortmann 380736ce26 Merge pull request 'Beitrag erstellen' (#13) from Beitrag-erstellen into dev
Reviewed-on: #13
2026-05-29 13:22:11 +02:00
NOrtmann1 7f77297100 Update search-results.php 2026-05-29 00:30:28 +02:00
NOrtmann1 e8693f282f Update search-results.php 2026-05-29 00:28:32 +02:00
NOrtmann1 8477462e07 Update search-results.php 2026-05-29 00:18:16 +02:00
NOrtmann1 c28268faf3 search-results-controller.php 2026-05-29 00:09:47 +02:00
NOrtmann1 24a759c61a search-results-controller.php 2026-05-28 23:54:35 +02:00
NOrtmann1 0d0a7dba90 Update search-results.php 2026-05-28 23:50:49 +02:00
NOrtmann1 6de87c9e6c Update search-results.php 2026-05-28 23:23:11 +02:00
NOrtmann1 104f265e9b Update search-results.php 2026-05-28 23:21:58 +02:00
NOrtmann1 f21d819c77 Update search-results.css 2026-05-28 22:49:30 +02:00
NOrtmann1 ac1828b5f9 Update search-results.css 2026-05-28 22:48:58 +02:00
NOrtmann1 22bb2de043 Update search-results.css 2026-05-28 22:47:01 +02:00
NOrtmann1 664ad37181 Update search-results.css 2026-05-28 22:38:10 +02:00
NOrtmann1 c2c98d12bc footer in Suchergebnisleiste 2026-05-28 22:28:10 +02:00
NOrtmann1 cdc8b85f3c css 2026-05-28 22:19:31 +02:00
NOrtmann1 c0d9949037 Seitenleiste mit Filteroptionen 2026-05-28 22:16:55 +02:00
NOrtmann1 5dbe7a99b9 search-results.php + css 2026-05-28 21:55:55 +02:00
NOrtmann1 3ddd66dcbb Update navbar.php 2026-05-26 12:43:21 +02:00
NOrtmann1 8af0367edf Update navbar.css 2026-05-26 12:43:00 +02:00
NOrtmann1 b95fc1adbe Update navbar.php 2026-05-26 12:42:40 +02:00
NOrtmann1 63f400995b Update navbar.css 2026-05-26 12:41:49 +02:00
NOrtmann1 8aa657ed99 doppelte ID entfernt 2026-05-26 12:41:05 +02:00
NOrtmann1 627c72bb7f Update navbar.php 2026-05-26 12:39:05 +02:00
niklas.ortmann a8a75d90ac Merge pull request 'FooterAnsEnde' (#9) from footerAnsEnde into dev
Reviewed-on: #9
2026-05-26 12:30:37 +02:00
niklas.ortmann 0b1b704115 Merge pull request 'MobileNavSchließen' (#10) from MobileNavSchließen into dev
Reviewed-on: #10
2026-05-26 12:30:27 +02:00
niklas.ortmann 0babc42359 Merge pull request 'Update main.css' (#11) from responsiveHomepage into dev
Reviewed-on: #11
2026-05-26 12:30:14 +02:00
rirat-0 4a80d42dda Update main.css
Anpassung der flexbox um inhalte besser zu skalieren
2026-05-26 11:41:11 +02:00
NOrtmann1 a2daded6b3 Footer-Link-Anpassungen (dynamisch wie navbar) 2026-05-26 11:25:47 +02:00
NOrtmann1 d3169eba18 Update navbar.css 2026-05-26 11:19:57 +02:00
NOrtmann1 2d967c200c x-Button in der Sidebar 2026-05-26 11:18:58 +02:00
NOrtmann1 193e526e67 Update main.css 2026-05-26 11:00:25 +02:00
NOrtmann1 f77643af44 body-css-anpassungen 2026-05-26 10:59:07 +02:00
NOrtmann1 9e900a3436 Update footer.css 2026-05-26 10:54:40 +02:00
NOrtmann1 75988ffe71 Update footer.css 2026-05-26 10:54:02 +02:00
NOrtmann1 cb1f3f0d07 Update footer.css 2026-05-26 10:52:57 +02:00
NOrtmann1 4d8017aa2b Update footer.css 2026-05-26 10:51:32 +02:00
22 changed files with 952 additions and 82 deletions
+5 -2
View File
@@ -5,12 +5,12 @@ session_start();
Seite: Beitrag erstellen Seite: Beitrag erstellen
Inhalt: Formular für die Erstellung eines neuen Beitrags Inhalt: Formular für die Erstellung eines neuen Beitrags
--> -->
<form method="post" action="php/controller/createArticle-controller.php" id="editor-form" class="article-editor-scope editor-container"> <form method="post" action="php/controller/createArticle-controller.php" id="editor-form" class="article-editor-scope.editor-container article-editor-scope editor-container">
<main class="editor-main"> <main class="editor-main">
<?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 Fehler beim Speichern aufgetreten. Bitte versuche es erneut. Es ist ein interner Fehler beim Speichern aufgetreten. Bitte versuche es erneut.
</p> </p>
<?php endif; ?> <?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "missing_parameters"): ?> <?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "missing_parameters"): ?>
@@ -18,6 +18,9 @@ session_start();
Jeder Beitrag muss einen Titel, Kategorie und Inhalt besitzen. Jeder Beitrag muss einen Titel, Kategorie und Inhalt besitzen.
</p> </p>
<?php endif; ?> <?php endif; ?>
<?php
unset($_SESSION["message"]);
?>
<input type="text" id="title" name="title" placeholder="Titel hier eingeben" required> <input type="text" id="title" name="title" placeholder="Titel hier eingeben" required>
<textarea id="content" name="content" placeholder="Schreibe deinen Beitrag..."></textarea> <textarea id="content" name="content" placeholder="Schreibe deinen Beitrag..."></textarea>
</main> </main>
@@ -10,10 +10,10 @@
<meta name="description" content="EduForge"> <meta name="description" content="EduForge">
<meta name="author" content="Niklas Ortmann"> <meta name="author" content="Niklas Ortmann">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/x-icon" href="images/logos/logo_icon.ico"> <link rel="icon" type="image/x-icon" href="../images/logos/logo_icon.ico">
<link rel="stylesheet" href="css/main.css"> <link rel="stylesheet" href="../css/main.css">
<link rel="stylesheet" href="css/navbar.css"> <link rel="stylesheet" href="../css/navbar.css">
<link rel="stylesheet" href="css/footer.css"> <link rel="stylesheet" href="../css/footer.css">
<title>EduForge</title> <title>EduForge</title>
</head> </head>
+81 -32
View File
@@ -2,45 +2,94 @@
Content: Profil Content: Profil
Inhalt: Das eigene Profil, wenn man angemeldet ist. Dort hat man die Möglichkeit seine Angaben zu ändern. Inhalt: Das eigene Profil, wenn man angemeldet ist. Dort hat man die Möglichkeit seine Angaben zu ändern.
--> -->
<?php
include_once 'php/controller/profileArticles-controller.php';
?>
<main class="form-page"> <main class="form-page">
<div class="flexbox">
<!-- Linke Spalte: Profildaten -->
<div class="container">
<form>
<label class="input-label">Vorname</label>
<input type="text" name="Vorname" class="login-input" required
placeholder="Vorname"
value="<?php //DB-Daten ?>">
<div class="form-container"> <label class="input-label">Nachname</label>
<form> <input type="text" name="Nachname" class="login-input" required
placeholder="Nachname"
value="<?php //DB-Daten ?>">
<label class="input-label">Vorname</label> <label class="input-label">Email-Adresse</label>
<input type="email" name="Email" class="login-input" required
placeholder="mustermann@web.de"
value="<?php //DB-Daten ?>">
<input type="text" name="Vorname" class="login-input" required <label class="input-label">Passwort</label>
placeholder="Vorname" <input type="password" name="Passwort" class="login-input"
value="<?php //DB-Daten ?>"> required placeholder="Passwort">
<label class="input-label">Nachname</label> <button type="submit" class="login-button">
<input type="text" name="Nachname" class="login-input" required Speichern
placeholder="Nachname" </button>
value="<?php //DB-Daten ?>">
<label class="input-label">Email-Adresse</label> <button type="button" class="login-button delete-account-button">
<input type="email" name="Email" class="login-input" required Account löschen
placeholder="mustermann@web.de" </button>
value="<?php //DB-Daten ?>"> </form>
</div>
<label class="input-label">Passwort</label> <!-- Rechte Spalte: Eigene Beiträge -->
<input type="password" name="Passwort" class="login-input" <div class="container">
required placeholder="Passwort"> <h2 class="section-title">Meine Beiträge</h2>
<div class="articles-list">
<br> <?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "internal_error"): ?>
<p class="alert-message is-error">
<button type="submit" class="login-button"> Es ist ein interner Fehler aufgetreten. Bitte versuche es erneut.
Speichern </p>
</button> <?php elseif (isset($userArticles) && count($userArticles) > 0): ?>
<?php foreach ($userArticles as $userArticle): ?>
<br><br> <!-- Ein einzelner Artikel-Eintrag -->
<div class="article-item">
<button type="button" class="login-button"> <div class="article-meta">
Account löschen <span class="article-date"><?php echo htmlspecialchars($userArticle->getCreationDate()); ?></span>
</button> <span class="article-category"><?php echo htmlspecialchars($userArticle->getCategory()); ?></span>
</div>
</form> <h3 class="article-title"><?php echo htmlspecialchars($userArticle->getTitle()); ?></h3>
<?php
$tags = $userArticle->getTags();
if (isset($tags) && !empty($tags)): ?>
<div class="article-view-bottom-section">
<div class="article-view-tags-label">Tags:</div>
<div class="article-view-tags-list">
<?php
$tagArray = is_array($tags) ? $tags : explode(',', $tags);
foreach ($tagArray as $tag):
$trimmedTag = trim($tag);
if (!empty($trimmedTag)):
?>
<span class="article-view-tag-item"><?php echo htmlspecialchars($trimmedTag); ?></span>
<?php
endif;
endforeach;
?>
</div>
</div>
<?php endif; ?>
<a href="index.php?pfad=updateArticle&id=<?php echo $userArticle->getID(); ?>" class="edit-link-button">Bearbeiten</a>
</div>
<?php endforeach; ?>
<?php else: ?>
<p>Du hast noch keine Beiträge erstellt.</p>
<button type="button" class="login-button" onclick="window.location.href='index.php?pfad=createArticle';">
Beitrag erstellen!
</button>
<?php endif; ?>
<?php
unset($_SESSION["message"]);
?>
</div>
</div>
</div> </div>
</main> </main>
+125
View File
@@ -0,0 +1,125 @@
<?php
session_start();
?>
<!--
Seite: Suchergebnisse
Inhalt: Zeigt die Ergebnisse einer Suche an
-->
<div class="s-res-layout-grid">
<!-- Links: Seitenleiste für Filter und Suche -->
<aside class="s-res-sidebar">
<!-- Suchleiste Box -->
<div class="s-res-sidebar-box">
<h3 class="s-res-sidebar-title">Suche anpassen</h3>
<form action="#" method="GET" class="s-res-search-form">
<input type="search" id="site-search" name="q" placeholder="Suchen..." class="nav__search">
<button type="submit" class="nav__search-button">Suchen</button>
</form>
</div>
<!-- Sortierfuntion Box -->
<div class="s-res-sidebar-box">
<h3 class="s-res-sidebar-title">Sortierung</h3>
<div class="s-res-filter-group">
<label class="s-res-filter-option">
<input type="radio" name="sort" value="alphabet" checked>
<span>Alphabetisch</span>
</label>
<label class="s-res-filter-option">
<input type="radio" name="sort" value="likes">
<span>Beliebtheit (Likes)</span>
</label>
<label class="s-res-filter-option">
<input type="radio" name="sort" value="newest">
<span>Neueste Beiträge</span>
</label>
<label class="s-res-filter-option">
<input type="radio" name="sort" value="oldest">
<span>Älteste Beiträge</span>
</label>
</div>
</div>
</aside>
<main class="s-res-main-content">
<div class="s-res-header">
<h1 class="s-res-main-title">Suchergebnisse</h1>
<p class="s-res-meta">3 Treffer für Ihre Suchanfrage</p>
</div>
<!-- Ergebnisliste -->
<div class="s-res-list">
<?php
if(isset($_SESSION['message']) && $_SESSION['message'] == "new_search_results"): ?>
<!-- TODO: Hier die Beiträge ausgeben. -->
<?php elseif (isset($_SESSION["message"]) && $_SESSION["message"] == "missing_parameters"): ?>
<p>
Bitte überprüfe deine Sucheingabe und versuche es erneut!
</p>
<?php endif; ?>
<?php
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 class="s-res-pagination-footer">
<!-- Auswahl der Ergebnisse pro Seite -->
<div class="s-res-limit-selector">
<label for="s-res-per-page" class="s-res-limit-label">Ergebnisse pro Seite:</label>
<select id="s-res-per-page" name="limit" class="s-res-limit-select">
<option value="10" selected>10</option>
<option value="20">20</option>
<option value="50">50</option>
<option value="100">100</option>
</select>
</div>
<div class="s-res-page-navigation">
<button type="button" class="s-res-page-btn" disabled>&laquo;</button>
<button type="button" class="s-res-page-btn s-res-page-btn-active">1</button>
<button type="button" class="s-res-page-btn">&raquo;</button>
</div>
</div>
</main>
</div>
+27 -3
View File
@@ -9,13 +9,37 @@ include_once 'php/controller/showArticle-controller.php';
<!-- Hauptcontainer für die Beitragsansicht (Ausschließlich der Content-Bereich) --> <!-- Hauptcontainer für die Beitragsansicht (Ausschließlich der Content-Bereich) -->
<main class="article-view-container"> <main class="article-view-container">
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "internal_error"): ?>
<p class="alert-message is-error">
Es ist ein interner Fehler aufgetreten. Bitte versuche es erneut.
</p>
<?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "missing_id"): ?>
<p class="alert-message is-error">
Es ist ein Fehler aufgetreten. Die ID konnte nicht ausgelesen werden. Bitte versuche es erneut.
</p>
<?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "missing_parameters"): ?>
<p class="alert-message is-error">
Jeder Beitrag muss einen Titel, Kategorie und Inhalt besitzen.
</p>
<?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "article_updated"): ?>
<p class="alert-message is-success">
Dein Beitrag wurde erfolgreich bearbeitet!
</p>
<?php endif; ?>
<?php
unset($_SESSION["message"]);
?>
<!-- Metadaten & Titel --> <!-- Metadaten & Titel -->
<div class="article-view-top-section"> <div class="article-view-top-section">
<?php if (isset($category) && !empty($category)): ?> <?php if (isset($category) && !empty($category)): ?>
<span class="article-view-category"><?php echo htmlspecialchars($category); ?></span> <span class="article-view-category"><?php echo htmlspecialchars($category); ?></span>
<?php endif; ?> <?php endif; ?>
<h1 class="article-view-title"> <h1 class="article-view-title">
<?php if (isset($title)) { echo htmlspecialchars($title); } ?> <?php if (isset($title)) { echo htmlspecialchars($title); } ?>
</h1> </h1>
@@ -28,7 +52,7 @@ include_once 'php/controller/showArticle-controller.php';
</div> </div>
<!-- articleikel-Inhalt --> <!-- Beitrags-Inhalt -->
<div class="article-view-content"> <div class="article-view-content">
<?php if (isset($content)): ?> <?php if (isset($content)): ?>
<!-- nl2br für Zeilenumbrüche --> <!-- nl2br für Zeilenumbrüche -->
@@ -36,7 +60,7 @@ include_once 'php/controller/showArticle-controller.php';
<?php endif; ?> <?php endif; ?>
</div> </div>
<!-- articleikel-Endbereich (Tags) --> <!-- Beitrags-Endbereich (Tags) -->
<?php if (isset($tags) && !empty($tags)): ?> <?php 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>
+94
View File
@@ -0,0 +1,94 @@
<?php
include_once 'php/controller/showArticle-controller.php';
?>
<!--
Seite: Beitrag erstellen
Inhalt: Formular für die Erstellung eines neuen Beitrags
-->
<form method="post" action="php/controller/updateArticle-controller.php?id=<?php if(isset($id) && !empty($id)){echo htmlspecialchars($id);}else{$_SESSION["message"] = "missing_id";} ?>" id="editor-form" class="article-editor-scope.editor-container article-editor-scope editor-container">
<main class="editor-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 if (isset($_SESSION["message"]) && $_SESSION["message"] == "missing_id"): ?>
<p class="alert-message is-error">
Es ist ein Fehler aufgetreten. Die ID konnte nicht ausgelesen werden. Bitte versuche es erneut.
</p>
<?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "missing_parameters"): ?>
<p class="alert-message is-error">
Jeder Beitrag muss einen Titel, Kategorie und Inhalt besitzen.
</p>
<?php endif; ?>
<?php
unset($_SESSION["message"]);
?>
<input type="text" id="title" name="title" value="<?php if (isset($title) && !empty($title)){echo htmlspecialchars($title);} ?>" placeholder="Titel hier eingeben" required>
<textarea id="content" name="content" placeholder="Schreibe deinen Beitrag...">
<?php if (isset($content) && !empty($content)){echo htmlspecialchars($content);} ?>
</textarea>
</main>
<!-- Seitenleiste -->
<aside class="editor-sidebar">
<div class="sidebar-block">
<button type="submit" class="btn-publish">Änderungen speichern</button>
</div>
<div class="sidebar-block">
<label for="category">Kategorie <span class="required">*</span></label>
<select id="category" name="category" required>
<option disabled selected>Kategorie wählen...</option>
<optgroup label="Sprachen">
<option value="deutsch">Deutsch</option>
<option value="englisch">Englisch</option>
<option value="franzoesisch">Französisch</option>
<option value="latein">Latein</option>
<option value="literatur">Literatur</option>
</optgroup>
<optgroup label="MINT">
<option value="mathe">Mathematik</option>
<option value="biologie">Biologie</option>
<option value="chemie">Chemie</option>
<option value="physik">Physik</option>
<option value="informatik">Informatik</option>
<option value="astronomie">Astronomie</option>
</optgroup>
<optgroup label="Gesellschaft & Werte">
<option value="geschichte">Geschichte</option>
<option value="erdkunde">Erdkunde</option>
<option value="sozialkunde">Sozialkunde</option>
<option value="wirtschaft">Wirtschaftskunde</option>
<option value="religion">Religion</option>
<option value="ethik">Ethikunterricht</option>
<option value="philosophie">Philosophie</option>
<option value="psychologie">Psychologie</option>
<option value="kunst">Kunst</option>
<option value="musik">Musik</option>
<option value="theater">Theater</option>
</optgroup>
<optgroup label="Technik & Praxis">
<option value="technik">Technik</option>
<option value="werken">Werken</option>
<option value="hauswirtschaft">Hauswirtschaft</option>
<option value="sport">Sport</option>
</optgroup>
</select>
</div>
<div class="sidebar-block">
<label for="tags">Schlagwörter</label>
<input type="text" id="tags" name="tags" value="<?php if (isset($tags) && !empty($tags)){echo htmlspecialchars($tags);} ?>" placeholder="z.B. Technik, IT (mit Komma trennen)">
</div>
</aside>
</form>
+4
View File
@@ -6,6 +6,10 @@
color: #1e1e1e; color: #1e1e1e;
background-color: #f0f2f5; background-color: #f0f2f5;
box-sizing: border-box; box-sizing: border-box;
max-width: 1200px;
margin: 0 auto; /* Zentriert den gesamten Container horizontal */
width: 100%;
} }
.article-editor-scope * { .article-editor-scope * {
-2
View File
@@ -1,7 +1,5 @@
/* FooterGrundlayout */ /* FooterGrundlayout */
footer { footer {
position: fixed;
bottom: 0;
width: 100%; width: 100%;
background: #333d43; background: #333d43;
text-align: center; text-align: center;
+20 -1
View File
@@ -3,12 +3,19 @@ main {
max-width:1200px; max-width:1200px;
margin: 0 auto; margin: 0 auto;
padding: 20px; padding: 20px;
width: 100%;
box-sizing: border-box;
} }
body { body {
background-color: #eef2f7; background-color: #eef2f7;
color: #1f2937; color: #1f2937;
margin: 0; margin: 0;
min-height: 100vh;
display: grid;
grid-template-rows: auto 1fr auto; /* Header(auto), Inhalt (bekommt Rest), Footer(auto) */
} }
a, button, input, select, textarea, label, main{ a, button, input, select, textarea, label, main{
@@ -17,7 +24,8 @@ a, button, input, select, textarea, label, main{
.flexbox { .flexbox {
display: flex; display: flex;
flex-direction: column; flex-direction: row;
flex-wrap: wrap;
gap: 20px; gap: 20px;
margin-top: 30px; margin-top: 30px;
} }
@@ -29,6 +37,7 @@ a, button, input, select, textarea, label, main{
border: 1px solid #dbe3ec; border: 1px solid #dbe3ec;
box-shadow: 0 4px 12px rgba(0,0,0,0.08); box-shadow: 0 4px 12px rgba(0,0,0,0.08);
transition: transform 0.2s, box-shadow 0.2s; transition: transform 0.2s, box-shadow 0.2s;
flex: 1 1 300px;
} }
.container:hover { .container:hover {
@@ -203,3 +212,13 @@ a, button, input, select, textarea, label, main{
border-radius: 10px; border-radius: 10px;
box-shadow: 0 6px 20px rgba(0,0,0,0.1); box-shadow: 0 6px 20px rgba(0,0,0,0.1);
} }
.form-container {
flex: 1 1 450px;
padding: 30px;
background-color: white;
border: 1px solid #dbe3ec;
border-radius: 10px;
box-shadow: 0 6px 20px rgba(0,0,0,0.1);
box-sizing: border-box;
}
+21
View File
@@ -79,6 +79,8 @@ CSS für die navbar
text-decoration: none; text-decoration: none;
font-weight: 600; font-weight: 600;
margin-left: 0.5rem; margin-left: 0.5rem;
white-space: nowrap;
} }
.nav__search { .nav__search {
@@ -205,6 +207,10 @@ CSS für die navbar
margin-left: 4px; margin-left: 4px;
} }
.nav__search-button:hover {
background-color: #f8f9fa;
}
/* restliche desktop-navbar aus */ /* restliche desktop-navbar aus */
.nav__center, .nav__center,
.nav__right .nav__button, .nav__right .nav__button,
@@ -227,6 +233,9 @@ CSS für die navbar
padding: 2rem 1rem; padding: 2rem 1rem;
box-shadow: 2px 0 10px rgba(0,0,0,0.5); box-shadow: 2px 0 10px rgba(0,0,0,0.5);
overflow-y: auto; overflow-y: auto;
/* Genug Abstand oben rechts, damit Links nicht hinter dem X liegen */
padding: 4rem 1.5rem 2rem 1.5rem;
} }
.nav__checkbox:checked ~ .nav__mobile-menu { .nav__checkbox:checked ~ .nav__mobile-menu {
@@ -237,6 +246,18 @@ CSS für die navbar
left: 0; left: 0;
} }
.nav__close-btn {
position: absolute;
top: 1rem;
right: 1.5rem;
font-size: 2rem;
color: #fff;
cursor: pointer;
line-height: 1;
user-select: none;
transition: color 0.2s ease, transform 0.2s ease;
}
.nav__mobile-menu a { .nav__mobile-menu a {
color: #fff; color: #fff;
text-decoration: none; text-decoration: none;
+89
View File
@@ -0,0 +1,89 @@
/*
CSS für die Profilseite
*/
/* Roter Button für Account löschen */
.delete-account-button {
background-color: #dc2626;
margin-bottom: 0;
}
.delete-account-button:hover {
background-color: #b91c1c;
}
/* Beitragsliste Styling */
.section-title {
margin-top: 0;
margin-bottom: 25px;
font-size: 1.5rem;
color: #1f2937;
border-bottom: 2px solid #eef2f7;
padding-bottom: 10px;
}
.articles-list {
display: flex;
flex-direction: column;
gap: 20px;
}
.article-item {
padding: 15px;
border: 1px solid #e5e7eb;
border-radius: 8px;
background-color: #f9fafb;
position: relative;
}
.article-meta {
display: flex;
justify-content: space-between;
font-size: 0.85rem;
color: #6b7280;
margin-bottom: 8px;
}
.article-category {
font-weight: bold;
color: #2563eb;
}
.article-title {
margin: 0 0 10px 0;
font-size: 1.2rem;
color: #1f2937;
}
.article-tags {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-bottom: 15px;
}
.tag {
font-size: 0.75rem;
background-color: #e5e7eb;
color: #374151;
padding: 3px 8px;
border-radius: 4px;
}
/* Bearbeiten-Button als Link deklariert */
.edit-link-button {
display: inline-block;
text-decoration: none;
font-size: 0.9rem;
font-weight: bold;
color: #2563eb;
border: 1px solid #2563eb;
padding: 6px 12px;
border-radius: 6px;
transition: background-color 0.2s, color 0.2s;
}
.edit-link-button:hover {
background-color: #2563eb;
color: white;
}
+263
View File
@@ -0,0 +1,263 @@
/*
CSS für die Suchergebnis-Seite
*/
/* Container und Layout-Schutz vor globalen Styles */
.s-res-layout-grid {
box-sizing: border-box;
max-width: 95%; /* Nutzt jetzt 95% der Bildschirmbreite statt starrer Pixel */
width: 95%; /* Erhöht das Limit für extrem große Monitore von 1200px auf 1600px */
margin: 2rem auto;
padding: 0 1rem;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
color: #212529;
line-height: 1.5;
/* Grid für die Zweispaltigkeit */
display: grid;
grid-template-columns: 320px 1fr; /* Seitenleiste leicht verbreitert, Inhalt nimmt den gesamten Rest ein */
gap: 2.5rem; /* Etwas mehr Abstand zwischen Seitenleiste und Inhalt für das breitere Layout */
}
.s-res-layout-grid * {
box-sizing: border-box;
}
/* --- SEITENLEISTE (FILTER & SUCHE) --- */
.s-res-sidebar {
display: flex;
flex-direction: column;
gap: 1.5rem;
}
.s-res-sidebar-box {
background-color: #ffffff;
border: 1px solid #e2e8f0;
border-radius: 8px;
padding: 1.25rem;
}
.s-res-sidebar-title {
font-size: 1rem;
font-weight: 700;
color: #1a202c;
margin: 0 0 1rem 0;
text-transform: uppercase;
letter-spacing: 0.05em;
}
/* Formular & deine Suchleisten-Klassen */
.s-res-search-form {
display: flex;
align-items: center;
}
/* Filter Radio-Buttons */
.s-res-filter-group {
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.s-res-filter-option {
display: flex;
align-items: center;
gap: 0.5rem;
cursor: pointer;
font-size: 0.95rem;
color: #4a5568;
}
.s-res-filter-option input[type="radio"] {
margin: 0;
accent-color: #3182ce;
}
/* --- HAUPTINHALT (ERGEBNISSE) --- */
.s-res-main-content {
min-width: 0;
}
.s-res-header {
margin-bottom: 2rem;
border-bottom: 2px solid #dee2e6;
padding-bottom: 1rem;
}
.s-res-main-title {
font-size: 2rem;
color: #1a202c;
margin: 0 0 0.5rem 0;
font-weight: 700;
}
.s-res-meta {
color: #6c757d;
font-size: 0.95rem;
margin: 0;
}
.s-res-list {
display: flex;
flex-direction: column;
gap: 1rem;
}
/* Einzelner Beitrag */
.s-res-item {
background-color: #ffffff;
border: 1px solid #e2e8f0;
border-radius: 8px;
padding: 1.25rem;
display: flex;
justify-content: space-between;
align-items: center;
transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
}
.s-res-item:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
border-color: #cbd5e1;
}
.s-res-content {
flex: 1;
}
.s-res-item-title {
font-size: 1.25rem;
margin: 0 0 0.25rem 0;
font-weight: 600;
}
.s-res-link {
color: #3182ce;
text-decoration: none;
transition: color 0.2s ease;
}
.s-res-link:hover {
text-decoration: underline;
color: #2b6cb0;
}
.s-res-author {
font-size: 0.875rem;
color: #4a5568;
margin: 0;
}
.s-res-author-name {
font-weight: 600;
color: #2d3748;
}
.s-res-arrow {
font-size: 1.5rem;
color: #a0aec0;
padding-left: 1rem;
transition: color 0.2s ease, transform 0.2s ease;
}
.s-res-item:hover .s-res-arrow {
color: #3182ce;
transform: translateX(3px);
}
/* ERGEBNISSE PRO SEITE & PAGINIERUNG */
.s-res-pagination-footer {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 2rem;
padding-top: 1.5rem;
border-top: 1px solid #e2e8f0;
}
/* Dropdown-Auswahl */
.s-res-limit-selector {
display: flex;
align-items: center;
gap: 0.5rem;
}
.s-res-limit-label {
font-size: 0.9rem;
color: #4a5568;
}
.s-res-limit-select {
padding: 0.35rem 1.5rem 0.35rem 0.5rem;
font-size: 0.9rem;
color: #2d3748;
background-color: #ffffff;
border: 1px solid #cbd5e1;
border-radius: 4px;
cursor: pointer;
outline: none;
transition: border-color 0.2s;
/* Diskreter nativer Pfeil-Style */
appearance: none;
background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://w3.org' viewBox='0 0 24 24' fill='none' stroke='%234a5568' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 0.4rem center;
background-size: 1em;
}
.s-res-limit-select:focus {
border-color: #3182ce;
}
/* Seitennummern Navigation */
.s-res-page-navigation {
display: flex;
gap: 0.25rem;
}
.s-res-page-btn {
background-color: #ffffff;
border: 1px solid #cbd5e1;
color: #4a5568;
padding: 0.35rem 0.75rem;
font-size: 0.9rem;
font-weight: 500;
border-radius: 4px;
cursor: pointer;
transition: all 0.2s ease;
}
.s-res-page-btn:hover:not(:disabled) {
background-color: #f8f9fa;
border-color: #cbd5e1;
color: #2d3748;
}
.s-res-page-btn-active {
background-color: #3182ce;
border-color: #3182ce;
color: #ffffff;
cursor: default;
}
.s-res-page-btn:disabled {
background-color: #f1f5f9;
border-color: #e2e8f0;
color: #94a3b8;
cursor: not-allowed;
}
/* Responsive Anpassungen unter 760px (für z.B. Smartphones) */
@media (max-width: 768px) {
.s-res-layout-grid {
grid-template-columns: 1fr; /* Stapelt Seitenleiste und Inhalt untereinander */
gap: 1.5rem;
margin: 1rem auto;
}
.s-res-pagination-footer {
flex-direction: column;
gap: 1rem;
align-items: flex-start;
}
}
+3 -3
View File
@@ -1,5 +1,5 @@
<footer> <footer>
<a href="impressum.php">Impressum</a> <a href="index.php?pfad=impressum">Impressum</a>
<a href="datenschutz.php">Datenschutz</a> <a href="index.php?pfad=datenschutz">Datenschutz</a>
<a href="nutzungsbedingungen.php">Nutzungsbedingungen</a> <a href="index.php?pfad=nutzungsbedingungen">Nutzungsbedingungen</a>
</footer> </footer>
+2
View File
@@ -23,7 +23,9 @@ require_once $abs_path . "/php/controller/index-controller.php";
<link rel="stylesheet" href="css/main.css"> <link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/navbar.css"> <link rel="stylesheet" href="css/navbar.css">
<link rel="stylesheet" href="css/footer.css"> <link rel="stylesheet" href="css/footer.css">
<link rel="stylesheet" href="css/search-results.css">
<link rel="stylesheet" href="css/createArticle.css"> <link rel="stylesheet" href="css/createArticle.css">
<link rel="stylesheet" href="css/profile.css">
<link rel="stylesheet" href="css/showArticle.css"> <link rel="stylesheet" href="css/showArticle.css">
<link rel="stylesheet" href="css/message.css"> <link rel="stylesheet" href="css/message.css">
<title>EduForge</title> <title>EduForge</title>
+1 -1
View File
@@ -8,7 +8,7 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") {
$_SESSION["message"] = "missing_parameters"; $_SESSION["message"] = "missing_parameters";
header("location: ../../index.php?pfad=createArticle"); header("location: ../../index.php?pfad=createArticle");
} else { } else {
$title = $_POST["title"]; $title = $_POST["title"];
$content = $_POST["content"]; $content = $_POST["content"];
$category = $_POST["category"]; $category = $_POST["category"];
@@ -0,0 +1,21 @@
<?php
/*
* Controller für die Liste der eigenen Beiträge eines Nutzers auf der eigenen Profilseite
*/
session_start();
require_once 'php/model/Article.php';
require_once 'php/model/ArticleManager.php';
try {
$author = "max.mustermann"; // TODO: später Nutzer aus der Session beziehen.
$articleManager = ArticleManager::getInstance();
$userArticles = $articleManager->getArticlesByAuthor($author);
if(!isset($userArticles)) {
$_SESSION["message"] = "user_has_no_articles";
}
} catch (Exception $e) {
$_SESSION["message"] = "internal_error";
}
?>
@@ -0,0 +1,29 @@
<?php
session_start();
require_once '../model/LocalArticleManager.php';
require_once '../model/ArticleManager.php';
if ($_SERVER["REQUEST_METHOD"] === "POST") {
if(!isset($_POST["search"])){
$_SESSION["message"] = "missing_parameters";
header("location: ../../index.php?pfad=search-results");
} else {
$search = $_POST["search"];
try {
$articleManager = ArticleManager::getInstance();
$articleManager->search($search); // TODO: Methode implementieren.
} catch (Exception $e){
$_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();
}
}
?>
+2 -4
View File
@@ -5,8 +5,9 @@ require_once 'php/model/ArticleManager.php';
if (isset($_GET["id"])){ if (isset($_GET["id"])){
try { try {
$id = $_GET["id"];
$articleManager = ArticleManager::getInstance(); $articleManager = ArticleManager::getInstance();
$article = $articleManager->getArticle($_GET["id"]); $article = $articleManager->getArticle($id);
if($article != null){ if($article != null){
$title = $article->getTitle(); $title = $article->getTitle();
$content = $article->getContent(); $content = $article->getContent();
@@ -15,14 +16,11 @@ if (isset($_GET["id"])){
$tags = $article->getTags(); $tags = $article->getTags();
}else{ }else{
$_SESSION["message"] = "article_not_found"; $_SESSION["message"] = "article_not_found";
echo "article_not_found";
} }
} catch (Exception $e){ } catch (Exception $e){
$_SESSION["message"] = "internal_error"; $_SESSION["message"] = "internal_error";
echo "Fehler aufgetreten: " . $e->getMessage();
} }
}else{ }else{
$_SESSION["message"] = "article_not_found"; $_SESSION["message"] = "article_not_found";
echo "article_not_found";
} }
?> ?>
@@ -0,0 +1,46 @@
<?php
session_start();
require_once '../model/LocalArticleManager.php';
require_once '../model/ArticleManager.php';
require_once '../model/Article.php';
if ($_SERVER["REQUEST_METHOD"] === "POST") {
try {
$id = $_GET["id"];
} catch (Exception $e){
$_SESSION["message"] = "missing_id";
}
if (!isset($_POST["title"]) ||!isset($_POST["content"]) || !isset($_POST["category"])){
$_SESSION["message"] = "missing_parameters";
header("location: ../../index.php?pfad=updateArticle");
} elseif(!isset($id)) {
$_SESSION["message"] = "missing_id";
//header("location: ../../index.php?pfad=updateArticle");
}else{
$newTitle = $_POST["title"];
$newContent = $_POST["content"];
$newCategory = $_POST["category"];
$author = "max.mustermann"; // TODO: später aus Session den angemeldeten Nutzer beziehen.
$newTags = $_POST["tags"];
try {
$articleManager = ArticleManager::getInstance(); // TODO: Später aus Session den Nutzer auslesen und Autorenrechte prüfen!
$article = $articleManager->getArticle($id);
$article->setTitle($newTitle);
$article->setContent($newContent);
$article->setCategory($newCategory);
$article->setTags($newTags);
$articleManager->updateArticle($id ,$article, $author);
} catch (Exception $e){
$_SESSION["message"] = "internal_error";
}
$_SESSION["message"] = "article_updated";
// Weiterleitung zur Homepage
header("location: ../../index.php?pfad=showArticle&id=$id");
}
exit();
}
?>
+21 -11
View File
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* Klasse: Artikel * Klasse: Artikel
* Diese Klasse stellt alle Daten eines Artikels (Beitrag) bereit * Diese Klasse stellt alle Daten eines Beitrags (Beitrag) bereit
* *
* @author Niklas Ortmann * @author Niklas Ortmann
*/ */
@@ -38,7 +38,7 @@ class Article
} }
/** /**
* Gibt die ID eines Artikels zurück. * Gibt die ID eines Beitrags zurück.
* @return int * @return int
*/ */
public function getId(): int public function getId(): int
@@ -47,7 +47,7 @@ class Article
} }
/** /**
* Gibt den Titel eines Artikels zurück. * Gibt den Titel eines Beitrags zurück.
* @return string * @return string
*/ */
public function getTitle(): string public function getTitle(): string
@@ -56,7 +56,7 @@ class Article
} }
/** /**
* Setzt den Titel eines Artikels * Setzt den Titel eines Beitrags
* @param $title * @param $title
* @return void * @return void
*/ */
@@ -66,7 +66,7 @@ class Article
} }
/** /**
* Gibt den Content eines Artikels zurück. * Gibt den Content eines Beitrags zurück.
* TODO: Content muss noch definiert werden. * TODO: Content muss noch definiert werden.
* @return string * @return string
*/ */
@@ -76,7 +76,7 @@ class Article
} }
/** /**
* Setzt den Content eines Artikels. * Setzt den Content eines Beitrags.
* TODO: Content muss noch definiert werden. * TODO: Content muss noch definiert werden.
* @param $content * @param $content
* @return void * @return void
@@ -87,7 +87,7 @@ class Article
} }
/** /**
* Gibt den Autor eines Artikels zurück. * Gibt den Autor eines Beitrags zurück.
* @return string * @return string
*/ */
public function getAuthor(): string public function getAuthor(): string
@@ -96,7 +96,7 @@ class Article
} }
/** /**
* Gibt das Veröffentlichungsdatum des Artikels zurück. * Gibt das Veröffentlichungsdatum des Beitrags zurück.
* @return string * @return string
*/ */
public function getCreationDate(): string public function getCreationDate(): string
@@ -105,7 +105,7 @@ class Article
} }
/** /**
* Gibt die Kategorie eines Artikels zurück. * Gibt die Kategorie eines Beitrags zurück.
* @return string * @return string
*/ */
public function getCategory(): string public function getCategory(): string
@@ -114,7 +114,17 @@ class Article
} }
/** /**
* Gibt die Schlagworte eines Artikels zurück. * Setzt die Kategorie eines Beitrags.
* @param string $category
* @return void
*/
public function setCategory(string $category)
{
$this->category = $category;
}
/**
* Gibt die Schlagworte eines Beitrags zurück.
* @return string * @return string
*/ */
public function getTags(): string public function getTags(): string
@@ -123,7 +133,7 @@ class Article
} }
/** /**
* Setzt die Schlagworte eines Artikels. * Setzt die Schlagworte eines Beitrags.
* @param string $tags * @param string $tags
*/ */
public function setTags(string $tags) public function setTags(string $tags)
+20 -16
View File
@@ -21,26 +21,24 @@ interface ArticleManagerDAO
public function addArticle($title, $content, $author, $category, $tags); public function addArticle($title, $content, $author, $category, $tags);
/** /**
* Ein angemeldeter Nutzer bearbeitet einen Beitrag. * Ändert den gespeicherten Beitrag eines übergebenen Beitrags und eines Autors.
* $id ID des Beitrags * Es wird geprüft, ob der zu änderne Beitrag existiert und ob der übergebene Autor der Autor des originalen
* $title Titel des Beitrags * Beitrages ist.
* $content Der Inhalt des Beitrags * @param $id
* $author dem Author des des Beitrags (NID oder email) * @param $article
* @param $author
* @return void
* *
* Mögliche Exceptions: * TODO: Fehlerbeschreibung hinzufügen
* TODO Fehlerbeschreibung hinzufügen
*/ */
public function updateArticle($id, $title, $content, $author); public function updateArticle($id, $article, $author);
/* /**
* Ein angemeldeter Nutzer löscht einen seiner Beiträge. * Löscht einen Beitrag aus übergebener ID.
* $id ID des Beitrags * @param $id
* $title Titel des Beitrags * @return void
* $content Der Inhalt des Beitrags
* $author dem Author des des Beitrags (NID oder email)
* *
* Mögliche Exceptions: * TODO: Fehlerbeschreibung hinzufügen
* TODO Fehlerbeschreibung hinzufügen
*/ */
public function deleteArticle($id); public function deleteArticle($id);
@@ -62,6 +60,12 @@ interface ArticleManagerDAO
*/ */
public function getAllArticles(); public function getAllArticles();
/**
* Gibt alle Beiträge eines Nutzer mit einer gegebenen ID aus.
* @param $author
* @return Article[]
*/
public function getArticlesByAuthor($author);
} }
?> ?>
+74 -3
View File
@@ -62,14 +62,65 @@ class LocalArticleManager implements ArticleManagerDAO {
$this->saveArticle($articles); $this->saveArticle($articles);
} }
public function updateArticle($id, $title, $content, $author) public function updateArticle($id, $article, $author)
{ {
// TODO: Implement updateArticle() method. if (empty($article)) {
// TODO: Implement Exception.
return;
}
// Berechtigungsprüfung:
if ($article->getAuthor() !== $author) {
// TODO: Implement Exception.
return;
}
// Beitrag aktualisieren:
$articles = $this->getAllArticles();
$updated = false;
foreach ($articles as $index => $storedArticle) {
if (isset($storedArticle['id']) && $storedArticle['id'] == $id) {
$articles[$index] = [
"id" => $id,
"title" => $article->getTitle(),
"content" => $article->getContent(),
"author" => $author,
"category" => $article->getCategory(),
"tags" => $article->getTags(),
"creationDate" => $article->getCreationDate()
];
$updated = true;
break;
}else{
// TODO: Implement Exception.
return;
}
}
// Nur speichern, wenn Beitrag geändert wurde:
if ($updated) {
$this->saveArticle($articles);
}
} }
public function deleteArticle($id) public function deleteArticle($id)
{ {
// TODO: Implement deleteArticle() method. $articles = $this->getAllArticles();
$articleFound = false;
foreach ($articles as $index => $article) {
if (isset($article['id']) && $article['id'] == $id) {
unset($articles[$index]);
$articleFound = true;
break; // Schleife abbrechen, da die ID eindeutig ist
}
}
if ($articleFound) {
// array_values stellt sicher, dass die Array-Keys wieder fortlaufend bei 0 beginnen
$this->saveArticle(array_values($articles));
}
} }
public function getArticle($id) public function getArticle($id)
@@ -97,5 +148,25 @@ class LocalArticleManager implements ArticleManagerDAO {
return is_array($articles) ? $articles : []; return is_array($articles) ? $articles : [];
} }
public function getArticlesByAuthor($author)
{
$articles = $this->getAllArticles();
$filteredArticles = [];
foreach ($articles as $article) {
if (isset($article['author']) && $article['author'] == $author) {
$filteredArticles[] = new Article(
intval($article['id']),
$article['title'],
$article['content'],
$article['author'],
$article['category'],
$article['tags'],
$article['creationDate']
);
}
}
return $filteredArticles;
}
} }
?> ?>