Finalase Export
All checks were successful
Deploy Workshop-Wahlen (DEV / PROD) / deploy (push) Successful in 13s

This commit is contained in:
ProgrammGamer
2026-02-25 18:28:13 +01:00
parent 593c1845c6
commit 5e765f0ff5

View File

@@ -1,4 +1,103 @@
<?php
// CSV Export Handler: früh ausführen, damit kein HTML in der CSV landet
if (isset($_GET['export_teilnehmer_csv']) && current_user_can('manage_options')) {
global $wpdb;
$prefix = $wpdb->prefix;
$all_wahlen = $wpdb->get_results("SELECT id, name 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");
$wahl_name_map = [];
if (!empty($all_wahlen)) {
foreach ($all_wahlen as $w) {
$wahl_name_map[intval($w->id)] = $w->name;
}
}
$workshops_map = [];
if (!empty($all_workshops)) {
foreach ($all_workshops as $ws) {
$workshops_map[intval($ws->id)] = $ws->name;
}
}
$export_wahl_id = isset($_GET['wahl_id']) ? intval($_GET['wahl_id']) : 0;
$export_phase = isset($_GET['phase']) ? intval($_GET['phase']) : 0;
$sql = "SELECT * FROM {$prefix}kc_teilnehmer";
if ($export_wahl_id > 0 && $export_phase > 0) {
$sql .= $wpdb->prepare(" WHERE wahl_id=%d AND phase=%d", $export_wahl_id, $export_phase);
} elseif ($export_wahl_id > 0) {
$sql .= $wpdb->prepare(" WHERE wahl_id=%d", $export_wahl_id);
} elseif ($export_phase > 0) {
$sql .= $wpdb->prepare(" WHERE phase=%d", $export_phase);
}
$sql .= " ORDER BY wahl_id, phase, nachname, vorname";
$export_rows = $wpdb->get_results($sql);
$filename_suffix = '_alle';
if ($export_wahl_id > 0) {
$wahl_name_for_file = isset($wahl_name_map[$export_wahl_id]) ? $wahl_name_map[$export_wahl_id] : ('wahl_'.$export_wahl_id);
$wahl_slug = sanitize_title($wahl_name_for_file);
if ($wahl_slug === '') {
$wahl_slug = 'wahl_'.$export_wahl_id;
}
$filename_suffix = '_'.$wahl_slug;
if ($export_phase > 0) {
$filename_suffix .= '_phase_'.$export_phase;
}
} elseif ($export_phase > 0) {
$filename_suffix = '_phase_'.$export_phase;
}
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);
$csv_clean = function($value) {
$text = html_entity_decode((string)$value, ENT_QUOTES | ENT_HTML5, 'UTF-8');
$text = wp_strip_all_tags($text, true);
$text = preg_replace('/\s+/u', ' ', $text);
return trim($text);
};
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 = $csv_clean($tn->vorname);
$nachname = $csv_clean($tn->nachname);
$wahl_name_clean = $csv_clean($wahl_name);
$w1_clean = $csv_clean($w1_disp);
$w2_clean = $csv_clean($w2_disp);
$w3_clean = $csv_clean($w3_disp);
fputcsv($output, [
$vorname,
$nachname,
$wahl_name_clean,
intval($tn->phase),
$w1_clean,
$w2_clean,
$w3_clean
], $delimiter);
}
fclose($output);
exit;
}
function kc_teilnehmer_page() {
global $wpdb;
$prefix = $wpdb->prefix;
@@ -23,84 +122,6 @@ function kc_teilnehmer_page() {
}
}
// CSV-Export (alle Teilnehmer oder gefiltert nach Wahl/Phase)
if (isset($_GET['export_teilnehmer_csv']) && current_user_can('manage_options')) {
$export_wahl_id = isset($_GET['wahl_id']) ? intval($_GET['wahl_id']) : 0;
$export_phase = isset($_GET['phase']) ? intval($_GET['phase']) : 0;
$sql = "SELECT * FROM {$prefix}kc_teilnehmer";
if ($export_wahl_id > 0 && $export_phase > 0) {
$sql .= $wpdb->prepare(" WHERE wahl_id=%d AND phase=%d", $export_wahl_id, $export_phase);
} elseif ($export_wahl_id > 0) {
$sql .= $wpdb->prepare(" WHERE wahl_id=%d", $export_wahl_id);
} elseif ($export_phase > 0) {
$sql .= $wpdb->prepare(" WHERE phase=%d", $export_phase);
}
$sql .= " ORDER BY wahl_id, phase, nachname, vorname";
$export_rows = $wpdb->get_results($sql);
$filename_suffix = '_alle';
if ($export_wahl_id > 0) {
$wahl_name_for_file = isset($wahl_name_map[$export_wahl_id]) ? $wahl_name_map[$export_wahl_id] : ('wahl_'.$export_wahl_id);
$wahl_slug = sanitize_title($wahl_name_for_file);
if ($wahl_slug === '') {
$wahl_slug = 'wahl_'.$export_wahl_id;
}
$filename_suffix = '_'.$wahl_slug;
if ($export_phase > 0) {
$filename_suffix .= '_phase_'.$export_phase;
}
} elseif ($export_phase > 0) {
$filename_suffix = '_phase_'.$export_phase;
}
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);
$csv_clean = function($value) {
$text = html_entity_decode((string)$value, ENT_QUOTES | ENT_HTML5, 'UTF-8');
$text = wp_strip_all_tags($text, true);
$text = preg_replace('/\s+/u', ' ', $text);
return trim($text);
};
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 = $csv_clean($tn->vorname);
$nachname = $csv_clean($tn->nachname);
$wahl_name_clean = $csv_clean($wahl_name);
$w1_clean = $csv_clean($w1_disp);
$w2_clean = $csv_clean($w2_disp);
$w3_clean = $csv_clean($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) {