prefix; kc_admin_tabs('kc_workshops'); // Liste aller Teamer für Multi-Select (sortiert wie in Teamer-Übersicht: Vorname A-Z) $teamer_liste = $wpdb->get_results("SELECT * FROM {$prefix}kc_teamer ORDER BY vorname ASC"); // Liste aller Wahlen für Auswahl $wahlen_liste = $wpdb->get_results("SELECT * FROM {$prefix}kc_wahlen ORDER BY id DESC"); // Liste aller Phasen für Auswahl $phasen_liste = $wpdb->get_results("SELECT * FROM {$prefix}kc_phasen ORDER BY nummer"); // Workshop löschen if (isset($_GET['delete_workshop'])) { $wid = intval($_GET['delete_workshop']); $wpdb->delete("{$prefix}kc_workshops", ['id' => $wid]); echo '
Workshop gelöscht!
'; } // Workshop speichern (neu/ändern) if (isset($_POST['kc_workshop_save'])) { $wid = !empty($_POST['wid']) ? intval($_POST['wid']) : null; // Nur Workshop-Daten speichern, wenn Name übergeben wurde (nicht bei reiner Teamer-Bearbeitung) if (!empty($_POST['name'])) { // Ensure DB has min_teilnehmer column $col = $wpdb->get_results($wpdb->prepare("SHOW COLUMNS FROM {$prefix}kc_workshops LIKE %s", 'min_teilnehmer')); if (empty($col)) { $wpdb->query("ALTER TABLE {$prefix}kc_workshops ADD COLUMN min_teilnehmer INT DEFAULT 0"); } $data = [ 'name' => sanitize_text_field($_POST['name']), 'beschreibung' => sanitize_text_field($_POST['beschreibung']), 'max_teilnehmer' => intval($_POST['max_teilnehmer']), 'min_teilnehmer' => intval($_POST['min_teilnehmer'] ?? 0) ]; if ($wid) { $wpdb->update("{$prefix}kc_workshops", $data, ['id'=> $wid]); echo '
Workshop aktualisiert!
'; } else { $wpdb->insert("{$prefix}kc_workshops", $data); $wid = intval($wpdb->insert_id); echo '
Workshop angelegt!
'; } } // Teamer-Zuordnungen speichern mit Wahl/Phase (auch für neue Workshops) if (!empty($wid)) { // Stelle sicher, dass wahl_id und phase Spalten existieren $columns = $wpdb->get_col("SHOW COLUMNS FROM {$prefix}kc_workshop_teamer"); if (!in_array('wahl_id', $columns)) { $wpdb->query("ALTER TABLE {$prefix}kc_workshop_teamer ADD COLUMN wahl_id INT(11) NULL DEFAULT NULL"); } if (!in_array('phase', $columns)) { $wpdb->query("ALTER TABLE {$prefix}kc_workshop_teamer ADD COLUMN phase INT(11) NULL DEFAULT NULL"); } $is_feste = !empty($_POST['edit_feste']); $wahl_id = !empty($_POST['select_wahl_id']) ? intval($_POST['select_wahl_id']) : null; $phase = !empty($_POST['select_phase']) ? intval($_POST['select_phase']) : null; // Lösche alte Zuordnungen (nur wenn Teamer vorhanden sind, für neue Workshops) if (!empty($_POST['teamer_ids'])) { if ($is_feste) { $wpdb->query($wpdb->prepare( "DELETE FROM {$prefix}kc_workshop_teamer WHERE workshop_id=%d AND wahl_id IS NULL AND phase IS NULL", $wid )); } elseif ($wahl_id !== null) { if ($phase !== null) { $wpdb->delete("{$prefix}kc_workshop_teamer", [ 'workshop_id' => $wid, 'wahl_id' => $wahl_id, 'phase' => $phase ]); } else { $wpdb->query($wpdb->prepare( "DELETE FROM {$prefix}kc_workshop_teamer WHERE workshop_id=%d AND wahl_id=%d AND phase IS NULL", $wid, $wahl_id )); } } } // Neue Zuordnungen einfügen if (!empty($_POST['teamer_ids']) && is_array($_POST['teamer_ids'])) { foreach ($_POST['teamer_ids'] as $tid) { $tid = intval($tid); if ($tid > 0) { if ($is_feste) { $wpdb->insert("{$prefix}kc_workshop_teamer", [ 'workshop_id' => $wid, 'teamer_id' => $tid, 'wahl_id' => null, 'phase' => null ]); } else { $wpdb->insert("{$prefix}kc_workshop_teamer", [ 'workshop_id' => $wid, 'teamer_id' => $tid, 'wahl_id' => $wahl_id, 'phase' => $phase ]); } } } } // Redirect nach Speichern von festen Teamern zur Gesamtübersicht if ($is_feste && empty($_POST['name'])) { echo '
Feste Teamer gespeichert!
'; echo ""; return; } // Redirect nach Speichern von wahl-spezifischen Teamern zurück zur Workshop-Bearbeitung if ($wahl_id !== null && empty($_POST['name'])) { echo '
Teamer-Zuordnung gespeichert!
'; echo ""; return; } } } // Workshop bearbeiten if (isset($_GET['edit_workshop'])) { $wid = intval($_GET['edit_workshop']); $ws = $wpdb->get_row("SELECT * FROM {$prefix}kc_workshops WHERE id=$wid"); if (!$ws) { echo '
'; echo '
Workshop nicht gefunden.
'; echo 'Zur\u00fcck zur \u00dcbersicht'; echo '
'; return; } echo '
'; echo '

Workshop bearbeiten: '.esc_html($ws->name).'

'; // Hole Spalten-Info $columns = $wpdb->get_col("SHOW COLUMNS FROM {$prefix}kc_workshop_teamer"); $has_wahl = in_array('wahl_id', $columns); $has_phase = in_array('phase', $columns); // Zeige Feste Teamer (gelten für alle Wahlen) if ($has_wahl && $has_phase) { $feste_teamer = $wpdb->get_results($wpdb->prepare( "SELECT t.vorname, t.nachname FROM {$prefix}kc_workshop_teamer wt JOIN {$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 ORDER BY t.vorname", $wid )); if (!empty($feste_teamer)) { $teamer_names = array_map(function($t) { return $t->vorname.' '.$t->nachname; }, $feste_teamer); $teamer_str = implode(', ', array_map('esc_html', $teamer_names)); echo '
Feste Teamer (für alle Wahlen): '.$teamer_str.' Bearbeiten
'; } } // Zeige Wahl/Phase-Kombinationen mit ihren Teamern echo '

Teamer pro Wahl:

'; echo '
'; if ($has_wahl && $has_phase) { echo '+ Feste Teamer festlegen'; } echo '
'; echo ''; echo ''; // Hole alle Wahlen, die diesem Workshop zugeordnet sind $wahlen_for_workshop = $wpdb->get_results($wpdb->prepare( "SELECT DISTINCT ww.wahl_id, w.name, w.anzahl_einheiten FROM {$prefix}kc_wahl_workshops ww JOIN {$prefix}kc_wahlen w ON ww.wahl_id=w.id WHERE ww.workshop_id=%d ORDER BY w.id", $wid )); if (empty($wahlen_for_workshop)) { echo ''; } else { foreach($wahlen_for_workshop as $w) { // Sammle Teamer für diese Wahl if ($has_wahl && $has_phase) { // Prüfe ob es wahl-spezifische Teamer gibt $wahl_teamer = $wpdb->get_results($wpdb->prepare( "SELECT DISTINCT t.vorname, t.nachname FROM {$prefix}kc_workshop_teamer wt JOIN {$prefix}kc_teamer t ON wt.teamer_id=t.id WHERE wt.workshop_id=%d AND wt.wahl_id=%d ORDER BY t.vorname", $wid, $w->wahl_id )); // Wenn keine wahl-spezifischen Teamer, nutze die Festen Teamer if (empty($wahl_teamer) && !empty($feste_teamer)) { $teamer = $feste_teamer; } else { $teamer = $wahl_teamer; } } else { $teamer = []; } $teamer_names = array_map(function($t) { return $t->vorname.' '.$t->nachname; }, $teamer); $teamer_str = !empty($teamer_names) ? implode(', ', array_map('esc_html', $teamer_names)) : 'Keine'; echo ''; } } echo '
WahlTeamerAktion
Dieser Workshop ist noch keiner Wahl zugeordnet.
'.esc_html($w->name).' '.$teamer_str.' Bearbeiten
'; // Wenn Feste Teamer bearbeitet werden sollen if (isset($_GET['edit_feste'])) { echo '

Feste Teamer (gelten für alle Wahlen)

'; // Feste Teamer auslesen if ($has_wahl && $has_phase) { $assigned = $wpdb->get_col($wpdb->prepare( "SELECT teamer_id FROM {$prefix}kc_workshop_teamer WHERE workshop_id=%d AND wahl_id IS NULL AND phase IS NULL", $wid )); } else { $assigned = []; } foreach($teamer_liste as $t) { $checked = in_array($t->id, (array)$assigned) ? ' checked' : ''; echo ''; } echo '
Abbrechen
'; } // Wenn eine Wahl ausgewählt wurde, zeige Phase-Auswahl oder direkt Teamer-Bearbeitung elseif (isset($_GET['select_wahl']) && !isset($_GET['edit_wahl'])) { $select_wahl_id = intval($_GET['select_wahl']); $wahl_info = $wpdb->get_row($wpdb->prepare("SELECT name, anzahl_einheiten FROM {$prefix}kc_wahlen WHERE id=%d", $select_wahl_id)); if (!$wahl_info) { echo '
Wahl nicht gefunden.
'; echo 'Abbrechen'; return; } if (intval($wahl_info->anzahl_einheiten) > 1) { // Mehrere Phasen: Frage stellen unter Berücksichtigung der tatsächlichen Zuordnung // Ermittle, welchen Phasen dieser Workshop in dieser Wahl zugeordnet ist $assigned_phases = $wpdb->get_col($wpdb->prepare( "SELECT DISTINCT phase FROM {$prefix}kc_wahl_workshops WHERE workshop_id=%d AND wahl_id=%d AND phase IS NOT NULL", $wid, $select_wahl_id )); $assigned_phases = array_map('intval', (array)$assigned_phases); sort($assigned_phases); echo '
'; echo '

Teamer für: '.esc_html($wahl_info->name).'

'; echo '

Sollen die Teamer für eine bestimmte Phase gelten?'; echo ' (Dieser Workshop ist zugeordnet: '.(!empty($assigned_phases) ? 'Phase '.esc_html(implode(', ', $assigned_phases)) : 'keiner Phase').')

'; echo '
'; // "Für alle Phasen" nur anbieten, wenn wirklich allen Phasen dieser Wahl zugeordnet if (!empty($assigned_phases) && count($assigned_phases) === intval($wahl_info->anzahl_einheiten)) { echo 'Für alle Phasen'; } // Buttons nur für tatsächlich zugeordnete Phasen foreach ($assigned_phases as $p) { echo 'Phase '.$p.''; } if (empty($assigned_phases)) { echo 'Dieser Workshop ist in dieser Wahl aktuell keiner Phase zugeordnet.'; } echo '
'; echo 'Abbrechen'; echo '
'; } else { // Nur eine Phase: direkt weiterleiten echo ""; return; } } // Wenn eine Wahl ausgewählt wurde (mit oder ohne Phase), zeige Bearbeitung elseif (isset($_GET['edit_wahl'])) { $edit_wahl_id = intval($_GET['edit_wahl']); $edit_phase = isset($_GET['edit_phase']) ? intval($_GET['edit_phase']) : null; $edit_wahl = $wpdb->get_row($wpdb->prepare("SELECT name FROM {$prefix}kc_wahlen WHERE id=%d", $edit_wahl_id)); if (!$edit_wahl) { echo '
Wahl nicht gefunden.
'; echo 'Abbrechen'; return; } if ($edit_phase !== null) { $title = 'Teamer für '.esc_html($edit_wahl->name).' Phase '.$edit_phase; } else { $title = 'Teamer für '.esc_html($edit_wahl->name).' (Alle Phasen)'; } echo '

'.$title.'

'; if ($edit_phase !== null) { echo ''; } echo '
'; // Stelle sicher, dass Spalten existieren $columns = $wpdb->get_col("SHOW COLUMNS FROM {$prefix}kc_workshop_teamer"); $has_wahl = in_array('wahl_id', $columns); $has_phase = in_array('phase', $columns); // Teamer für diese Wahl/Phase auslesen if ($has_wahl && $has_phase) { if ($edit_phase !== null) { $assigned = $wpdb->get_col($wpdb->prepare( "SELECT teamer_id FROM {$prefix}kc_workshop_teamer WHERE workshop_id=%d AND wahl_id=%d AND phase=%d", $wid, $edit_wahl_id, $edit_phase )); } else { $assigned = $wpdb->get_col($wpdb->prepare( "SELECT teamer_id FROM {$prefix}kc_workshop_teamer WHERE workshop_id=%d AND wahl_id=%d AND phase IS NULL", $wid, $edit_wahl_id )); } } else { $assigned = []; } foreach($teamer_liste as $t) { $checked = in_array($t->id, (array)$assigned) ? ' checked' : ''; echo ''; } echo '
Abbrechen
'; } else { // Workshop-Details bearbeiten echo '

Workshop-Details

Abbrechen
'; } echo '
'; return; } // Neuer Workshop anlegen if (isset($_GET['new'])) { echo '
'; echo '

Neuen Workshop anlegen

'; echo '
'; echo ''; echo ''; echo '
'; echo ''; echo ''; echo '
'; echo ''; echo 'Abbrechen'; echo '
'; echo '
'; return; } // Übersicht echo '
'; echo '

Alle Workshops

'; echo '+ Neuer Workshop'; echo '
' .'' .'' .'Alle anzeigen' .'
' .'' .'' .'' .'' .'' .'' .'
' .'
'; echo '
' .'' .'' .'Alle anzeigen' .'
'; // Sortierung $sort = isset($_GET['sort']) ? sanitize_text_field($_GET['sort']) : 'id'; $order = isset($_GET['order']) ? (($_GET['order'] === 'desc') ? 'DESC' : 'ASC') : 'DESC'; $allowed_sort = ['id', 'name', 'beschreibung']; if (!in_array($sort, $allowed_sort)) { $sort = 'id'; } // Sortier-Links $name_order = ($sort === 'name' && $order === 'ASC') ? 'desc' : 'asc'; $beschreibung_order = ($sort === 'beschreibung' && $order === 'ASC') ? 'desc' : 'asc'; $name_arrow = ($sort === 'name') ? ($order === 'ASC' ? ' ▲' : ' ▼') : ''; $beschreibung_arrow = ($sort === 'beschreibung') ? ($order === 'ASC' ? ' ▲' : ' ▼') : ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; $workshops = $wpdb->get_results("SELECT * FROM {$prefix}kc_workshops ORDER BY {$sort} {$order}"); foreach ($workshops as $ws) { // Teamer anzeigen $trows = $wpdb->get_results($wpdb->prepare("SELECT t.vorname, t.nachname FROM {$prefix}kc_workshop_teamer wt JOIN {$prefix}kc_teamer t ON wt.teamer_id=t.id WHERE wt.workshop_id=%d", $ws->id)); $tnames = array_map(function($r){ return $r->vorname.' '.$r->nachname; }, $trows); $tnames_str = implode(', ', array_map('esc_html', $tnames)); if (empty($tnames_str)) $tnames_str = 'Keine'; // Wahlen und Phasen anzeigen $wahl_rows = $wpdb->get_results($wpdb->prepare( "SELECT w.name, ww.phase FROM {$prefix}kc_wahl_workshops ww JOIN {$prefix}kc_wahlen w ON ww.wahl_id=w.id WHERE ww.workshop_id=%d ORDER BY w.id, ww.phase", $ws->id )); $wahl_info = []; foreach($wahl_rows as $wr) { $wahl_info[] = esc_html($wr->name) . ($wr->phase ? ' (P'.intval($wr->phase).')' : ''); } $wahl_str = !empty($wahl_info) ? implode(', ', $wahl_info) : 'Keine'; echo ""; } echo '
Name'.$name_arrow.'Beschreibung'.$beschreibung_arrow.'Teilnehmer (Min - Max)TeamerWahlenAktion
".esc_html($ws->name)." ".esc_html($ws->beschreibung)." ".(isset($ws->min_teilnehmer)?intval($ws->min_teilnehmer):0)." - ".intval($ws->max_teilnehmer)." ". $tnames_str ." ". $wahl_str ." Bearbeiten Loeschen
'; echo ''; echo '
'; } ?>