Files
awo-hamburg-intranet/module/knowledgecenter_update/Import/Import.php

264 lines
12 KiB
PHP
Raw Normal View History

<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;
}
?>