'; echo '

Zugriff verweigert

'; echo '

Du hast keine Berechtigung, Shops hinzuzufügen.

'; echo '
'; include 'footer.php'; exit; } /** * @brief Datenbankverbindung herstellen * @var mysqli $conn Die aktive Datenbankverbindung */ $conn = db_connect(); /** * @var string $message Speichert Erfolgs- oder Fehlermeldungen für den Benutzer * @var string $messageType Definiert den Typ der Nachricht ('success' oder 'error') */ $message = ''; $messageType = ''; /** * @brief Verarbeitung von POST-Anfragen (Formular-Übermittlungen) * * Prüft, ob ein Formular abgesendet wurde und welche Aktion ('add_shop' oder 'delete_shop') * ausgeführt werden soll. */ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) { if ($_POST['action'] === 'add_shop') { /** * @brief Extrahieren der Formulardaten für einen neuen Shop */ $name = trim($_POST['name']); $website = trim($_POST['website']); $shippingTime = trim($_POST['shipping_time']); $logoPath = null; /** * @brief Verarbeitung des Logo-Uploads * * Prüft zunächst, ob eine Datei hochgeladen wurde und kein Fehler aufgetreten ist. */ // Handle logo upload if (isset($_FILES['logo']) && $_FILES['logo']['error'] === UPLOAD_ERR_OK) { /** * @brief Validierung des MIME-Types der hochgeladenen Datei */ $allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']; $fileInfo = finfo_open(FILEINFO_MIME_TYPE); $mimeType = finfo_file($fileInfo, $_FILES['logo']['tmp_name']); finfo_close($fileInfo); if (in_array($mimeType, $allowedTypes)) { /** * @brief Verzeichnisstruktur für Logos sicherstellen */ $uploadDir = __DIR__ . '/assets/images/shopLogo/'; if (!is_dir($uploadDir)) { mkdir($uploadDir, 0777, true); } /** * @brief Generierung eines eindeutigen Dateinamens */ $extension = pathinfo($_FILES['logo']['name'], PATHINFO_EXTENSION); $fileName = preg_replace('/[^a-zA-Z0-9_-]/', '_', $name) . '_' . time() . '.' . $extension; $targetFile = $uploadDir . $fileName; /** * @brief Speichern der hochgeladenen Datei */ if (move_uploaded_file($_FILES['logo']['tmp_name'], $targetFile)) { $logoPath = 'assets/images/shopLogo/' . $fileName; } else { $message = 'Fehler beim Hochladen des Logos.'; $messageType = 'error'; } } else { $message = 'Ungültiges Dateiformat für das Logo. Erlaubt sind JPG, PNG, GIF und WEBP.'; $messageType = 'error'; } } elseif (isset($_POST['logo_url']) && trim($_POST['logo_url']) !== '') { /** * @brief Fallback auf eine angegebene Bild-URL, falls keine Datei hochgeladen wurde */ $logoPath = trim($_POST['logo_url']); } /** * @brief Speichern des neuen Shops in der Datenbank * * Wenn keine Fehler aufgetreten sind und ein Name angegeben wurde, * wird der Shop über ein Prepared Statement in die Datenbank eingefügt. */ if (empty($message) && $name !== '') { $stmt = $conn->prepare("INSERT INTO shops (name, website, logoPath, shippingTime) VALUES (?, ?, ?, ?)"); $stmt->bind_param("ssss", $name, $website, $logoPath, $shippingTime); if ($stmt->execute()) { $message = 'Shop erfolgreich hinzugefügt!'; $messageType = 'success'; } else { $message = 'Fehler beim Hinzufügen des Shops.'; $messageType = 'error'; } $stmt->close(); } elseif (empty($message)) { $message = 'Bitte mindestens den Shop-Namen angeben.'; $messageType = 'error'; } } elseif ($_POST['action'] === 'delete_shop') { /** * @brief Löschen eines bestehenden Shops */ $shopID = (int)$_POST['shop_id']; if ($shopID > 0) { /** * @brief Überprüfung auf verknüpfte Angebote * * Bevor ein Shop gelöscht wird, muss sichergestellt werden, dass * keine Angebote (Offers) mehr mit diesem verknüpft sind, um die * referenzielle Integrität zu wahren. */ // First check if the shop has associated offers $checkStmt = $conn->prepare("SELECT COUNT(*) AS offerCount FROM offers WHERE shopID = ?"); $checkStmt->bind_param("i", $shopID); $checkStmt->execute(); $result = $checkStmt->get_result(); $row = $result->fetch_assoc(); $offerCount = (int)$row['offerCount']; $checkStmt->close(); if ($offerCount > 0) { /** * @brief Löschen verhindern, wenn Angebote existieren */ $message = "Der Shop kann nicht gelöscht werden, da er noch $offerCount verknüpfte Angebote hat."; $messageType = 'error'; } else { /** * @brief Führt das Löschen des Shops aus der Datenbank durch */ $stmt = $conn->prepare("DELETE FROM shops WHERE shopID = ?"); $stmt->bind_param("i", $shopID); if ($stmt->execute()) { $message = 'Shop erfolgreich gelöscht!'; $messageType = 'success'; } else { $message = 'Fehler beim Löschen des Shops.'; $messageType = 'error'; } $stmt->close(); } } } } /** * @brief Abrufen aller bestehenden Shops zur Verwaltung * * Es wird eine Liste aller Shops inklusive der Anzahl ihrer zugeordneten Angebote * (über einen LEFT JOIN mit der Tabelle offers) abgerufen, um diese in der Tabelle * im Frontend anzuzeigen. */ // Get existing shops to manage $shopsResult = $conn->query(" SELECT s.shopID, s.name, s.website, s.logoPath, s.shippingTime, COUNT(o.offerID) AS offerCount FROM shops s LEFT JOIN offers o ON s.shopID = o.shopID GROUP BY s.shopID, s.name, s.website, s.logoPath, s.shippingTime ORDER BY s.name ASC "); /** * @var array $existingShops Speichert die aus der Datenbank abgerufenen Shops */ $existingShops = []; if ($shopsResult) { while ($row = $shopsResult->fetch_assoc()) { $existingShops[] = $row; } } /** * @brief Einbinden des globalen Headers */ include 'header.php'; ?>

Shop verwalten

- ODER -

Bestehende Shops verwalten

0): ?>
Logo Name Website Angebote Aktion
Logo Kein Logo Link ↗ 0): ?>

Keine Shops vorhanden.