Files
webprogrammierung/php/controller/updateArticle-controller.php
T
2026-06-14 23:02:53 +02:00

217 lines
9.7 KiB
PHP

<?php
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
require_once '../model/LocalArticleManager.php';
require_once '../model/ArticleManager.php';
require_once '../model/Article.php';
require_once '../validator/article-validator.php';
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$_SESSION["old_title"] = $_POST["title"] ?? '';
$_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_tags"] = $_POST["tags"] ?? '';
if (isset($_GET["id"]) && !empty($_GET["id"])) {
$id = $_GET["id"];
} else {
$_SESSION["message"] = "missing_id";
header("location: ../../index.php?pfad=updateArticle");
exit();
}
if (!isset($_POST["title"]) ||!isset($_POST["content"]) || !isset($_POST["category"])){
$_SESSION["message"] = "missing_parameters";
header("location: ../../index.php?pfad=updateArticle&id=$id");
exit();
}else{
$title = $_POST["title"];
$content = $_POST["content"];
$author = $_SESSION["user_email"];
$category = $_POST["category"];
$tags = $_POST['tags'] ?? '';
// -------------------------------- Validierung der Daten: -------------------------
if (!articleTitleValidator($title)) {
$_SESSION["message"] = "invalid_title";
header("location: ../../index.php?pfad=updateArticle&id=$id");
exit();
}
if (!articleContentValidator($content)) {
$_SESSION["message"] = "invalid_content";
header("location: ../../index.php?pfad=updateArticle&id=$id");
exit();
}
if (!articleCategoryValidator($category)) {
$_SESSION["message"] = "invalid_category";
header("location: ../../index.php?pfad=updateArticle&id=$id");
exit();
}
if (!articleTagValidator($tags)) {
$_SESSION["message"] = "invalid_tags";
header("location: ../../index.php?pfad=updateArticle&id=$id");
exit();
} else {
$cleanedTags = [];
$rawTags = explode(',', $tags);
foreach ($rawTags as $rawTag) {
// Leerzeichen am Anfang/Ende des einzelnen Tags entfernen:
$tag = trim($rawTag);
$cleanedTags[] = $tag;
}
// Duplikate entfernen:
$cleanedTags = array_unique($cleanedTags);
$cleanedTags = implode(',', $cleanedTags);
}
// --------------------------------------- Base64-Bilder speichern ---------------------------------------------
$blocks = json_decode($content, true);
$uploadDir = __DIR__ . '/../../uploads/';
if (!file_exists($uploadDir)) {
mkdir($uploadDir, 0755, true);
}
/*
// ----------------- Gelöschte Bilder über die JS-Löschliste entfernen -----------------
if (isset($_POST['deleted_images'])) {
$deletedImages = json_decode($_POST['deleted_images'], true);
// Wir ermitteln den physisch echten, absoluten Pfad zum uploads-Ordner auf der Festplatte
$uploadDir = realpath(__DIR__ . '/../../uploads') . DIRECTORY_SEPARATOR;
if (is_array($deletedImages)) {
foreach ($deletedImages as $imagePath) {
// Nur den reinen Dateinamen heraustrennen (z.B. img_65a123.jpg)
$filename = basename($imagePath);
$fullDeletePath = $uploadDir . $filename;
// Debugging & Löschen:
if (file_exists($fullDeletePath)) {
// Versuchen zu löschen. Wenn es fehlschlägt, Fehlermeldung erzwingen
if (!@unlink($fullDeletePath)) {
$error = error_get_last();
die("Datei existiert, aber PHP darf sie nicht löschen! Grund: " . $error['message']);
}
} else {
// Wenn PHP die Datei an diesem Pfad nicht findet, brechen wir zum Debuggen ab
// die("PHP findet die Datei nicht unter dem Pfad: " . $fullDeletePath);
}
}
}
}
// ----------------------- NEU hinzugefügte Base64-Bilder: --------------------------
if (is_array($blocks)) {
foreach ($blocks as &$block) {
// Prüfen, ob der Block ein Bild ist und ein NEUES Bild (Base64-Format) enthält
if (isset($block['type']) && isset($block['value']) && $block['type'] === 'image' && is_string($block['value'])) {
if (str_starts_with($block['value'], 'data:image/')) {
$parts = explode(',', $block['value']);
if (count($parts) >= 2) {
$metadata = $parts[0];
$base64Data = $parts[1];
preg_match('/data:image\/(?<extension>.*?);/', $metadata, $matches);
$extension = $matches['extension'] ?? 'jpg';
if ($extension === 'jpeg') { $extension = 'jpg'; }
$fileName = 'img_' . uniqid() . '.' . $extension;
$filePath = $uploadDir . $fileName;
if (file_put_contents($filePath, base64_decode($base64Data)) !== false) {
$block['value'] = 'uploads/' . $fileName;
} else {
$_SESSION["message"] = "image_upload_error";
header("location: ../../index.php?pfad=updateArticle&id=$id");
exit();
}
}
}
}
}
unset($block);
}*/
// ----------------- Gelöschte Bilder über die JS-Löschliste entfernen -----------------
if (isset($_POST['deleted_images'])) {
$rawPostData = $_POST['deleted_images'];
// Test 1: Schaut, ob überhaupt Daten vom JavaScript ankommen
if (empty($rawPostData) || $rawPostData === '[]') {
// Wenn das Feld leer ist, bricht PHP hier ab und zeigt es an
die("ABBRUCH: Das Feld 'deleted_images' ist leer im Controller angekommen! Das JS hat nichts geschickt.");
}
// Bereinigung von Slashes und Backslashes, um valides JSON zu garantieren
$rawPostData = str_replace('\\"', '"', $rawPostData);
$rawPostData = str_replace('\\/', '/', $rawPostData);
$deletedImages = json_decode($rawPostData, true);
// Test 2: Prüft, ob das JSON fehlerfrei dekodiert werden konnte
if (json_last_error() !== JSON_ERROR_NONE) {
die("ABBRUCH: JSON-Dekodierungsfehler: " . json_last_error_msg() . " | Rohdaten: " . htmlspecialchars($rawPostData));
}
// Absoluter Server-Pfad zum Uploads-Ordner
$uploadDir = realpath(__DIR__ . '/../../uploads') . DIRECTORY_SEPARATOR;
if (is_array($deletedImages)) {
foreach ($deletedImages as $imagePath) {
// Filtert den reinen Dateinamen (z.B. img_65a123.jpg)
$filename = basename($imagePath);
$fullDeletePath = $uploadDir . $filename;
// Test 3: Prüft, ob PHP die Datei physisch auf der Festplatte findet
if (file_exists($fullDeletePath)) {
// Versuchen zu löschen
if (unlink($fullDeletePath)) {
// ERFOLGSMELDUNG: Wenn gelöscht wurde, stoppen wir hier und feiern den Erfolg!
die("ERFOLG: Die Datei <strong>" . $filename . "</strong> wurde physisch aus /uploads gelöscht! Der Pfad war: " . $fullDeletePath);
} else {
$error = error_get_last();
die("ABBRUCH: Datei existiert, aber Linux verbietet das Löschen! Fehler: " . $error['message']);
}
} else {
// Wenn die Datei nicht existiert (z.B. weil sie schon weg ist oder der Pfad falsch berechnet wurde)
die("ABBRUCH: PHP findet die Datei nicht unter dem Pfad: <br><strong>" . $fullDeletePath . "</strong>");
}
}
}
}
// ----------------- Ende der Lösch-Logik -----------------
// Aktualisiertes Array wieder in JSON konvertieren
$finalContent = json_encode($blocks, JSON_UNESCAPED_UNICODE);
// ----------------- Übertragung der validierten Daten in ArticleManager: ---------------------------
try {
$articleManager = ArticleManager::getInstance();
$article = $articleManager->getArticle($id);
$article->setTitle($title);
$article->setContent($finalContent);
$article->setCategory($category);
$article->setTags($cleanedTags);
$articleManager->updateArticle($id ,$article, $author);
unset($_SESSION["old_title"], $_SESSION["old_content"], $_SESSION["old_category"], $_SESSION["old_tags"]);
} catch (\Throwable $e){
$_SESSION["message"] = $e->getMessage();
header("location: ../../index.php?pfad=updateArticle&id=$id");
exit();
}
$_SESSION["message"] = "article_updated";
// Weiterleitung zur Homepage
header("location: ../../index.php?pfad=showArticle&id=$id");
}
}
?>