Files
Workshop-Wahlen/includes/frontend-ergebnis.php
ProgrammGamer f4b84f43ea
All checks were successful
Deploy Workshop-Wahlen (DEV / PROD) / deploy (push) Successful in 13s
css back
2026-01-30 20:55:01 +01:00

213 lines
8.6 KiB
PHP

<?php
add_shortcode('konficastle_workshop_ergebnis', function($atts) {
$atts = shortcode_atts(['wahl'=>null], $atts);
$wahl_id = intval($atts['wahl']);
global $wpdb;
$wahl = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}kc_wahlen WHERE id=$wahl_id");
if(!$wahl) return '';
if($wahl->freigegeben) return '<div style="color:#e12b2b;font-weight:bold;"></div>';
// Workshops für diese Wahl holen
$workshops = $wpdb->get_results(
"SELECT ws.id, ws.name
FROM {$wpdb->prefix}kc_workshops ws
JOIN {$wpdb->prefix}kc_wahl_workshops ww ON ws.id = ww.workshop_id
WHERE ww.wahl_id = ".intval($wahl_id)
);
$ws_names = [];
$ws_ids = [];
foreach($workshops as $ws) {
$ws_names[$ws->id] = $ws->name;
$ws_ids[] = intval($ws->id);
}
// Zuteilungen holen
$rows = $wpdb->get_results(
"SELECT * FROM {$wpdb->prefix}kc_zuteilung WHERE wahl_id=".intval($wahl_id)
);
// Gruppieren nach Workshop, sortieren nach Teilnehmerzahl
$workshop_groups = [];
$nicht_zugeteilt = [];
$phases = [];
foreach($rows as $row) {
// Einträge ohne Phase komplett ignorieren
if ($row->phase === null || $row->phase === '') {
continue;
}
$phaseNum = intval($row->phase);
$phases[$phaseNum] = true;
if ($row->workshop_id && isset($ws_names[$row->workshop_id])) {
$workshop_groups[$row->workshop_id][] = $row;
} else {
$nicht_zugeteilt[] = $row;
}
}
uasort($workshop_groups, function($a, $b) {
return count($a) - count($b);
});
$phases = array_keys($phases);
sort($phases, SORT_NUMERIC);
// Teamer pro Workshop und Phase laden (mit Hierarchie: Phase-spezifisch > Wahl-weit > Feste)
$ws_teamers = [];
if (!empty($ws_ids)) {
// Für JEDEN Workshop einzeln laden
foreach($ws_ids as $ws_id) {
foreach($phases as $phase) {
// 1. Versuche Phase-spezifische Teamer zu laden
$trows = $wpdb->get_results($wpdb->prepare(
"SELECT t.vorname, t.nachname FROM {$wpdb->prefix}kc_workshop_teamer wt
JOIN {$wpdb->prefix}kc_teamer t ON wt.teamer_id = t.id
WHERE wt.workshop_id = %d AND wt.wahl_id = %d AND wt.phase = %d",
$ws_id, $wahl_id, $phase
));
// 2. Falls nicht: Versuche Wahl-weite Teamer zu laden
if (empty($trows)) {
$trows = $wpdb->get_results($wpdb->prepare(
"SELECT t.vorname, t.nachname FROM {$wpdb->prefix}kc_workshop_teamer wt
JOIN {$wpdb->prefix}kc_teamer t ON wt.teamer_id = t.id
WHERE wt.workshop_id = %d AND wt.wahl_id = %d AND wt.phase IS NULL",
$ws_id, $wahl_id
));
}
// 3. Falls nicht: Lade Feste Teamer
if (empty($trows)) {
$trows = $wpdb->get_results($wpdb->prepare(
"SELECT t.vorname, t.nachname FROM {$wpdb->prefix}kc_workshop_teamer wt
JOIN {$wpdb->prefix}kc_teamer t ON wt.teamer_id = t.id
WHERE wt.workshop_id = %d AND wt.wahl_id IS NULL AND wt.phase IS NULL",
$ws_id
));
}
if (!empty($trows)) {
$key = intval($ws_id) . '_' . intval($phase);
$ws_teamers[$key] = [];
foreach ($trows as $tr) {
$ws_teamers[$key][] = trim($tr->vorname.' '.$tr->nachname);
}
}
}
}
}
// Versuche, Teilnehmer-IDs aus Cookie zu lesen (falls vorhanden)
$my_ids = [];
$cookie_name = 'kc_my_part_' . intval($wahl_id);
if (!empty($_COOKIE[$cookie_name])) {
$decoded = json_decode(stripslashes($_COOKIE[$cookie_name]), true);
if (is_array($decoded)) $my_ids = array_map('intval', $decoded);
}
ob_start();
// Inline styles, angepasst an konfi-castle.com Look (dezent, grün/türkis Akzent)
echo '<div class="kc-result">';
echo '<h3>Ergebnis für diese Wahl</h3>';
// Falls persönliche IDs vorhanden: zeige persönliche Zuteilung oben
$personal_shown = false;
if (!empty($my_ids)) {
// Suche Zuteilungen für meine IDs
$my_rows = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}kc_zuteilung WHERE wahl_id=".intval($wahl_id)." AND id IN (" . implode(',', array_map('intval', $my_ids)) . ")");
if (!empty($my_rows)) {
// Entferntes <br> nach "Deine Zuteilung"
echo '<div style="background:#e8f9ef;border-left:6px solid #2da66a;padding:12px 14px;margin-bottom:12px;border-radius:8px;">';
echo '<b>Deine Zuteilung</b><ul style="margin:6px 0 0 16px;">';
foreach($my_rows as $mr) {
$wslabel = ($mr->workshop_id && isset($ws_names[$mr->workshop_id])) ? $ws_names[$mr->workshop_id] : ($mr->workshop_id ? 'ID '.$mr->workshop_id : 'Nicht zugeteilt');
echo '<li>'.esc_html($mr->vorname.' '.$mr->nachname).' (Phase '.intval($mr->phase).') — '.esc_html($wslabel).'</li>';
}
echo '</ul></div>';
$personal_shown = true;
}
}
// Für jede Phase: Workshops nebeneinander darstellen
foreach($phases as $phase) {
echo '<div class="kc-phase">';
echo '<h4 style="margin:6px 0;text-align:center;">Phase '.intval($phase).'</h4>';
echo '<div class="kc-workshops-grid">';
// Sammle nur Workshops mit Teilnehmern in dieser Phase
$display = [];
foreach($ws_names as $ws_id => $ws_name) {
$teilnehmer = [];
if (isset($workshop_groups[$ws_id])) {
foreach($workshop_groups[$ws_id] as $t) {
if (intval($t->phase) === intval($phase)) $teilnehmer[] = $t;
}
}
$count = count($teilnehmer);
if ($count === 0) continue; // nur Workshops mit TN anzeigen
$display[] = [
'id' => $ws_id,
'name' => $ws_name,
'teilnehmer' => $teilnehmer,
'count' => $count
];
}
// Nach Teilnehmerzahl aufsteigend sortieren (kleinste oben, größte unten)
usort($display, function($a, $b) {
return $a['count'] - $b['count'];
});
// Ausgabe der sortierten Kacheln
foreach($display as $d) {
$ws_name = $d['name'];
$teilnehmer = $d['teilnehmer'];
$count = $d['count'];
// Sortiere so, dass persönliche Teilnehmer zuerst kommen
if (!empty($my_ids) && !empty($teilnehmer)) {
usort($teilnehmer, function($a, $b) use ($my_ids) {
$a_my = in_array(intval($a->id), $my_ids);
$b_my = in_array(intval($b->id), $my_ids);
if ($a_my && !$b_my) return -1;
if (!$a_my && $b_my) return 1;
return 0;
});
}
echo '<div class="kc-workshop-card">';
$teamer_html = '';
$teamer_key = intval($d['id']) . '_' . intval($phase);
if (!empty($ws_teamers[$teamer_key])) {
$teamer_html = '<span class="teamers">'.esc_html(implode(', ', $ws_teamers[$teamer_key])).'</span>';
}
echo '<div class="title">'.esc_html($ws_name).($teamer_html ? ' '.$teamer_html : '').'<span class="count">('.$count.' TN)</span></div>';
echo '<div class="kc-participants">';
foreach($teilnehmer as $t) {
$is_me = in_array(intval($t->id), $my_ids);
$name = esc_html($t->vorname.' '.$t->nachname);
echo '<span class="kc-participant'.($is_me ? ' me' : '').'">'. $name .'</span>';
}
echo '</div>';
echo '</div>';
}
echo '</div>'; // kc-workshops-grid
echo '</div>'; // kc-phase
}
// Extra: Nicht zugeteilt
if (!empty($nicht_zugeteilt)) {
echo '<div class="kc-notassigned">';
echo '<b>Nicht zugeteilt:</b><br>';
echo '<div style="margin:6px 0 0 18px;">';
foreach($nicht_zugeteilt as $t) {
echo '<span style="display:inline-block;white-space:nowrap;margin-right:12px;">'.esc_html($t->vorname.' '.$t->nachname).'</span>';
}
echo '</div></div>';
}
echo '</div>'; // kc-result
return ob_get_clean();
});
?>