Geizkragen/wunschliste.php

158 lines
5.4 KiB
PHP

<?php
/**
* @file wunschliste.php
* @brief Darstellung der persönlichen Wunschliste eines Benutzers
*
* @details Diese Datei ist dafür verantwortlich, alle Produkte anzuzeigen,
* die der aktuell eingeloggte Benutzer zu seiner Wunschliste hinzugefügt hat.
* Sie greift auf die Datenbank zu, um die Verknüpfung zwischen Benutzer
* (über die aktuelle Session) und den favorisierten Produkten (aus der Tabelle userFavorites)
* herzustellen.
* @author Geizkragen-Team
* @version 1.0
* @since 1.0
*/
// wunschliste.php
/**
* @brief Einbinden der grundlegenden Bootstrapping-Konfiguration
* @details Die Datei bootstrap.php lädt Helferfunktionen, Konfigurationsdaten
* und initialisiert die Session, wodurch Zugriffe auf $_SESSION möglich werden.
*/
require_once __DIR__ . '/lib/bootstrap.php';
/**
* @brief Herstellen der Datenbankverbindung
* @details Ruft db_connect() auf, um eine Instanz zur Datenbank aufzubauen.
* Diese wird für das spätere Abrufen der Wunschlisten-Elemente benötigt.
* @var mysqli $conn Aktives Datenbankverbindungsobjekt.
*/
// 1) DB-Verbindung (einmal)
$conn = db_connect();
/**
* @brief Einschränkung des Datenzugriffs und Weiterleitung unbefugter Benutzer
* @details Prüft, ob ein Benutzer aktuell eingeloggt ist. Die Weiterleitung
* (HTTP-Header Location) muss zwingend erfolgen, bevor jegliche HTML-Struktur
* gerendert wurde. Danach beendet exit() sofort die Ausführung dieses Skripts.
*/
// Login-Check + Redirect MUSS vor jeglicher HTML-Ausgabe passieren
if (!isset($_SESSION['user_id'])) {
header("Location: login.php");
exit();
}
/**
* @brief Laden der Wunschlisten-Daten aus der Datenbank
* @details Ein "Prepared Statement" wird aufgebaut, um die Produktdaten (ID, Modell,
* Beschreibung, Bildpfad) sicher aus der Datenbank abzufragen. Hierbei werden die
* Tabellen 'userFavorites' und 'products' per INNER JOIN anhand der productID zusammengeführt.
* @var mysqli_stmt $stmt Das vorbereitete SQL-Statement Objekt.
*/
// Daten laden
$stmt = $conn->prepare("
SELECT products.productID, products.model, products.description, products.imagePath
FROM userFavorites INNER JOIN products ON userFavorites.productID = products.productID
WHERE userID = ?
");
/**
* @brief Binden der Nutzer-ID an das SQL-Statement
* @details Verbindet den Typ 'i' (Integer) mit dem tatsächlichen Wert der aktuellen Session-ID.
*/
$stmt->bind_param("i", $_SESSION['user_id']);
/**
* @brief Ausführung der vorbereiteten Abfrage
*/
$stmt->execute();
/**
* @brief Extrahieren der Ergebnismenge
* @details Speichert das Resulat der Abfrage, welches in der GUI anschließend durchlaufen wird.
* @var mysqli_result $result Die vom Datenbankserver zurückgelieferte Ergebnismenge.
*/
$result = $stmt->get_result();
?>
<?php
/**
* @brief Einbinden des HTML-Headers
* @details Lädt die globale Navigation, CSS-Dateien und nötige Meta-Informationen.
*/
include 'header.php';
?>
<?php
/**
* @brief Bedingung zur Anzeige der Produktliste
* @details Evaluiert, ob das vorherige Statement mindestens ein favorisiertes
* Produkt für den Benutzer zurückgeliefert hat. Ist dies der Fall, wird die
* Liste gerendert. Andernfalls erscheint ein leerer Hinweisbildschirm.
*/
if ($result->num_rows > 0):
?>
<main>
<section class="product-section">
<h2>Deine Wunschliste</h2>
<div class="wishlist-grid">
<?php
/**
* @brief Iteration über alle favorisierten Produkte
* @details In jedem Durchlauf wird ein Produkt als assoziatives Array
* zurückgegeben und direkt per HTML im Frontend abgebildet.
*/
while ($product = $result->fetch_assoc()):
?>
<?php
/**
* @brief Casting der Produkt ID
* @var int $productId Stellt sicher, dass die Produkt-ID als strenger Integer
* zur Erzeugung der Link-URL vorliegt.
*/
$productId = (int)$product['productID'];
?>
<a class="product-card wishlist-card" href="productpage.php?id=<?= $productId ?>">
<img
src="<?= isset($product['imagePath']) ? $product['imagePath'] : 'assets/images/placeholder.png' ?>"
alt="<?= htmlspecialchars($product['model']) ?>">
<div class="product-card__content">
<h3><?= htmlspecialchars($product['model']) ?></h3>
<p><?= htmlspecialchars($product['description']) ?></p>
</div>
</a>
<?php endwhile; ?>
</div>
</section>
</main>
<?php else: ?>
<?php
/**
* @brief Fallback Ansicht
* @details Dieser Abschnitt wird angezeigt, wenn der Nutzer noch
* keine Artikel als Favoriten markiert hat.
*/
?>
<main style="padding: 2rem 1rem; text-align: center; animation: fadeInUp 0.5s ease both;">
<p style="color: var(--text-secondary); font-size: 1rem;">Deine Wunschliste ist noch leer.</p>
</main>
<?php endif; ?>
<?php
/**
* @brief Freigabe der SQL-Ressourcen
* @details Schließt das PreparedStatement sicher und räumt belegten Speicher wieder auf.
*/
$stmt->close();
?>
<?php
/**
* @brief Einbinden des HTML-Footers
* @details Rendert rechtliche Links sowie abschließende Skripte für die Seite.
*/
include 'footer.php';
?>