erweiterter Beitragseditor

content ist nun im json-Format
Bilder können hochgeladen werden
Textblöcke können im Editor angehangen werden
This commit is contained in:
2026-06-14 10:44:17 +02:00
parent f9c1c67a38
commit 80f92a384e
7 changed files with 202 additions and 14 deletions
+45 -4
View File
@@ -64,10 +64,54 @@ require_once '../validator/article-validator.php';
$cleanedTags = array_unique($cleanedTags);
$cleanedTags = implode(',', $cleanedTags);
}
// ----------------- Base64-Bilder verarbeiten und auf Server speichern -----------------
$blocks = json_decode($content, true);
$uploadDir = __DIR__ . '/../../uploads/';
if (!file_exists($uploadDir)) {
mkdir($uploadDir, 0755, true);
}
foreach ($blocks as &$block) {
// Base64-Format-Prüfung:
if ($block['type'] === 'image' && str_starts_with($block['value'], 'data:image/')) {
// Base64-String zerlegen:
log_alert("Bild erkannt, verarbeite...");
$parts = explode(',', $block['value']);
$metadata = $parts[0];
$base64Data = $parts[1];
// Dateiendung ermitteln
preg_match('/data:image\/(?<extension>.*?);/', $metadata, $matches);
$extension = $matches['extension'] ?? 'jpg';
if ($extension === 'jpeg') { $extension = 'jpg'; }
// Eindeutigen Dateinamen generieren
$fileName = 'img_' . uniqid() . '.' . $extension;
$filePath = $uploadDir . $fileName;
// Datei im /uploads speichern:
if (file_put_contents($filePath, base64_decode($base64Data)) !== false) {
// temporären Base64-String durch den echten Pfad ersetzen
$block['value'] = 'uploads/' . $fileName;
} else {
$_SESSION["message"] = "image_upload_error";
header("location: ../../index.php?pfad=createArticle");
exit();
}
}
}
unset($block);
// Aktualisiertes Array wieder in JSON konvertieren
$finalContent = json_encode($blocks, JSON_UNESCAPED_UNICODE);
// ----------------- Übertragung der validierten Daten in ArticleManager: ---------------------------
try {
$articleManager = ArticleManager::getInstance();
$articleManager->addArticle($title, $content, $author, $category, $cleanedTags);
$articleManager->addArticle($title, $finalContent, $author, $category, $cleanedTags);
// Formulardaten nach erfolgreichem Erstellen aus der Session löschen
unset($_SESSION["old_title"], $_SESSION["old_content"], $_SESSION["old_category"], $_SESSION["old_tags"]);
@@ -84,7 +128,4 @@ require_once '../validator/article-validator.php';
exit();
}
}
?>
+2 -2
View File
@@ -19,7 +19,7 @@ class ArticleManager
public static function getInstance()
{
$articleManager = DatabaseArticleManager::getInstance(); // Hier kann zwischen dem lokalen und datenbankbasiertem ArticleManager gewechselt werden.
/*
// 100 fiktionale Fachbeiträge:
$dummyArticles = [
// --- INFORMATIK & MATHE (1-20) ---
@@ -154,7 +154,7 @@ class ArticleManager
);
}
}
*/
return $articleManager;
}
+6 -7
View File
@@ -33,19 +33,18 @@ function articleTitleValidator($title)
}
/**
* Prüft, ob der Contenttext 10-7000 Zeichen enthält.
* @param $content
* Prüft, ob der übergebene Content ein formal valider JSON-String ist.
* @param mixed $content Der zu prüfende Inhalt
* @return bool
*/
function articleContentValidator($content)
{
$content = trim($content);
$zeichenAnzahl = mb_strlen($content);
if ($zeichenAnzahl <= 7000 && $zeichenAnzahl >= 10) {
return true;
}else{
if (!is_string($content)) {
return false;
}
// Prüft direkt, ob der String valides JSON enthält
return json_validate($content);
}
/**