diff --git a/includes/admin-teilnehmer.php b/includes/admin-teilnehmer.php index 591cbf8..0ceae29 100644 --- a/includes/admin-teilnehmer.php +++ b/includes/admin-teilnehmer.php @@ -7,6 +7,14 @@ function kc_teilnehmer_page() { $all_wahlen = $wpdb->get_results("SELECT id, name, anzahl_einheiten FROM {$prefix}kc_wahlen WHERE deleted=0 ORDER BY id DESC"); $all_workshops = $wpdb->get_results("SELECT id, name FROM {$prefix}kc_workshops ORDER BY name"); + // Map of wahl id => name for quick lookup + $wahl_name_map = []; + if (!empty($all_wahlen)) { + foreach ($all_wahlen as $w) { + $wahl_name_map[intval($w->id)] = $w->name; + } + } + // Map of workshop id => name for quick lookup in overview $workshops_map = []; if (!empty($all_workshops)) { @@ -15,6 +23,59 @@ function kc_teilnehmer_page() { } } + // CSV-Export (alle Teilnehmer oder gefiltert nach Wahl) + if (isset($_GET['export_csv']) && current_user_can('manage_options')) { + $export_wahl_id = isset($_GET['wahl_id']) ? intval($_GET['wahl_id']) : 0; + + $sql = "SELECT * FROM {$prefix}kc_teilnehmer"; + if ($export_wahl_id > 0) { + $sql .= $wpdb->prepare(" WHERE wahl_id=%d", $export_wahl_id); + } + $sql .= " ORDER BY wahl_id, phase, nachname, vorname"; + $export_rows = $wpdb->get_results($sql); + + $filename_suffix = $export_wahl_id > 0 ? '_wahl_'.$export_wahl_id : '_alle'; + header('Content-Type: text/csv; charset=utf-8'); + header('Content-Disposition: attachment; filename="kc_teilnehmer'.$filename_suffix.'.csv"'); + echo "\xEF\xBB\xBF"; + + $output = fopen('php://output', 'w'); + $delimiter = ';'; + fputcsv($output, ['Vorname','Nachname','Wahl','Phase','Wunsch 1','Wunsch 2','Wunsch 3'], $delimiter); + + foreach ($export_rows as $tn) { + $w1_id = intval($tn->wunsch1); + $w2_id = intval($tn->wunsch2); + $w3_id = intval($tn->wunsch3); + + $w1_disp = $w1_id && isset($workshops_map[$w1_id]) ? $workshops_map[$w1_id] : ($w1_id ? strval($w1_id) : ''); + $w2_disp = $w2_id && isset($workshops_map[$w2_id]) ? $workshops_map[$w2_id] : ($w2_id ? strval($w2_id) : ''); + $w3_disp = $w3_id && isset($workshops_map[$w3_id]) ? $workshops_map[$w3_id] : ($w3_id ? strval($w3_id) : ''); + + $wahl_name = isset($wahl_name_map[intval($tn->wahl_id)]) ? $wahl_name_map[intval($tn->wahl_id)] : ''; + + $vorname = preg_replace('/<[^>]*>/', '', $tn->vorname); + $nachname = preg_replace('/<[^>]*>/', '', $tn->nachname); + $wahl_name_clean = preg_replace('/<[^>]*>/', '', $wahl_name); + $w1_clean = preg_replace('/<[^>]*>/', '', $w1_disp); + $w2_clean = preg_replace('/<[^>]*>/', '', $w2_disp); + $w3_clean = preg_replace('/<[^>]*>/', '', $w3_disp); + + fputcsv($output, [ + $vorname, + $nachname, + $wahl_name_clean, + intval($tn->phase), + $w1_clean, + $w2_clean, + $w3_clean + ], $delimiter); + } + + fclose($output); + exit; + } + // Build map of wahl -> phases + workshops (for JS) $wahl_map = []; foreach($all_wahlen as $w) { @@ -222,13 +283,10 @@ function kc_teilnehmer_page() { } // Übersicht - // Map für Wahl-ID => Name - $wahl_name_map = []; - foreach($all_wahlen as $w) { - $wahl_name_map[intval($w->id)] = $w->name; - } + // Map für Wahl-ID => Name ist bereits oben aufgebaut echo '
'; echo '

Alle Teilnehmer

'; + echo 'CSV Export'; echo '+ Neuer Teilnehmer'; // Wahl-Filter-Buttons sortiert nach KC1, KC2, KC3, dann Rest @@ -271,11 +329,19 @@ function kc_teilnehmer_page() { foreach ($gruppen as $wid => $phasen) { $wahl_disp = isset($wahl_name_map[$wid]) ? esc_html($wahl_name_map[$wid]) : $wid; + $csv_wahl_url = add_query_arg([ + 'page' => 'kc_teilnehmer', + 'export_csv' => 1, + 'wahl_id' => intval($wid) + ], admin_url('admin.php')); // Gesamtanzahl Teilnehmer für diese Wahl berechnen $gesamt = 0; foreach ($phasen as $tns) $gesamt += count($tns); echo '
'; echo ''. $wahl_disp . ' (' . $gesamt . ' TN)'; + echo '
'; + echo 'CSV Export dieser Wahl'; + echo '
'; foreach ($phasen as $phase => $tns) { echo '
'; echo 'Phase '.intval($phase).' ('.count($tns).' TN)';