Module tasks + knowledgecenter_update aus Kundenprojekt übernehmen (bereinigt)
Beide Module wurden aus einem anderen Kundenprojekt kopiert und bereinigt: Knowledgecenter: - Bild-Cache (1.985 Dateien) geleert, Ordnerstruktur mit .gitkeep behalten - Files-Gallery-Lizenzschlüssel entfernt (config.php) - Kundenspezifische Kategorien gelöscht: Teil I/II/III QM-Struktur, nummerierte QM-Kapitel, Gremien (Präsidium/Finanzausschuss/Landesausschuss), Sitzungsservice-Serie, Protokoll-Abteilungen, Testeinträge - 56 generische Kategorien bleiben (Downloads, Onboarding, Personalthemen …) Tasks: - Alle Betriebsdaten gelöscht (114 Tasks, 914 Submissions, 579 Assignments) - Task-Definitionen und Verlinkungen geleert - Kategoriestruktur bleibt (Allgemein, IT, Personal, Buchhaltung …) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
264
module/knowledgecenter_update/Import/Import.php
Normal file
264
module/knowledgecenter_update/Import/Import.php
Normal file
@@ -0,0 +1,264 @@
|
||||
|
||||
<h1>Import-Dashboard</h1>
|
||||
<hr>
|
||||
<a href="?action=Import&reset_import=1">Tabellen leeren (Reset) ✕</a>
|
||||
<hr>
|
||||
<a href="?action=Import&cat_import=1">Kategorien importieren ↗</a>
|
||||
<hr>
|
||||
<a href="?action=Import&post_import=1">Beiträge importieren ↗</a>
|
||||
<hr>
|
||||
|
||||
<?php
|
||||
// ini_set('display_errors', 1);
|
||||
// error_reporting(E_ALL);
|
||||
|
||||
/**
|
||||
* Funktion zum Truncaten (Leeren) aller relevanten Tabellen für den Import-Test.
|
||||
* Dabei werden vorübergehend die Foreign-Key-Prüfungen deaktiviert.
|
||||
*/
|
||||
function truncate_import_tables()
|
||||
{
|
||||
die("Die Funktion truncate_import_tables() ist deaktiviert, um Datenverlust zu vermeiden.");
|
||||
// Tabellen, die geleert werden sollen
|
||||
$tables = [
|
||||
'knowledgecenter_category_links',
|
||||
'knowledgecenter_category_post',
|
||||
'knowledgecenter_category_translations',
|
||||
'knowledgecenter_category_mandant',
|
||||
'knowledgecenter_category_department',
|
||||
'knowledgecenter_category_role',
|
||||
'knowledgecenter_categories_update',
|
||||
'knowledgecenter_post_version_contacts',
|
||||
'knowledgecenter_post_versions',
|
||||
'knowledgecenter_post_role',
|
||||
'knowledgecenter_post_files',
|
||||
'knowledgecenter_post_department',
|
||||
'knowledgecenter_post_mandant',
|
||||
'knowledgecenter_post_contacts',
|
||||
'knowledgecenter_post_comments',
|
||||
'knowledgecenter_posts'
|
||||
];
|
||||
|
||||
// Foreign-Key-Prüfungen deaktivieren
|
||||
mysqli_query($GLOBALS['mysql_con'], "SET FOREIGN_KEY_CHECKS = 0");
|
||||
|
||||
foreach ($tables as $table) {
|
||||
$query = "TRUNCATE TABLE $table";
|
||||
if (mysqli_query($GLOBALS['mysql_con'], $query)) {
|
||||
echo "Tabelle <strong>$table</strong> wurde erfolgreich geleert.<br>";
|
||||
} else {
|
||||
echo "Fehler beim Leeren der Tabelle <strong>$table</strong>: " . mysqli_error($GLOBALS['mysql_con']) . "<br>";
|
||||
}
|
||||
}
|
||||
|
||||
// Foreign-Key-Prüfungen wieder aktivieren
|
||||
mysqli_query($GLOBALS['mysql_con'], "SET FOREIGN_KEY_CHECKS = 1");
|
||||
}
|
||||
|
||||
/**
|
||||
* Rekursive Funktion zum Importieren von Kategorien.
|
||||
* Für jeden Unterordner wird – sofern noch nicht vorhanden – eine Kategorie in
|
||||
* knowledgecenter_categories_update und eine Übersetzung in knowledgecenter_category_translations (language_id = 1) angelegt.
|
||||
* Bei Unterordnern wird zudem in knowledgecenter_category_links eine Parent-Child-Verknüpfung erstellt.
|
||||
*
|
||||
* @param string $folder Absoluter Pfad des aktuellen Ordners.
|
||||
* @param int|null $parentCategoryId Falls vorhanden, die Kategorie-ID des Elternordners.
|
||||
*/
|
||||
function import_categories($folder, $parentCategoryId = null)
|
||||
{
|
||||
if (!is_dir($folder)) {
|
||||
echo "Ordner '$folder' existiert nicht.<br>";
|
||||
return;
|
||||
}
|
||||
|
||||
$folderName = basename($folder);
|
||||
$folderNameEscaped = mysqli_real_escape_string($GLOBALS['mysql_con'], $folderName);
|
||||
|
||||
// Prüfen, ob eine Kategorie mit diesem Titel (language_id = 1) bereits existiert
|
||||
$query = "SELECT c.id
|
||||
FROM knowledgecenter_categories_update c
|
||||
JOIN knowledgecenter_category_translations t ON c.id = t.category_id
|
||||
WHERE t.language_id = 1 AND t.title = '$folderNameEscaped' LIMIT 1";
|
||||
$result = mysqli_query($GLOBALS['mysql_con'], $query);
|
||||
if ($result && mysqli_num_rows($result) > 0) {
|
||||
$row = mysqli_fetch_assoc($result);
|
||||
$categoryId = $row['id'];
|
||||
echo "Kategorie '$folderName' existiert bereits (ID: $categoryId).<br>";
|
||||
} else {
|
||||
$sql_category = "INSERT INTO knowledgecenter_categories_update (sorting, state, modified_at, modified_by, created_at)
|
||||
VALUES (0, 1, NOW(), 'import', NOW())";
|
||||
if (!mysqli_query($GLOBALS['mysql_con'], $sql_category)) {
|
||||
echo "Fehler beim Erstellen der Kategorie '$folderName': " . mysqli_error($GLOBALS['mysql_con']) . "<br>";
|
||||
return;
|
||||
}
|
||||
$categoryId = mysqli_insert_id($GLOBALS['mysql_con']);
|
||||
|
||||
$sql_trans = "INSERT INTO knowledgecenter_category_translations (category_id, language_id, title, created_at)
|
||||
VALUES ($categoryId, 1, '$folderNameEscaped', NOW())";
|
||||
if (!mysqli_query($GLOBALS['mysql_con'], $sql_trans)) {
|
||||
echo "Fehler beim Einfügen der Kategorie-Übersetzung für '$folderName': " . mysqli_error($GLOBALS['mysql_con']) . "<br>";
|
||||
}
|
||||
echo "Kategorie '$folderName' wurde erstellt (ID: $categoryId).<br>";
|
||||
}
|
||||
|
||||
if ($parentCategoryId !== null) {
|
||||
$query_link = "SELECT id FROM knowledgecenter_category_links WHERE parent_category_id = $parentCategoryId AND child_category_id = $categoryId LIMIT 1";
|
||||
$result_link = mysqli_query($GLOBALS['mysql_con'], $query_link);
|
||||
if ($result_link && mysqli_num_rows($result_link) == 0) {
|
||||
$sql_link = "INSERT INTO knowledgecenter_category_links (parent_category_id, child_category_id, sorting, created_at)
|
||||
VALUES ($parentCategoryId, $categoryId, 0, NOW())";
|
||||
if (!mysqli_query($GLOBALS['mysql_con'], $sql_link)) {
|
||||
echo "Fehler beim Verknüpfen der Kategorie '$folderName' mit Eltern ($parentCategoryId): " . mysqli_error($GLOBALS['mysql_con']) . "<br>";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Unterordner verarbeiten
|
||||
$subDirs = glob($folder . "/*", GLOB_ONLYDIR);
|
||||
if ($subDirs !== false) {
|
||||
foreach ($subDirs as $subDir) {
|
||||
import_categories($subDir, $categoryId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Rekursive Funktion zum Importieren von Beiträgen.
|
||||
* In jedem Ordner werden alle Dateien als Beiträge importiert.
|
||||
* Für jede Datei wird der Dateiname (ohne Erweiterung) als Titel verwendet und
|
||||
* als Teaser "Hier finden Sie die Informationen zu [Dateiname]" gesetzt.
|
||||
* Anschließend wird der Beitrag in knowledgecenter_posts und knowledgecenter_post_versions (language_id = 1, Version 1) angelegt
|
||||
* und in knowledgecenter_category_post mit der zugehörigen Kategorie verknüpft.
|
||||
* Zusätzlich wird ein Eintrag in knowledgecenter_post_files für die Datei erstellt.
|
||||
*
|
||||
* @param string $folder Absoluter Pfad des aktuellen Ordners.
|
||||
*/
|
||||
function import_posts($folder)
|
||||
{
|
||||
if (!is_dir($folder)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Ermitteln der zugehörigen Kategorie anhand des Ordnernamens
|
||||
$folderName = basename($folder);
|
||||
$folderNameEscaped = mysqli_real_escape_string($GLOBALS['mysql_con'], $folderName);
|
||||
$query = "SELECT c.id
|
||||
FROM knowledgecenter_categories_update c
|
||||
JOIN knowledgecenter_category_translations t ON c.id = t.category_id
|
||||
WHERE t.language_id = 1 AND t.title = '$folderNameEscaped' LIMIT 1";
|
||||
$result = mysqli_query($GLOBALS['mysql_con'], $query);
|
||||
if ($result && mysqli_num_rows($result) > 0) {
|
||||
$row = mysqli_fetch_assoc($result);
|
||||
$categoryId = $row['id'];
|
||||
} else {
|
||||
echo "Keine Kategorie für '$folderName' gefunden. Bitte zuerst Kategorien importieren.<br>";
|
||||
return;
|
||||
}
|
||||
|
||||
// Alle Dateien im aktuellen Ordner als Beiträge importieren
|
||||
$files = glob($folder . "/*");
|
||||
if ($files !== false) {
|
||||
foreach ($files as $item) {
|
||||
if (is_file($item)) {
|
||||
$fileName = basename($item);
|
||||
$fileTitle = pathinfo($fileName, PATHINFO_FILENAME); // Dateiname ohne Erweiterung
|
||||
$titleEscaped = mysqli_real_escape_string($GLOBALS['mysql_con'], $fileTitle);
|
||||
$teaser = "Hier finden Sie die Informationen zu $fileTitle";
|
||||
$teaserEscaped = mysqli_real_escape_string($GLOBALS['mysql_con'], $teaser);
|
||||
|
||||
// Überprüfen, ob bereits ein Beitrag mit diesem Titel existiert
|
||||
$checkQuery = "SELECT pv.id
|
||||
FROM knowledgecenter_post_versions pv
|
||||
JOIN knowledgecenter_posts p ON pv.post_id = p.id
|
||||
WHERE pv.language_id = 1 AND pv.title = '$titleEscaped' LIMIT 1";
|
||||
$checkResult = mysqli_query($GLOBALS['mysql_con'], $checkQuery);
|
||||
if ($checkResult && mysqli_num_rows($checkResult) > 0) {
|
||||
echo "Beitrag '$fileTitle' existiert bereits. Überspringe.<br>";
|
||||
continue;
|
||||
}
|
||||
|
||||
// Beitrag erstellen
|
||||
$sql_post = "INSERT INTO knowledgecenter_posts (created_at, modified_at) VALUES (NOW(), NOW())";
|
||||
if (!mysqli_query($GLOBALS['mysql_con'], $sql_post)) {
|
||||
echo "Fehler beim Erstellen des Beitrags für Datei '$fileName': " . mysqli_error($GLOBALS['mysql_con']) . "<br>";
|
||||
continue;
|
||||
}
|
||||
$newPostId = mysqli_insert_id($GLOBALS['mysql_con']);
|
||||
|
||||
// Beitrag-Version anlegen (language_id = 1, Version 1)
|
||||
$sql_post_version = "INSERT INTO knowledgecenter_post_versions
|
||||
(post_id, version_number, language_id, title, teaser, content, author_id, created_at)
|
||||
VALUES ($newPostId, 1, 1, '$titleEscaped', '$teaserEscaped', '', 0, NOW())";
|
||||
if (!mysqli_query($GLOBALS['mysql_con'], $sql_post_version)) {
|
||||
echo "Fehler beim Erstellen der Beitragsversion für Datei '$fileTitle': " . mysqli_error($GLOBALS['mysql_con']) . "<br>";
|
||||
}
|
||||
|
||||
// Beitrag mit der Kategorie verknüpfen
|
||||
$sql_link_post = "INSERT INTO knowledgecenter_category_post (category_id, post_id) VALUES ($categoryId, $newPostId)";
|
||||
if (!mysqli_query($GLOBALS['mysql_con'], $sql_link_post)) {
|
||||
echo "Fehler beim Verknüpfen des Beitrags $newPostId mit Kategorie $categoryId: " . mysqli_error($GLOBALS['mysql_con']) . "<br>";
|
||||
}
|
||||
|
||||
// Eintrag in die Files-Tabelle erstellen
|
||||
// Ermitteln des relativen Pfads relativ zum Document Root:
|
||||
$docRoot = realpath($_SERVER['DOCUMENT_ROOT']);
|
||||
$relativePath = str_replace($docRoot, '', realpath($item));
|
||||
// Als Beschreibung verwenden wir den Dateinamen (inklusive Erweiterung)
|
||||
$descEscaped = mysqli_real_escape_string($GLOBALS['mysql_con'], $fileName);
|
||||
$pathEscaped = mysqli_real_escape_string($GLOBALS['mysql_con'], $relativePath);
|
||||
$sql_file = "INSERT INTO knowledgecenter_post_files (post_id, description, path, created_at)
|
||||
VALUES ($newPostId, '$descEscaped', '$pathEscaped', NOW())";
|
||||
if (!mysqli_query($GLOBALS['mysql_con'], $sql_file)) {
|
||||
echo "Fehler beim Einfügen in die Files-Tabelle für Datei '$fileName': " . mysqli_error($GLOBALS['mysql_con']) . "<br>";
|
||||
}
|
||||
|
||||
echo "Beitrag '$fileTitle' (ID: $newPostId) in Kategorie '$folderName' importiert.<br>";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Unterordner rekursiv verarbeiten
|
||||
$subDirs = glob($folder . "/*", GLOB_ONLYDIR);
|
||||
if ($subDirs !== false) {
|
||||
foreach ($subDirs as $subDir) {
|
||||
import_posts($subDir);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Hauptlogik: Prüfe die GET-Parameter zur Steuerung der Aktionen
|
||||
// Da im Link auch ?action=Import gesetzt ist, können wir dies ignorieren und nur reset, cat_import, post_import prüfen.
|
||||
|
||||
// Reset: Tabellen leeren
|
||||
if (isset($_GET['reset_import']) && $_GET['reset_import'] == "1") {
|
||||
echo "<h1>Reset Import gestartet</h1>";
|
||||
truncate_import_tables();
|
||||
echo "<h1>Reset Import beendet</h1>";
|
||||
exit;
|
||||
}
|
||||
|
||||
// Kategorien importieren: GET-Parameter "cat_import" verwenden
|
||||
if (isset($_GET['cat_import']) && $_GET['cat_import'] == "1") {
|
||||
$importFolder = realpath($_SERVER['DOCUMENT_ROOT'] . '/userdata/knowledgecenter_update');
|
||||
if (!$importFolder) {
|
||||
die("Der Import-Ordner wurde nicht gefunden.");
|
||||
}
|
||||
echo "<h1>Kategorien-Import gestartet</h1>";
|
||||
import_categories($importFolder);
|
||||
echo "<h1>Kategorien-Import beendet</h1>";
|
||||
exit;
|
||||
}
|
||||
|
||||
// Beiträge importieren: GET-Parameter "post_import" verwenden
|
||||
if (isset($_GET['post_import']) && $_GET['post_import'] == "1") {
|
||||
$importFolder = realpath($_SERVER['DOCUMENT_ROOT'] . '/userdata/knowledgecenter_update');
|
||||
if (!$importFolder) {
|
||||
die("Der Import-Ordner wurde nicht gefunden.");
|
||||
}
|
||||
echo "<h1>Beiträge-Import gestartet</h1>";
|
||||
import_posts($importFolder);
|
||||
echo "<h1>Beiträge-Import beendet</h1>";
|
||||
exit;
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user