20, 'ipad' => 21, 'macbook' => 22, 'airpods' => 23, 'accessories' => 24, ]; // Überprüfen, ob die gewählte Kategorie im Konfigurations-Array vorhanden ist. if (isset($categoriesConfig[$currentCategory])) { // Falls vorhanden, wird die entsprechende Kategorie-ID für weitere Abfragen gesetzt. $catId = $categoriesConfig[$currentCategory]; } /** * @var array $attributes * @brief Speichert die verfügbaren Attribute (z.B. Farbe, Speichergröße) für die selektierte Kategorie. */ $attributes = []; // Attribute nur laden, wenn eine gültige Kategorie-ID gefunden wurde. if ($catId) { /** * @details Holt alle Attribute, die mit der aktiven Kategorie verknüpft sind, * sortiert nach ihrem Namen, um eine geordnete Filterliste anzuzeigen. */ $stmtAttr = $conn->prepare(" SELECT a.attributeID, a.name, a.unit, a.dataType FROM attributes a JOIN categoryAttributes ca ON a.attributeID = ca.attributeID WHERE ca.categoryID = ? ORDER BY a.name "); $stmtAttr->bind_param("i", $catId); $stmtAttr->execute(); $resAttr = $stmtAttr->get_result(); // Iteriere über das Result-Set und speichere jedes gefundene Attribut im $attributes-Array. while ($row = $resAttr->fetch_assoc()) { $attributes[] = $row; } // Statement schließen, um Ressourcen freizugeben. $stmtAttr->close(); } ?>
prepare(" SELECT DISTINCT pa.valueString, pa.valueNumber, pa.valueBool FROM productAttributes pa JOIN products p ON pa.productID = p.productID WHERE p.categoryID = ? AND pa.attributeID = ? "); $vStmt->bind_param("ii", $catId, $attrId); } else { // Alternative Abfrage (wird in diesem Skriptteil zwar aktuell nur bei $catId aufgerufen, // aber dient als Fallback für zukünftige globale Filter). $vStmt = $conn->prepare(" SELECT DISTINCT valueString, valueNumber, valueBool FROM productAttributes WHERE attributeID = ? "); $vStmt->bind_param("i", $attrId); } $vStmt->execute(); $vRes = $vStmt->get_result(); /** * @var array $values * @brief Speichert die extrahierten eindeutigen Werte (bereinigt und formatiert) für die Select-Box. */ $values = []; // Durchlaufe alle gefundenen Attributwerte für die aktuellen Produkte while ($vRow = $vRes->fetch_assoc()) { // Werte je nach Datentyp (Boolean, Number, String) extrahieren if ($attr['dataType'] === 'boolean' || $vRow['valueBool'] !== null) { $val = $vRow['valueBool'] ? 'Ja' : 'Nein'; // Duplikate vermeiden if (!in_array($val, $values)) $values[] = $val; } elseif ($attr['dataType'] === 'number' || $vRow['valueNumber'] !== null) { $val = $vRow['valueNumber']; // Entfernt überflüssige Nullen nach dem Komma (z.B. wird 5.00 zu 5) $val = rtrim(rtrim((string)$val, '0'), '.'); if (!in_array($val, $values)) $values[] = $val; } elseif ($vRow['valueString'] !== null) { $val = $vRow['valueString']; if (!in_array($val, $values)) $values[] = $val; } } $vStmt->close(); /** * @details Sortiert die gesammelten Werte. * Zahlen werden numerisch sortiert (damit z.B. 10 nach 2 kommt), * Strings werden alphabetisch sortiert. */ if ($attr['dataType'] === 'number') { usort($values, function($a, $b) { return (float)$a <=> (float)$b; }); } else { sort($values); } // Wenn es keine Werte für das Filterfeld gibt, überspringe dieses Attribut. if (empty($values)) continue; /** @var string $paramName Der Name des GET-Parameters im Formular (z.B. attr_1) */ $paramName = "attr_" . $attrId; /** @var string $selectedValue Der aktuell ausgewählte Wert aus dem GET-Parameter, falls gesetzt */ $selectedValue = isset($_GET[$paramName]) ? $_GET[$paramName] : ''; ?>
$v) { // Wenn der GET-Key mit "attr_" beginnt und ein Wert gesetzt ist if (strpos($k, 'attr_') === 0 && $v !== '') { $hasActiveFilter = true; break; // Sobald ein Filter gefunden ist, kann die Schleife abgebrochen werden } } // Zeige den "Filter zurücksetzen"-Button nur an, wenn wirklich Filter aktiv sind. if ($hasActiveFilter): ?>