diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 59e6d65..d6fad97 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -112,27 +112,58 @@ function renderTemplate($template, $vars = []): string ); } -function CSVfromArray($rows,$dateiname) +function exportCSV(array $rows, string $dateiname): void { - $dateiname = bereinigterDateiname($dateiname); - ob_end_clean(); // Wegen UTF-8-Zeichen, die in der ausgabe vorhanden sind - Header("Content-Type: text/x-csv"); - Header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT'); - Header('Content-Disposition: attachment; filename="' . $dateiname . '"'); - Header("Pragma: no-cache"); - - $data = ""; - $trennzeichen = ";"; - $header = ""; - - $header .= implode(';', array_keys($rows[0])); - foreach ($rows as $row) { - $data .= implode(';', $row)."\n"; + if (empty($rows)) { + // Keine Daten → nichts exportieren + return; } - echo $header . "\n" . utf8_decode(trim($data)); + // Dateiname absichern + $dateiname = bereinigterDateiname($dateiname); - die(); + // Output Buffer nur beenden, wenn aktiv + if (ob_get_level() > 0) { + ob_end_clean(); + } + + // CSV-Header für Browser + header('Content-Type: text/csv; charset=UTF-8'); + header('Content-Disposition: attachment; filename="' . $dateiname . '"; filename*=UTF-8\'\'' . rawurlencode($dateiname)); + header('Cache-Control: no-store, no-cache, must-revalidate'); + header('Pragma: no-cache'); + header('Expires: 0'); + + // BOM für Excel + echo "\xEF\xBB\xBF"; + + // Stream öffnen + $out = fopen('php://output', 'w'); + + $delimiter = ';'; + $enclosure = '"'; + $escape = '\\'; + + // Header-Zeile: keys aus erstem Datensatz (Array oder stdClass) + $firstRow = $rows[0] instanceof stdClass ? (array) $rows[0] : $rows[0]; + $header = array_keys($firstRow); + fputcsv($out, $header, $delimiter, $enclosure, $escape); + + // Datenzeilen + foreach ($rows as $row) { + $rowArray = $row instanceof stdClass ? (array) $row : $row; + + // Sicherstellen, dass alle Header-Spalten vorhanden sind + $line = []; + foreach ($header as $key) { + $line[] = $rowArray[$key] ?? ''; + } + + fputcsv($out, $line, $delimiter, $enclosure, $escape); + } + + fclose($out); + exit; } function adminUebersicht(): void @@ -5041,7 +5072,7 @@ function adminEditSpielverlegung(): void $zeile++; } - CSVfromArray($rows,"Spielverlegungen.csv"); + exportCSV($rows,"Spielverlegungen.csv"); } function adminSpielverlegungMailen(): void @@ -12240,41 +12271,8 @@ function adminBegegnungenExportForm(): void } $dateiname .= ".csv"; - $dateiname = bereinigterDateiname($dateiname); - ob_end_clean(); // Wegen UTF-8-Zeichen, die in der ausgabe vorhanden sind - Header("Content-Type: text/x-csv"); - Header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT'); - Header('Content-Disposition: attachment; filename="' . $dateiname . '"'); - Header("Pragma: no-cache"); - - $data = ""; - $trennzeichen = ";"; - $spalte = 0; - $header = ""; - - foreach ($rows[0] as $field => $value) { - if ($spalte != 0) { - $header .= $trennzeichen; - } - $header .= $field; - $spalte++; - } - foreach ($rows as $row) { - $line = ''; - $spalte = 0; - foreach ($row as $value) { - if ($spalte != 0) { - $line .= $trennzeichen; - } - $line .= $value; - $spalte++; - } - $data .= trim($line) . "\n"; - } - - echo $header . "\n" . utf8_decode($data); - - die(); + + exportCSV($rows, $dateiname); } function adminEditTurnier(): void