true, "filename" => null]; } $file = $_FILES[$fileInputName]; if ($file["error"] !== UPLOAD_ERR_OK) { return ["success" => false, "message" => "Upload fehlgeschlagen."]; } $allowedExtensions = ["jpg", "jpeg", "png", "webp", "gif"]; $originalName = basename($file["name"]); $extension = strtolower(pathinfo($originalName, PATHINFO_EXTENSION)); if (!in_array($extension, $allowedExtensions, true)) { return ["success" => false, "message" => "Ungültiger Dateityp."]; } $finfo = new finfo(FILEINFO_MIME_TYPE); $mimeType = $finfo->file($file["tmp_name"]); $allowedMimes = ["image/jpeg", "image/png", "image/webp", "image/gif"]; if (!in_array($mimeType, $allowedMimes, true)) { return [ "success" => false, "message" => "Die Datei ist kein gültiges Bild.", ]; } $uploadsDir = rtrim(UPLOADS_DIR, "/\\"); if ( !is_dir($uploadsDir) && !mkdir($uploadsDir, 02775, true) && !is_dir($uploadsDir) ) { return [ "success" => false, "message" => "Upload-Verzeichnis konnte nicht erstellt werden.", ]; } if (is_dir($uploadsDir)) { @chmod($uploadsDir, 02775); } if (!is_writable($uploadsDir)) { return [ "success" => false, "message" => "Upload-Verzeichnis ist nicht beschreibbar: " . $uploadsDir, ]; } $safeBaseName = preg_replace( "/[^a-zA-Z0-9_-]/", "-", pathinfo($originalName, PATHINFO_FILENAME), ); $safeBaseName = trim((string) $safeBaseName, "-"); if ($safeBaseName === "") { $safeBaseName = "bild"; } $targetFilename = $safeBaseName . "." . $extension; $targetPath = $uploadsDir . "/" . $targetFilename; $counter = 1; while (file_exists($targetPath)) { $targetFilename = $safeBaseName . "-" . $counter . "." . $extension; $targetPath = $uploadsDir . "/" . $targetFilename; $counter++; } if (!move_uploaded_file($file["tmp_name"], $targetPath)) { return [ "success" => false, "message" => "Bild konnte nicht gespeichert werden.", ]; } return ["success" => true, "filename" => $targetFilename]; } function buildProductAvailabilityFields( $sizesInput, $submittedValues = [], $existingValues = [], ) { $sizes = getProductSizes(["sizes" => (string) $sizesInput]); if (empty($sizes)) { $sizes = ["Standard"]; } $availabilityLabels = []; foreach ($sizes as $size) { $fieldName = "availability_" . str_replace([" ", ","], "_", $size); if (isset($submittedValues[$fieldName])) { $availabilityLabels[$size] = trim( (string) $submittedValues[$fieldName], ); } else { $availabilityLabels[$size] = trim( (string) ($existingValues[$size] ?? ""), ); } } return [ "sizes" => implode(",", $sizes), "availability_labels" => $availabilityLabels, ]; } function getSubmittedProductCategoryIds($submittedValues) { $selectedCategoryIds = normalizeProductCategoryIds( $submittedValues["categories"] ?? [], ); $validCategoryIds = []; foreach ($selectedCategoryIds as $categoryId) { if (getCategoryById($categoryId) !== null) { $validCategoryIds[] = $categoryId; } } return $validCategoryIds; } if ($_SERVER["REQUEST_METHOD"] === "POST") { // Validate CSRF token if (!validateCsrfToken($_POST["csrf_token"] ?? "")) { $message = "Ungültiges Token. Bitte versuchen Sie es erneut."; $messageType = "error"; } else { $products = getProducts(); if (empty($categories)) { $message = "Bitte zuerst mindestens eine Kategorie anlegen."; $messageType = "error"; } elseif ( isset($_POST["add_product"]) || isset($_POST["update_product"]) ) { $uploadResult = handleImageUpload(); if (!$uploadResult["success"]) { $message = $uploadResult["message"]; $messageType = "error"; } else { $categoryIds = getSubmittedProductCategoryIds($_POST); $existingLabels = []; $productId = isset($_POST["product_id"]) ? (int) $_POST["product_id"] : 0; foreach ($products as $product) { if ((int) $product["id"] === $productId) { $existingLabels = $product["availability_labels"] ?? []; break; } } $sizeData = buildProductAvailabilityFields( $_POST["sizes"] ?? "", $_POST, $existingLabels, ); if (empty($categoryIds)) { $message = "Bitte mindestens eine gültige Kategorie auswählen."; $messageType = "error"; } else { $record = [ "name" => sanitize($_POST["name"] ?? ""), "description" => trim( (string) ($_POST["description"] ?? ""), ), "categories" => $categoryIds, "image" => $uploadResult["filename"] !== null ? $uploadResult["filename"] : trim((string) ($_POST["image"] ?? "")), "sizes" => $sizeData["sizes"], "availability_labels" => $sizeData["availability_labels"], ]; if ($record["name"] === "") { $message = "Bitte einen Produktnamen eingeben."; $messageType = "error"; } elseif (isset($_POST["add_product"])) { $newId = empty($products) ? 1 : max( array_map(function ($product) { return (int) $product["id"]; }, $products), ) + 1; $record["id"] = $newId; $products[] = $record; if (saveProducts($products)) { logAccess("Admin added product", [ "product_id" => $newId, "product_name" => $record["name"], ]); $message = "Produkt wurde angelegt."; $messageType = "success"; } else { $message = "Produkt konnte nicht gespeichert werden."; $messageType = "error"; } } else { $updated = false; foreach ($products as &$product) { if ((int) $product["id"] === $productId) { $record["id"] = $productId; $product = $record; $updated = true; break; } } unset($product); if ($updated) { if (saveProducts($products)) { logAccess("Admin updated product", [ "product_id" => $productId, "product_name" => $record["name"], ]); $message = "Produkt wurde aktualisiert."; $messageType = "success"; } else { $message = "Produkt konnte nicht gespeichert werden."; $messageType = "error"; } } else { $message = "Produkt nicht gefunden."; $messageType = "error"; } } } } } if (isset($_POST["delete_product"])) { $productId = (int) ($_POST["product_id"] ?? 0); $productName = ""; foreach ($products as $product) { if ((int) $product["id"] === $productId) { $productName = $product["name"]; break; } } $products = array_values( array_filter($products, function ($product) use ($productId) { return (int) $product["id"] !== $productId; }), ); if (saveProducts($products)) { logAccess("Admin deleted product", [ "product_id" => $productId, "product_name" => $productName, ]); $message = "Produkt wurde gelöscht."; $messageType = "success"; } else { $message = "Produkt konnte nicht gelöscht werden."; $messageType = "error"; } } } } $products = getProducts(); $editingProduct = isset($_GET["edit"]) ? getProductById((int) $_GET["edit"]) : null; $bodyClass = "admin-page"; include __DIR__ . "/../includes/header.php"; ?>
Keine Produkte vorhanden.
| ID | Name | Kategorien | Größen | Lieferhinweise | Aktionen |
|---|---|---|---|---|---|
| $label ) { if (trim((string) $label) !== "") { $labels[] = $size . ": " . $label; } } echo empty($labels) ? "Keine" : escape(implode(" | ", $labels)); ?> | " class="btn btn-small">Bearbeiten |