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 '
'; // 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 '
'; echo '

Ergebnis für diese Wahl

'; // 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
nach "Deine Zuteilung" echo '
'; echo 'Deine Zuteilung
'; $personal_shown = true; } } // Für jede Phase: Workshops nebeneinander darstellen foreach($phases as $phase) { echo '
'; echo '

Phase '.intval($phase).'

'; echo '
'; // 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 '
'; // Teamernamen (falls vorhanden) anzeigen - mit Phase-Key $teamer_html = ''; $teamer_key = intval($d['id']) . '_' . intval($phase); if (!empty($ws_teamers[$teamer_key])) { $teamer_html = ''.esc_html(implode(', ', $ws_teamers[$teamer_key])).''; } echo '
'.esc_html($ws_name).' '. $teamer_html .'('.$count.' TN)
'; echo '
'; echo '
'; foreach($teilnehmer as $t) { $is_me = in_array(intval($t->id), $my_ids); $name = esc_html($t->vorname.' '.$t->nachname); echo '
'. $name .'
'; } echo '
'; // kc-participants echo '
'; // content echo '
'; } echo '
'; // kc-workshops-grid echo '
'; // kc-phase } // Extra: Nicht zugeteilt if (!empty($nicht_zugeteilt)) { echo '
'; echo 'Nicht zugeteilt:
'; echo '
'; foreach($nicht_zugeteilt as $t) { echo ''.esc_html($t->vorname.' '.$t->nachname).''; } echo '
'; } echo '
'; // kc-result return ob_get_clean(); }); ?>