'device', 'device_ports' => 'device', 'module' => 'module', 'module_ports' => 'module', 'outlet' => 'outlet', 'network_outlet_ports' => 'outlet', 'patchpanel' => 'patchpanel', 'floor_patchpanel' => 'patchpanel', 'floor_patchpanel_ports' => 'patchpanel', ]; $key = strtolower(trim($value)); return $map[$key] ?? $key; }; $portAType = $normalizePortType((string)$portAType); $portBType = $normalizePortType((string)$portBType); $isTopologyPairAllowed = static function (string $typeA, string $typeB): bool { $allowed = ['device' => true, 'module' => true, 'outlet' => true, 'patchpanel' => true]; if (!isset($allowed[$typeA]) || !isset($allowed[$typeB])) { return false; } if ($typeA === 'patchpanel' || $typeB === 'patchpanel') { return ($typeA === 'patchpanel' && in_array($typeB, ['patchpanel', 'outlet'], true)) || ($typeB === 'patchpanel' && in_array($typeA, ['patchpanel', 'outlet'], true)); } return true; }; // ========================= // Validierung (einfach) // ========================= $errors = []; if ($portAId <= 0 || $portBId <= 0) { $errors[] = "Beide Ports sind erforderlich"; } if (!$isTopologyPairAllowed($portAType, $portBType)) { $errors[] = "Patchpanel-Ports duerfen nur mit Patchpanel-Ports oder Netzwerkdosen-Ports verbunden werden"; } $otherConnections = $sql->get( "SELECT id, port_a_type, port_a_id, port_b_type, port_b_id FROM connections WHERE id <> ?", "i", [$connId] ); $isEndpointUsed = static function (string $endpointType, int $endpointId) use ($otherConnections, $normalizePortType): bool { if ($endpointId <= 0) { return false; } foreach ((array)$otherConnections as $row) { $typeA = $normalizePortType((string)($row['port_a_type'] ?? '')); $idA = (int)($row['port_a_id'] ?? 0); if ($typeA === $endpointType && $idA === $endpointId) { return true; } $typeB = $normalizePortType((string)($row['port_b_type'] ?? '')); $idB = (int)($row['port_b_id'] ?? 0); if ($typeB === $endpointType && $idB === $endpointId) { return true; } } return false; }; if ($isEndpointUsed($portAType, $portAId)) { $errors[] = "Port an Endpunkt A ist bereits in Verwendung"; } if ($isEndpointUsed($portBType, $portBId)) { $errors[] = "Port an Endpunkt B ist bereits in Verwendung"; } if (!empty($errors)) { $_SESSION['error'] = implode(', ', $errors); $_SESSION['validation_errors'] = $errors; $redirectUrl = $connId ? "?module=connections&action=edit&id=$connId" : "?module=connections&action=edit"; header("Location: $redirectUrl"); exit; } // ========================= // In DB speichern // ========================= $vlanJson = $vlanConfig ? json_encode(explode(',', $vlanConfig)) : null; if ($connId > 0) { // UPDATE $sql->set( "UPDATE connections SET port_a_type = ?, port_a_id = ?, port_b_type = ?, port_b_id = ?, vlan_config = ?, comment = ? WHERE id = ?", "sisissi", [$portAType, $portAId, $portBType, $portBId, $vlanJson, $comment, $connId] ); } else { $connectionTypeId = (int)($sql->single( "SELECT id FROM connection_types ORDER BY id LIMIT 1", "", [] )['id'] ?? 0); if ($connectionTypeId <= 0) { $connectionTypeId = (int)$sql->set( "INSERT INTO connection_types (name, medium, duplex, line_style, comment) VALUES (?, ?, ?, ?, ?)", "sssss", ['Default', 'copper', 'custom', 'solid', 'Auto-created by connections/save'], true ); } if ($connectionTypeId <= 0) { $_SESSION['error'] = "Kein Verbindungstyp verfuegbar"; $_SESSION['validation_errors'] = ["Kein Verbindungstyp verfuegbar"]; header("Location: ?module=connections&action=edit"); exit; } // INSERT $sql->set( "INSERT INTO connections (connection_type_id, port_a_type, port_a_id, port_b_type, port_b_id, vlan_config, comment) VALUES (?, ?, ?, ?, ?, ?, ?)", "isisiss", [$connectionTypeId, $portAType, $portAId, $portBType, $portBId, $vlanJson, $comment] ); } $_SESSION['success'] = "Verbindung gespeichert"; // ========================= // Redirect // ========================= header('Location: ?module=connections&action=list'); exit;