true, 'filename' => null]; } $file = $_FILES[$fileInputName]; if ($file['error'] !== UPLOAD_ERR_OK) { return ['success' => false, 'message' => 'Upload fehlgeschlagen. Bitte erneut versuchen.']; } $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. Erlaubt: JPG, PNG, WEBP, GIF.']; } $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 hochgeladene Datei ist kein gültiges Bild.']; } $imagesDir = __DIR__ . '/../assets/images'; if (!is_dir($imagesDir)) { mkdir($imagesDir, 0755, true); } $safeBaseName = preg_replace('/[^a-zA-Z0-9_-]/', '-', pathinfo($originalName, PATHINFO_FILENAME)); $safeBaseName = trim($safeBaseName, '-'); if ($safeBaseName === '') { $safeBaseName = 'bild'; } $targetFilename = $safeBaseName . '.' . $extension; $targetPath = $imagesDir . '/' . $targetFilename; $counter = 1; while (file_exists($targetPath)) { $targetFilename = $safeBaseName . '-' . $counter . '.' . $extension; $targetPath = $imagesDir . '/' . $targetFilename; $counter++; } if (!move_uploaded_file($file['tmp_name'], $targetPath)) { return ['success' => false, 'message' => 'Bild konnte nicht gespeichert werden.']; } return ['success' => true, 'filename' => $targetFilename]; } // Handle product operations if ($_SERVER['REQUEST_METHOD'] === 'POST') { $products = getProducts(); if (isset($_POST['add_product'])) { $uploadResult = handleImageUpload(); if (!$uploadResult['success']) { $message = $uploadResult['message']; $messageType = 'error'; } else { // Generate new ID $newId = 1; if (!empty($products)) { $ids = array_column($products, 'id'); $newId = max($ids) + 1; } $newProduct = [ 'id' => $newId, 'name' => sanitize($_POST['name']), 'description' => sanitize($_POST['description']), 'price' => (float)$_POST['price'], 'category' => sanitize($_POST['category']), 'image' => $uploadResult['filename'] !== null ? $uploadResult['filename'] : sanitize($_POST['image']) ]; // Handle stock - per size for apparel, general for merch if ($newProduct['category'] === 'apparel' && !empty($_POST['sizes'])) { $sizes = sanitize($_POST['sizes']); $newProduct['sizes'] = $sizes; // Store as comma-separated string // Initialize stock_by_size $sizeArray = array_map('trim', explode(',', $sizes)); $newProduct['stock_by_size'] = []; foreach ($sizeArray as $size) { $stockKey = 'stock_' . str_replace([' ', ','], '_', $size); $newProduct['stock_by_size'][$size] = isset($_POST[$stockKey]) ? (int)$_POST[$stockKey] : 0; } } else { $newProduct['stock'] = (int)$_POST['stock']; } $products[] = $newProduct; saveProducts($products); $message = 'Produkt erfolgreich hinzugefügt.'; $messageType = 'success'; } } if (isset($_POST['update_product'])) { $uploadResult = handleImageUpload(); if (!$uploadResult['success']) { $message = $uploadResult['message']; $messageType = 'error'; } else { $productId = (int)$_POST['product_id']; foreach ($products as &$product) { if ($product['id'] == $productId) { $product['name'] = sanitize($_POST['name']); $product['description'] = sanitize($_POST['description']); $product['price'] = (float)$_POST['price']; $product['category'] = sanitize($_POST['category']); $product['image'] = $uploadResult['filename'] !== null ? $uploadResult['filename'] : sanitize($_POST['image']); // Update stock - per size for apparel, general for merch if ($product['category'] === 'apparel') { if (!empty($_POST['sizes'])) { $product['sizes'] = sanitize($_POST['sizes']); // Update stock_by_size $sizeArray = array_map('trim', explode(',', $product['sizes'])); if (!isset($product['stock_by_size']) || !is_array($product['stock_by_size'])) { $product['stock_by_size'] = []; } foreach ($sizeArray as $size) { $stockKey = 'stock_' . str_replace([' ', ','], '_', $size); $product['stock_by_size'][$size] = isset($_POST[$stockKey]) ? (int)$_POST[$stockKey] : (isset($product['stock_by_size'][$size]) ? $product['stock_by_size'][$size] : 0); } // Remove sizes that are no longer in the list $product['stock_by_size'] = array_intersect_key($product['stock_by_size'], array_flip($sizeArray)); unset($product['stock']); // Remove general stock for apparel } else { unset($product['sizes']); unset($product['stock_by_size']); } } else { $product['stock'] = (int)$_POST['stock']; unset($product['sizes']); unset($product['stock_by_size']); } break; } } saveProducts($products); $message = 'Produkt erfolgreich aktualisiert.'; $messageType = 'success'; } } if (isset($_POST['delete_product'])) { $productId = (int)$_POST['product_id']; $products = array_filter($products, function($product) use ($productId) { return $product['id'] != $productId; }); $products = array_values($products); // Re-index saveProducts($products); $message = 'Produkt erfolgreich gelöscht.'; $messageType = 'success'; } } $products = getProducts(); $editingProduct = null; if (isset($_GET['edit'])) { $editingProduct = getProductById((int)$_GET['edit']); } $bodyClass = 'admin-page'; include __DIR__ . '/../includes/header.php'; ?>

Produkte verwalten

Zurück zum Dashboard

Produkt bearbeiten

Upload nach assets/images; ersetzt den Dateinamen oben automatisch.
Abbrechen

Neues Produkt hinzufügen

Upload nach assets/images; Dateiname wird automatisch übernommen.

Alle Produkte

Keine Produkte vorhanden.

ID Name Kategorie Preis Lagerbestand Aktionen
$stock) { $stockInfo[] = "$size: $stock"; } echo implode(', ', $stockInfo) ?: '0'; } else { echo isset($product['stock']) ? (int)$product['stock'] : 0; } ?> Bearbeiten