Files
awo-hamburg-intranet/module/knowledgecenter_update/Import/Import.php
Moritz Weinmann 743476f64a 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>
2026-06-22 09:20:02 +02:00

264 lines
12 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<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;
}
?>