264 lines
12 KiB
PHP
264 lines
12 KiB
PHP
|
|
|
|||
|
|
<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;
|
|||
|
|
}
|
|||
|
|
?>
|