Create CSV export for Teilnehmr
All checks were successful
Deploy Workshop-Wahlen (DEV / PROD) / deploy (push) Successful in 14s

This commit is contained in:
ProgrammGamer
2026-02-25 17:57:58 +01:00
parent 688889251d
commit c91ff4be78

View File

@@ -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_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"); $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 // Map of workshop id => name for quick lookup in overview
$workshops_map = []; $workshops_map = [];
if (!empty($all_workshops)) { 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) // Build map of wahl -> phases + workshops (for JS)
$wahl_map = []; $wahl_map = [];
foreach($all_wahlen as $w) { foreach($all_wahlen as $w) {
@@ -222,13 +283,10 @@ function kc_teilnehmer_page() {
} }
// Übersicht // Übersicht
// Map für Wahl-ID => Name // Map für Wahl-ID => Name ist bereits oben aufgebaut
$wahl_name_map = [];
foreach($all_wahlen as $w) {
$wahl_name_map[intval($w->id)] = $w->name;
}
echo '<div class="kc-admin-table-wrap">'; echo '<div class="kc-admin-table-wrap">';
echo '<h2 style="margin-top:0;">Alle Teilnehmer</h2>'; echo '<h2 style="margin-top:0;">Alle Teilnehmer</h2>';
echo '<a class="kc-btn" style="float:right;margin-right:8px;margin-bottom:12px;background:#2da66a;color:#fff;" href="?page=kc_teilnehmer&export_csv=1">CSV Export</a>';
echo '<a class="kc-btn" style="float:right;margin-bottom:12px;" href="?page=kc_teilnehmer&new=1">+ Neuer Teilnehmer</a>'; echo '<a class="kc-btn" style="float:right;margin-bottom:12px;" href="?page=kc_teilnehmer&new=1">+ Neuer Teilnehmer</a>';
// Wahl-Filter-Buttons sortiert nach KC1, KC2, KC3, dann Rest // Wahl-Filter-Buttons sortiert nach KC1, KC2, KC3, dann Rest
@@ -271,11 +329,19 @@ function kc_teilnehmer_page() {
foreach ($gruppen as $wid => $phasen) { foreach ($gruppen as $wid => $phasen) {
$wahl_disp = isset($wahl_name_map[$wid]) ? esc_html($wahl_name_map[$wid]) : $wid; $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 // Gesamtanzahl Teilnehmer für diese Wahl berechnen
$gesamt = 0; $gesamt = 0;
foreach ($phasen as $tns) $gesamt += count($tns); foreach ($phasen as $tns) $gesamt += count($tns);
echo '<details style="margin:10px 0 18px 0;border:1px solid #eaeaea;border-radius:6px;padding:8px;">'; echo '<details style="margin:10px 0 18px 0;border:1px solid #eaeaea;border-radius:6px;padding:8px;">';
echo '<summary style="font-weight:700;cursor:pointer;">'. $wahl_disp . ' <span style="color:#555;font-weight:600;">(' . $gesamt . ' TN)</span></summary>'; echo '<summary style="font-weight:700;cursor:pointer;">'. $wahl_disp . ' <span style="color:#555;font-weight:600;">(' . $gesamt . ' TN)</span></summary>';
echo '<div style="text-align:right;margin:8px 0 4px 0;">';
echo '<a class="kc-btn" style="background:#2da66a;color:#fff;" href="'.esc_url($csv_wahl_url).'">CSV Export dieser Wahl</a>';
echo '</div>';
foreach ($phasen as $phase => $tns) { foreach ($phasen as $phase => $tns) {
echo '<details style="margin:10px 0 10px 0;border:1px solid #f0f0f0;border-radius:6px;padding:8px;">'; echo '<details style="margin:10px 0 10px 0;border:1px solid #f0f0f0;border-radius:6px;padding:8px;">';
echo '<summary style="font-weight:600;">Phase '.intval($phase).' <span style="color:#555;font-weight:600;">('.count($tns).' TN)</span></summary>'; echo '<summary style="font-weight:600;">Phase '.intval($phase).' <span style="color:#555;font-weight:600;">('.count($tns).' TN)</span></summary>';