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') { $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; saveProducts($products); $message = 'Produkt wurde angelegt.'; $messageType = 'success'; } else { $updated = false; foreach ($products as &$product) { if ((int) $product['id'] === $productId) { $record['id'] = $productId; $product = $record; $updated = true; break; } } unset($product); if ($updated) { saveProducts($products); $message = 'Produkt wurde aktualisiert.'; $messageType = 'success'; } else { $message = 'Produkt nicht gefunden.'; $messageType = 'error'; } } } } } if (isset($_POST['delete_product'])) { $productId = (int) ($_POST['product_id'] ?? 0); $products = array_values(array_filter($products, function ($product) use ($productId) { return (int) $product['id'] !== $productId; })); saveProducts($products); $message = 'Produkt wurde gelöscht.'; $messageType = 'success'; } } $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)); ?> | Bearbeiten |