Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a382d9254e | |||
| 2b7f44b817 | |||
| b5e4f44252 | |||
| 8561b02a08 | |||
| 01f4ff2d28 | |||
| b7e4387373 | |||
| 7a4f2d738f | |||
| a0a469a9df | |||
| cc5f46c00e | |||
| 1b2ab1cccb | |||
| adbf488e01 | |||
| 6c1a893f80 | |||
| 788e803e84 | |||
| 4d0f1de01c | |||
| e71ee8300e | |||
| f39885da10 | |||
| b7ca5bcfe2 | |||
| 57b0782577 | |||
| 4f524db221 |
@@ -13,6 +13,10 @@
|
||||
- Per Klick auf das Logo gelangt man auf die Home-Seite.
|
||||
|
||||
## Ausgelassene Teilaufgaben
|
||||
- Das Anerkennen der Datenschutzerklärung und das Einhalten der
|
||||
Nutzungsbedingungen (bspw. was Rechte an eingestellten Texten und
|
||||
hochgeladenen Fotos angeht) muss ein Nutzer bei der Registrierung via einer
|
||||
Checkbox und dem Opt-In-Verfahren fehlt noch.
|
||||
|
||||
## Bekannte Fehler und Mängel
|
||||
- Bitte auf die gesetzten TODO's achten. Wenn Inhalte fehlen, sind sie i.d.R. als TODO kommentiert.
|
||||
@@ -23,6 +27,7 @@
|
||||
- Bilder im Beitragseditor sollen zukünftig eine Bildunterschrift bekommen und größenverstellbar sein.
|
||||
- Die Elemente eines Contents im Beitrag werden momentan stumpf untereinander aufgelistet. Soll später
|
||||
sich responisve auch nebeneinander orientieren usw.
|
||||
- Die Datenbank ist noch in die verschiedenen Manager unterteilt. Zukünftig werden alle Daten in einer Datenbank gespeichert.
|
||||
|
||||
## Besonderheiten des Projektes
|
||||
- Es wurde AJAX verwendet, um asynchrone Erstellung von Kommentaren zu implementieren. Es ermöglicht dem Nutzer, einen
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
/** @var string $title */
|
||||
/** @var string $message */
|
||||
/** @var string $link */
|
||||
/** @var bool $isSuccess */
|
||||
|
||||
$title = $title ?? "Passwort zurücksetzen";
|
||||
$message = $message ?? "Der Bestätigungslink konnte nicht verarbeitet werden.";
|
||||
$link = $link ?? "";
|
||||
$isSuccess = $isSuccess ?? false;
|
||||
?>
|
||||
|
||||
<!--
|
||||
Ansicht: Passwortbestätigung
|
||||
Funktion: Zeigt das Ergebnis der Passwortänderung an.
|
||||
-->
|
||||
|
||||
<main class="login-page">
|
||||
<div class="login-container">
|
||||
|
||||
<h1><?php echo htmlspecialchars($title); ?></h1>
|
||||
|
||||
<p class="alert-message <?php echo $isSuccess ? 'is-success' : 'is-error'; ?> confirm-message">
|
||||
<?php echo htmlspecialchars($message); ?>
|
||||
</p>
|
||||
|
||||
<?php echo $link; ?>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
/** @var string $title */
|
||||
/** @var string $message */
|
||||
/** @var string $link */
|
||||
/** @var bool $isSuccess */
|
||||
|
||||
$title = $title ?? "Registrierung";
|
||||
$message = $message ?? "Der Registrierungslink konnte nicht verarbeitet werden.";
|
||||
$link = $link ?? "";
|
||||
$isSuccess = $isSuccess ?? false;
|
||||
?>
|
||||
|
||||
<!--
|
||||
Ansicht: Registrierungsbestätigung
|
||||
Funktion: Zeigt das Ergebnis der Registrierungsbestätigung an.
|
||||
-->
|
||||
<main class="login-page">
|
||||
<div class="login-container">
|
||||
|
||||
<h1><?php echo htmlspecialchars($title); ?></h1>
|
||||
|
||||
<p class="alert-message <?php echo $isSuccess ? 'is-success' : 'is-error'; ?> confirm-message">
|
||||
<?php echo htmlspecialchars($message); ?>
|
||||
</p>
|
||||
|
||||
<?php echo $link; ?>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
+10
-2
@@ -11,8 +11,10 @@ $error = $error ?? null;
|
||||
|
||||
<h1>Bitte anmelden</h1>
|
||||
|
||||
<?php if ($error): ?>
|
||||
<p style="color:red;">
|
||||
<?php include_once "includes/alertMessages.php"; ?>
|
||||
|
||||
<?php if (!empty($error)): ?>
|
||||
<p class="alert-message is-error">
|
||||
<?php echo htmlspecialchars($error); ?>
|
||||
</p>
|
||||
<?php endif; ?>
|
||||
@@ -41,6 +43,12 @@ $error = $error ?? null;
|
||||
anmelden
|
||||
</button>
|
||||
|
||||
<div class="register-link">
|
||||
<a href="index.php?pfad=password-forgotten">
|
||||
Passwort vergessen?
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="register-link">
|
||||
<a href="index.php?pfad=register">
|
||||
Noch keinen Account? Jetzt hier registrieren!
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
$error = $error ?? null;
|
||||
$success = $success ?? null;
|
||||
?>
|
||||
|
||||
<main class="login-page">
|
||||
<div class="login-container">
|
||||
|
||||
<h1>Passwort vergessen</h1>
|
||||
|
||||
<?php if (!empty($error)): ?>
|
||||
<p class="alert-message is-error">
|
||||
<?php echo htmlspecialchars($error); ?>
|
||||
</p>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!empty($success)): ?>
|
||||
<p class="alert-message is-success">
|
||||
<?php echo $success; ?>
|
||||
</p>
|
||||
<?php endif; ?>
|
||||
|
||||
<form method="post" action="index.php?pfad=password-forgotten">
|
||||
|
||||
<p class="input-label">E-Mail-Adresse:</p>
|
||||
<input type="email"
|
||||
name="email"
|
||||
class="login-input"
|
||||
placeholder="E-Mail-Adresse"
|
||||
required>
|
||||
|
||||
<p class="input-label">Neues Passwort:</p>
|
||||
<input type="password"
|
||||
name="password"
|
||||
class="login-input"
|
||||
placeholder="Neues Passwort"
|
||||
required>
|
||||
|
||||
<button type="submit"
|
||||
name="passwordForgottenSubmit"
|
||||
class="button">
|
||||
Passwort zurücksetzen
|
||||
</button>
|
||||
|
||||
<div class="register-link">
|
||||
<a href="index.php?pfad=login">
|
||||
Zurück zum Login
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
@@ -1,5 +1,6 @@
|
||||
<?php
|
||||
$error = $error ?? null;
|
||||
$success = $success ?? null;
|
||||
?>
|
||||
|
||||
<!--
|
||||
@@ -12,11 +13,17 @@ $error = $error ?? null;
|
||||
<h1>Jetzt Registrieren!</h1>
|
||||
|
||||
<?php if (!empty($error)): ?>
|
||||
<p class="alert-message is-error" style="color:red;">
|
||||
<p class="alert-message is-error">
|
||||
<?php echo htmlspecialchars($error); ?>
|
||||
</p>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!empty($success)): ?>
|
||||
<p class="alert-message is-success">
|
||||
<?php echo $success; ?>
|
||||
</p>
|
||||
<?php endif; ?>
|
||||
|
||||
<form method="post" action="index.php?pfad=register">
|
||||
|
||||
<p class="input-label">Email:</p>
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Zeigt den Inhalt einer simulierten E-Mail an.
|
||||
* Die Datei wird über einen zufällig erzeugten Token geladen.
|
||||
*/
|
||||
|
||||
$token = basename($_GET["token"] ?? "");
|
||||
$file = __DIR__ . "/../data/mails/" . $token . ".html";
|
||||
|
||||
if (!file_exists($file)) {
|
||||
echo "<p>Datei nicht gefunden.</p>";
|
||||
exit();
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
<main class="login-page">
|
||||
<div class="login-container">
|
||||
<h1>Simulierte E-Mail</h1>
|
||||
|
||||
<?php include $file; ?>
|
||||
</div>
|
||||
</main>
|
||||
+15
-15
@@ -130,13 +130,6 @@ h1 {
|
||||
color: #1f2937;
|
||||
}
|
||||
|
||||
.input-label {
|
||||
margin-bottom: 5px;
|
||||
font-weight: bold;
|
||||
width: 100%;
|
||||
color: #1f2937;
|
||||
}
|
||||
|
||||
.login-input {
|
||||
width: 100%;
|
||||
padding: 12px;
|
||||
@@ -210,14 +203,6 @@ h1 {
|
||||
.form-container {
|
||||
width: 90%;
|
||||
max-width: 600px;
|
||||
padding: 30px;
|
||||
background-color: white;
|
||||
border: 1px solid #dbe3ec;
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 6px 20px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.form-container {
|
||||
flex: 1 1 450px;
|
||||
padding: 30px;
|
||||
background-color: white;
|
||||
@@ -226,3 +211,18 @@ h1 {
|
||||
box-shadow: 0 6px 20px rgba(0,0,0,0.1);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
/* Darstellung der Registrierungsbestätigung */
|
||||
.confirm-message {
|
||||
text-align: center;
|
||||
margin: 20px 0;
|
||||
}
|
||||
|
||||
/* Anpassung des Login-Buttons auf der Bestätigungsseite */
|
||||
.confirm-button {
|
||||
display: block;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
@@ -78,6 +78,17 @@
|
||||
Das Bild konnte nicht hochgeladen werden. Bitte versuche es erneut oder verwende ein anderes Bildformat.
|
||||
</p>
|
||||
<?php endif; ?>
|
||||
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "registration_confirmed"): ?>
|
||||
<p class="alert-message is-success">
|
||||
Ihre Registrierung wurde erfolgreich abgeschlossen. Sie können sich jetzt anmelden.
|
||||
</p>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "password_changed"): ?>
|
||||
<p class="alert-message is-success">
|
||||
Ihr Passwort wurde erfolgreich geändert. Sie können sich jetzt anmelden.
|
||||
</p>
|
||||
<?php endif; ?>
|
||||
<?php
|
||||
unset($_SESSION["message"]);
|
||||
?>
|
||||
|
||||
@@ -17,6 +17,17 @@ if ($pfad === "login") {
|
||||
if ($pfad === "register") {
|
||||
include_once "php/controller/register-controller.php";
|
||||
}
|
||||
if ($pfad === "password-forgotten") {
|
||||
include_once "php/controller/password-forgotten-controller.php";
|
||||
}
|
||||
|
||||
if ($pfad === "confirm-register") {
|
||||
include_once "php/controller/confirm-register-controller.php";
|
||||
}
|
||||
|
||||
if ($pfad === "confirm-password") {
|
||||
include_once "php/controller/confirm-password-controller.php";
|
||||
}
|
||||
|
||||
if ($pfad === "logout") {
|
||||
include_once "php/controller/logout-controller.php";
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
|
||||
require_once "php/model/UserManager.php";
|
||||
|
||||
/*
|
||||
Verarbeitung der Passwortbestätigung
|
||||
Funktion: Liest die zwischengespeicherten Passwortdaten aus,
|
||||
aktualisiert das Passwort des Benutzers und gibt das Ergebnis
|
||||
für die View zurück.
|
||||
*/
|
||||
|
||||
$title = "Passwort zurücksetzen";
|
||||
$message = "";
|
||||
$link = "";
|
||||
$isSuccess = false;
|
||||
|
||||
$token = basename($_GET["token"] ?? "");
|
||||
$file = "data/pending-password/" . $token . ".json";
|
||||
|
||||
if (empty($token) || !file_exists($file)) {
|
||||
|
||||
$message = "Der Bestätigungslink ist ungültig oder bereits abgelaufen.";
|
||||
|
||||
} else {
|
||||
|
||||
$data = json_decode(file_get_contents($file), true);
|
||||
|
||||
if ($data === null || empty($data["email"]) || empty($data["password"])) {
|
||||
|
||||
$message = "Die Daten zur Passwortänderung konnten nicht gelesen werden.";
|
||||
|
||||
} else {
|
||||
|
||||
try {
|
||||
|
||||
$dao = UserManager::getInstance();
|
||||
$user = $dao->findUser($data["email"]);
|
||||
|
||||
if ($user !== null) {
|
||||
|
||||
$dao->updateUser(
|
||||
$user["email"],
|
||||
$user["email"],
|
||||
$user["vorname"],
|
||||
$user["nachname"],
|
||||
$data["password"]
|
||||
);
|
||||
|
||||
$_SESSION["message"] = "password_changed";
|
||||
header("Location: index.php?pfad=login");
|
||||
exit();
|
||||
|
||||
} else {
|
||||
|
||||
$message = "Der Benutzer konnte nicht gefunden werden.";
|
||||
}
|
||||
|
||||
unlink($file);
|
||||
|
||||
} catch (Exception $e) {
|
||||
|
||||
$message = "Das Passwort konnte nicht geändert werden.";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
require_once "php/model/UserManager.php";
|
||||
|
||||
/*
|
||||
Verarbeitung der Registrierungsbestätigung
|
||||
Funktion: Liest die zwischengespeicherten Registrierungsdaten aus,
|
||||
legt den Benutzer an und gibt das Ergebnis für die View zurück.
|
||||
*/
|
||||
|
||||
$title = "Registrierung";
|
||||
$message = "";
|
||||
$link = "";
|
||||
$isSuccess = false;
|
||||
|
||||
$token = basename($_GET["token"] ?? "");
|
||||
$file = "data/pending/" . $token . ".json";
|
||||
|
||||
if (empty($token) || !file_exists($file)) {
|
||||
|
||||
$message = "Der Registrierungslink ist ungültig oder bereits abgelaufen.";
|
||||
|
||||
} else {
|
||||
|
||||
$data = json_decode(file_get_contents($file), true);
|
||||
|
||||
if (
|
||||
$data === null ||
|
||||
empty($data["email"]) ||
|
||||
empty($data["vorname"]) ||
|
||||
empty($data["nachname"]) ||
|
||||
empty($data["password"])
|
||||
) {
|
||||
|
||||
$message = "Die Registrierungsdaten konnten nicht gelesen werden.";
|
||||
|
||||
} else {
|
||||
|
||||
try {
|
||||
|
||||
$dao = UserManager::getInstance();
|
||||
|
||||
if ($dao->findUser($data["email"]) === null) {
|
||||
|
||||
$dao->addUser(
|
||||
$data["email"],
|
||||
$data["vorname"],
|
||||
$data["nachname"],
|
||||
$data["password"]
|
||||
);
|
||||
}
|
||||
|
||||
unlink($file);
|
||||
|
||||
$_SESSION["message"] = "registration_confirmed";
|
||||
header("Location: index.php?pfad=login");
|
||||
exit();
|
||||
|
||||
} catch (Exception $e) {
|
||||
|
||||
$message = "Die Registrierung konnte nicht abgeschlossen werden.";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
require_once "php/model/UserManager.php";
|
||||
require_once "php/validator/user-validator.php";
|
||||
|
||||
$error = null;
|
||||
$success = null;
|
||||
|
||||
if ($_SERVER["REQUEST_METHOD"] === "POST") {
|
||||
|
||||
$email = trim($_POST["email"] ?? "");
|
||||
$plainPassword = $_POST["password"] ?? "";
|
||||
|
||||
if (!userEmailValidator($email)) {
|
||||
$error = "Bitte gib eine gültige E-Mail-Adresse ein.";
|
||||
} elseif (!userPasswordValidator($plainPassword)) {
|
||||
$error = "Das Passwort muss 5 bis 12 Zeichen lang sein.";
|
||||
} else {
|
||||
try {
|
||||
$dao = UserManager::getInstance();
|
||||
|
||||
$token = bin2hex(random_bytes(16));
|
||||
$existingUser = $dao->findUser($email);
|
||||
|
||||
if (!is_dir("data/mails") && !mkdir("data/mails", 0777, true)) {
|
||||
throw new RuntimeException("Ordner data/mails konnte nicht erstellt werden.");
|
||||
}
|
||||
|
||||
if (!is_dir("data/pending-password") && !mkdir("data/pending-password", 0777, true)) {
|
||||
throw new RuntimeException("Ordner data/pending-password konnte nicht erstellt werden.");
|
||||
}
|
||||
|
||||
if (!is_writable("data/mails") || !is_writable("data/pending-password")) {
|
||||
throw new RuntimeException("Ordner sind nicht beschreibbar.");
|
||||
}
|
||||
|
||||
if ($existingUser !== null) {
|
||||
$pendingData = [
|
||||
"email" => $email,
|
||||
"password" => $plainPassword
|
||||
];
|
||||
|
||||
file_put_contents(
|
||||
"data/pending-password/" . $token . ".json",
|
||||
json_encode($pendingData, JSON_PRETTY_PRINT)
|
||||
);
|
||||
}
|
||||
|
||||
if ($existingUser !== null) {
|
||||
$mailContent = "
|
||||
<h2>Passwort zurücksetzen</h2>
|
||||
<p>Falls Sie diese Anfrage nicht gestellt haben, können Sie diese Nachricht ignorieren.</p>
|
||||
<p>
|
||||
<a href='index.php?pfad=confirm-password&token=$token'>
|
||||
Passwortänderung bestätigen
|
||||
</a>
|
||||
</p>
|
||||
";
|
||||
} else {
|
||||
$mailContent = "
|
||||
<h2>Passwort zurücksetzen</h2>
|
||||
<p>Falls Sie diese Anfrage nicht gestellt haben, können Sie diese Nachricht ignorieren.</p>
|
||||
<p>Für diese E-Mail-Adresse wurde kein Konto gefunden.</p>
|
||||
";
|
||||
}
|
||||
|
||||
file_put_contents("data/mails/" . $token . ".html", $mailContent);
|
||||
|
||||
$success = 'Weitere Infos finden Sie in der Datei
|
||||
<a href="index.php?pfad=show-mail&token=' . htmlspecialchars($token) . '" target="_blank">xy</a>.';
|
||||
|
||||
} catch (Exception $e) {
|
||||
$error = "Die Passwortänderung konnte nicht verarbeitet werden.";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ require_once "php/model/UserManager.php";
|
||||
require_once "php/validator/user-validator.php";
|
||||
|
||||
$error = null;
|
||||
$success = null;
|
||||
|
||||
if ($_SERVER["REQUEST_METHOD"] === "POST") {
|
||||
|
||||
@@ -24,20 +25,71 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") {
|
||||
try {
|
||||
$dao = UserManager::getInstance();
|
||||
|
||||
$password = password_hash($plainPassword, PASSWORD_DEFAULT);
|
||||
// Token für die simulierte E-Mail und die spätere Bestätigung erzeugen.
|
||||
$token = bin2hex(random_bytes(16));
|
||||
$existingUser = $dao->findUser($email);
|
||||
|
||||
$dao->addUser($email, $vorname, $nachname, $password);
|
||||
if (!is_dir("data/mails") && !mkdir("data/mails", 0777, true)) {
|
||||
throw new RuntimeException("Ordner data/mails konnte nicht erstellt werden.");
|
||||
}
|
||||
|
||||
$_SESSION["user"] = $vorname . " " . $nachname;
|
||||
$_SESSION["user_email"] = $email;
|
||||
if (!is_dir("data/pending") && !mkdir("data/pending", 0777, true)) {
|
||||
throw new RuntimeException("Ordner data/pending konnte nicht erstellt werden.");
|
||||
}
|
||||
|
||||
header("Location: index.php");
|
||||
exit();
|
||||
if (!is_writable("data/mails")) {
|
||||
throw new RuntimeException("Ordner data/mails ist nicht beschreibbar.");
|
||||
}
|
||||
|
||||
if (!is_writable("data/pending")) {
|
||||
throw new RuntimeException("Ordner data/pending ist nicht beschreibbar.");
|
||||
}
|
||||
|
||||
if ($existingUser === null) {
|
||||
$password = password_hash($plainPassword, PASSWORD_DEFAULT);
|
||||
|
||||
$pendingData = [
|
||||
"email" => $email,
|
||||
"vorname" => $vorname,
|
||||
"nachname" => $nachname,
|
||||
"password" => $password
|
||||
];
|
||||
|
||||
file_put_contents(
|
||||
"data/pending/" . $token . ".json",
|
||||
json_encode($pendingData, JSON_PRETTY_PRINT)
|
||||
);
|
||||
|
||||
$mailContent = "
|
||||
<h2>Registrierung bestätigen</h2>
|
||||
<p>Bitte ignorieren Sie diese Nachricht, wenn Sie sich nicht registrieren wollten.</p>
|
||||
<p>
|
||||
<a href='index.php?pfad=confirm-register&token=$token'>
|
||||
Registrierung bestätigen
|
||||
</a>
|
||||
</p>
|
||||
";
|
||||
} else {
|
||||
$mailContent = "
|
||||
<h2>Registrierung</h2>
|
||||
<p>Bitte ignorieren Sie diese Nachricht, wenn Sie sich nicht registrieren wollten.</p>
|
||||
<p>Sie sind bereits registriert.</p>
|
||||
<p>
|
||||
<a href='index.php?pfad=password-forgotten'>
|
||||
Passwort vergessen
|
||||
</a>
|
||||
</p>
|
||||
";
|
||||
}
|
||||
|
||||
file_put_contents("data/mails/" . $token . ".html", $mailContent);
|
||||
|
||||
// Neutrale Meldung, damit nicht sichtbar wird, ob die E-Mail bereits registriert ist.
|
||||
$success = 'Weitere Infos finden Sie in der Datei
|
||||
<a href="index.php?pfad=show-mail&token=' . htmlspecialchars($token) . '" target="_blank">xy</a>.';
|
||||
|
||||
} catch (InvalidArgumentException $e) {
|
||||
$error = $e->getMessage();
|
||||
} catch (Exception $e) {
|
||||
$error = "Die Registrierung konnte nicht gespeichert werden.";
|
||||
$error = "Die Registrierung konnte nicht verarbeitet werden.";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -338,7 +338,8 @@ class DatabaseArticleManager implements ArticleManagerDAO {
|
||||
$sql = "SELECT id, title, content, author, category, tags, created
|
||||
FROM articles
|
||||
WHERE title LIKE :keyword
|
||||
OR content LIKE :keyword;";
|
||||
OR content LIKE :keyword
|
||||
OR tags LIKE :keyword";
|
||||
|
||||
$command = $db->prepare($sql);
|
||||
if (!$command) {
|
||||
|
||||
@@ -211,9 +211,11 @@ class LocalArticleManager implements ArticleManagerDAO {
|
||||
foreach ($articles as $article) {
|
||||
$title = isset($article['title']) ? strtolower((string)$article['title']) : '';
|
||||
$content = isset($article['content']) ? strtolower((string)$article['content']) : '';
|
||||
$tags = isset($article['tags']) ? strtolower((string)$article['tags']) : '';
|
||||
|
||||
if (($cleanKeyword !== '' && strpos($title, $cleanKeyword) !== false) ||
|
||||
($cleanKeyword !== '' && strpos($content, $cleanKeyword) !== false)) {
|
||||
($cleanKeyword !== '' && strpos($content, $cleanKeyword) !== false) ||
|
||||
($cleanKeyword !== '' && strpos($tags, $cleanKeyword) !== false)) {
|
||||
|
||||
$likes = isset($article['likes']) && is_array($article['likes']) ? $article['likes'] : [];
|
||||
$filteredArticles[] = new Article(
|
||||
|
||||
Reference in New Issue
Block a user