Files
netwatch/app/modules/floors/save.php
2026-02-11 22:30:55 +01:00

166 lines
4.6 KiB
PHP

<?php
/**
* app/modules/floors/save.php
*
* Speichert / aktualisiert ein Stockwerk
*/
// Nur POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Location: ?module=floors&action=list');
exit;
}
// =========================
// Daten einlesen
// =========================
$floorId = (int)($_POST['id'] ?? 0);
$name = trim($_POST['name'] ?? '');
$buildingId = (int)($_POST['building_id'] ?? 0);
$level = isset($_POST['level']) ? (int)$_POST['level'] : null;
$comment = trim($_POST['comment'] ?? '');
$floorSvgContent = trim($_POST['floor_svg_content'] ?? '');
// =========================
// Validierung
// =========================
$errors = [];
if (empty($name)) {
$errors[] = "Name ist erforderlich";
}
if ($buildingId <= 0) {
$errors[] = "Gebäude ist erforderlich";
}
// Falls Fehler: zurück zum Edit-Formular
if (!empty($errors)) {
$_SESSION['error'] = implode(', ', $errors);
$redirectUrl = $floorId ? "?module=floors&action=edit&id=$floorId" : "?module=floors&action=edit";
header("Location: $redirectUrl");
exit;
}
// =========================
// SVG-Upload verarbeiten (optional)
// =========================
$svgPath = null;
if (!empty($_FILES['svg_file']['name'])) {
$file = $_FILES['svg_file'];
$tmpName = $file['tmp_name'];
$originalName = basename($file['name']);
$fileExt = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));
// Nur SVG erlaubt
if ($fileExt !== 'svg') {
$_SESSION['error'] = "Nur SVG-Dateien sind erlaubt";
$redirectUrl = $floorId ? "?module=floors&action=edit&id=$floorId" : "?module=floors&action=edit";
header("Location: $redirectUrl");
exit;
}
// Zielverzeichnis
$uploadDir = __DIR__ . '/../../uploads/floorplans/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0755, true);
}
// Eindeutiger Dateiname
$newFileName = uniqid('floor_') . '.svg';
$destPath = $uploadDir . $newFileName;
if (move_uploaded_file($tmpName, $destPath)) {
$svgPath = 'uploads/floorplans/' . $newFileName;
} else {
$_SESSION['error'] = "Datei-Upload fehlgeschlagen";
$redirectUrl = $floorId ? "?module=floors&action=edit&id=$floorId" : "?module=floors&action=edit";
header("Location: $redirectUrl");
exit;
}
}
if ($floorSvgContent !== '') {
$storedSvgPath = storeSvgEditorContent($sql, $floorId, $floorSvgContent);
if ($storedSvgPath === false) {
$_SESSION['error'] = "SVG aus dem Editor konnte nicht gespeichert werden";
$redirectUrl = $floorId ? "?module=floors&action=edit&id=$floorId" : "?module=floors&action=edit";
header("Location: $redirectUrl");
exit;
}
$svgPath = $storedSvgPath;
}
// =========================
// In DB speichern
// =========================
if ($floorId > 0) {
// UPDATE
if ($svgPath) {
$sql->set(
"UPDATE floors SET name = ?, building_id = ?, level = ?, comment = ?, svg_path = ? WHERE id = ?",
"siissi",
[$name, $buildingId, $level, $comment, $svgPath, $floorId]
);
} else {
$sql->set(
"UPDATE floors SET name = ?, building_id = ?, level = ?, comment = ? WHERE id = ?",
"siiss",
[$name, $buildingId, $level, $comment, $floorId]
);
}
} else {
// INSERT
$sql->set(
"INSERT INTO floors (name, building_id, level, comment, svg_path) VALUES (?, ?, ?, ?, ?)",
"siiss",
[$name, $buildingId, $level, $comment, $svgPath]
);
}
$_SESSION['success'] = "Stockwerk gespeichert";
// =========================
// Redirect
// =========================
header('Location: ?module=floors&action=list');
exit;
function storeSvgEditorContent($sql, $floorId, $content)
{
$normalized = trim($content);
if ($normalized === '' || stripos($normalized, '<svg') === false) {
return false;
}
$relativePath = null;
if ($floorId > 0) {
$existing = $sql->single(
"SELECT svg_path FROM floors WHERE id = ?",
"i",
[$floorId]
);
$candidate = trim((string)($existing['svg_path'] ?? ''));
if ($candidate !== '') {
$relativePath = ltrim($candidate, "/\\");
}
}
if (!$relativePath) {
$relativePath = 'uploads/floorplans/' . uniqid('floor_') . '.svg';
}
$absolutePath = __DIR__ . '/../../' . $relativePath;
$targetDir = dirname($absolutePath);
if (!is_dir($targetDir)) {
mkdir($targetDir, 0755, true);
}
$written = file_put_contents($absolutePath, $normalized);
if ($written === false) {
return false;
}
return $relativePath;
}