6) { $current_year = $current_year + 1; } $localPath = $_SERVER['DOCUMENT_ROOT'] . "/files/ranglisten/"; $wkName = db_get_var($mysqli, "SELECT `value` FROM $db_tabelle_var WHERE `name` = ?", ['wkName']); $sortprio = []; $audiofilesPersonen = db_select($mysqli, $db_tabelle_teilnehmende_audiofiles, '*'); $indexedAudiofiles = []; foreach ($audiofilesPersonen as $sAf) { $indexedAudiofiles[$sAf['person_id']][$sAf['geraet_id']] = $sAf['audiofile_id']; } $programmes = db_select($mysqli, $db_tabelle_kategorien, 'programm, `id`, `order_index`', 'aktiv = ?', ['1']); $indexedProgrammIds = array_column($programmes, 'id', 'programm'); $indexedProgramme = array_column($programmes, null, 'programm'); $selected_view_admin = $_SESSION['view_type_admin'] ?? 'prog'; $prog_view_admin = (bool) ($selected_view_admin === 'prog' && $isAdmin); $abt_view_admin = (bool) ($selected_view_admin === 'abt' && $isAdmin); $live_view_admin = (bool) ($selected_view_admin === 'live' && $isAdmin); $aktabt = (int) (db_get_variable($mysqli, $db_tabelle_var, ['wk_panel_current_abt']) ?? 1); $akt_subabt_admin = (int) (db_get_variable($mysqli, $db_tabelle_var, ['wk_panel_current_subabt_admin']) ?? 1); $maxvalue = db_get_var($mysqli, "SELECT `order_index` FROM $db_tabelle_gruppen ORDER BY `order_index` DESC LIMIT 1"); $res = $mysqli->query("SELECT * FROM $db_tabelle_wertungstypen"); $notenConfig = $res->fetch_all(MYSQLI_ASSOC); $indexedNotenConfig = array_column($notenConfig, null, 'id'); $allAbts = db_select($mysqli, $db_tabelle_gruppen, '*', '', [], 'order_index ASC'); $indexedAbts = array_column($allAbts, null, 'id'); $personEinzahl = db_get_variable($mysqli, $db_tabelle_var, ['personEinzahl']); if ($personEinzahl === null) $personEinzahl = 'Person'; $personMehrzahl = db_get_variable($mysqli, $db_tabelle_var, ['personMehrzahl']); if ($personMehrzahl === null) $personMehrzahl = 'Personen'; // Custom Layout Abruf und Helper-Function für Aufbau $json_type = ($isAdmin && !$live_view_admin) ? 'kampfrichter-admin' : 'kampfrichter-geraet'; $jsonstr = db_select($mysqli, $db_tabelle_tabellen_konfiguration, 'json', 'type_slug = ?', [$json_type], '', 1); $data = json_decode($jsonstr[0]['json'] ?? '', true); $headers = $data['header'] ?? []; $bodyColumns = $data['body'] ?? []; $personData = [ 'geburtsdatum' => 'Geburtsdatum', 'name' => 'Name', 'vorname' => 'Vorname', 'verein' => 'Verein', 'programm' => 'Programm' ]; $timeZone = new \DateTimeZone('Europe/Zurich'); $formatter = new \IntlDateFormatter( 'de_CH', \IntlDateFormatter::FULL, \IntlDateFormatter::NONE, $timeZone ); $display_over_array = []; function constructSingleValueSpanPublic($token, $type, $row, $selected_geraet_id = 0) { global $formatter; global $personData; global $arrayIndexedNoten; global $selectedFreigabeId; global $timeZone; global $display_over_array; global $indexedNotenConfig; global $indexedProgramme; $text = ''; $html = ''; $classes = 'singleValueSpan'; $bold = $token['bold'] ?? false; $font_size = (int) ($token['fontSize'] ?? 0); $min_display_width = (int) ($token['minDisplayWidth'] ?? 1) - 1; $linked_el_uid = (int) ($token['linkedElUid'] ?? 0); $uid = (int) ($token['uid'] ?? 0); $style = ''; if ($font_size > 0) { $style = ' style="font-size: ' . $font_size . 'px"'; } if ($min_display_width > 0) { $classes .= ' displayOver' . $min_display_width . 'px'; $display_over_array[] = $min_display_width; } $dataAttributes = 'data-bold="' . htmlspecialchars($bold) . '" data-uid="' . $uid . '"'; if ($linked_el_uid > 0) { $dataAttributes .= ' data-linked-el-uid="' . $linked_el_uid . '"'; } $geraet_id = $selected_geraet_id !== 0 ? $selected_geraet_id : $selectedFreigabeId; switch ($type) { case 'text': $text = $token['text'] ?? ''; $classes .= ' staticText'; break; case 'sortData': $column = $token['column'] ?? ''; switch ($column) { case "rang": $classes .= ' rangField'; break; case "startindex": $text = $row['calculedstartindex']; break; } break; case 'personData': $column = $token['column'] ?? ''; if ($column === 'jahrgang') { $geburtsdatum = $row['geburtsdatum'] ?? ''; $date = new \DateTimeImmutable($geburtsdatum, $timeZone); $formatter->setPattern('yyyy'); $text = $formatter->format($date); } else { $text = array_key_exists($column, $personData) ? $row[$column] ?? '' : ''; if ($column === 'geburtsdatum') { $date = new \DateTimeImmutable($text, $timeZone); $formatter->setPattern(($token['phpDateFormat'] ?? '' !== '') ? $token['phpDateFormat'] : 'd. MMMM YYYY'); $text = $formatter->format($date); } } break; case 'notenData': $field_type_id = intval($token['field-type-id'] ?? 0); $geraet_id = intval($token['geraet-id'] ?? 0); $run = intval($token['run'] ?? 0); $person_id = $row['id']; $notenNullable = ($token['notenNullable'] ?? 'false') === 'true'; $dataAttributes .= ' data-field-type-id="' . $field_type_id . '"'; $dataAttributes .= ' data-geraet-id="' . $geraet_id . '"'; $dataAttributes .= ' data-person-id="' . $person_id . '"'; $dataAttributes .= ' data-run="' . $run . '"'; $dataAttributes .= ' data-noten-nullable="' . (($notenNullable) ? "true" : "false") . '"'; $text = $arrayIndexedNoten[$person_id][$geraet_id][$field_type_id][$run]['value'] ?? null; if ($notenNullable && $text !== null && floatval($text) === 0.0) { $text = ' '; } if ($text === null) { $classes .= ' emtyPlaceholder'; $text = '-'; } $classes .= ' changebleValue'; break; case 'notenGeraetData': $field_type_id = intval($token['field-type-id'] ?? 0); $run = intval($token['run'] ?? 0); $person_id = $row['id']; $programm_id = $indexedProgramme[$row['programm']]['id'] ?? 0; $runsJSON = json_decode($indexedNotenConfig[$field_type_id]['anzahl_laeufe_json'] ?? '', true) ?? []; $max_run = $runsJSON[$geraet_id][$programm_id] ?? $runsJSON[$geraet_id]['all'] ?? $runsJSON['default'] ?? 0; if ($run > $max_run) { $classes .= ' nonExistentEl'; } else { $notenNullable = ($token['notenNullable'] ?? 'false') === 'true'; $dataAttributes .= ' data-field-type-id="' . $field_type_id . '"'; $dataAttributes .= ' data-geraet-id="' . $geraet_id . '"'; $dataAttributes .= ' data-person-id="' . $person_id . '"'; $dataAttributes .= ' data-run="' . $run . '"'; $dataAttributes .= ' data-noten-nullable="' . (($notenNullable) ? "true" : "false") . '"'; $text = $arrayIndexedNoten[$person_id][$geraet_id][$field_type_id][$run]['value'] ?? null; if ($notenNullable && $text !== null && floatval($text) === 0.0) { $text = ' '; } if ($text === null) { $classes .= ' emtyPlaceholder'; $text = '-'; } $classes .= ' changebleValue'; } break; case "kampfrichterEls": $id = intval($row["id"]); $html = ''; } ?> > $singledbprogramm) { $sinleprogramm = $singledbprogramm['programm']; if (!(in_array($sinleprogramm, $allprogrammeabt))) { $allprogrammeabt[] = $sinleprogramm; $allprogrammeabtstr .= $sinleprogramm . ', '; } } $pos = strrpos($allprogrammeabtstr, ' '); if ($pos !== false) { $allprogrammeabtstrcleared = substr_replace($allprogrammeabtstr, '', $pos, 1); } if (mb_strlen($allprogrammeabtstrcleared) > 1) { $allprogrammeabtstrcleared = mb_substr($allprogrammeabtstrcleared, 0, mb_strlen($allprogrammeabtstrcleared) - 1); } } ?> Intern - Kampfrichter $selectedFreigabe, 'id' => $selectedFreigabeId ?? null, 'audiofile' => $indexedDisciplines[$selectedFreigabeId ?? 0]['audiofile'] ?? 0]; } if ($abt_view_admin) { $whereClause = 'WHERE agg.abteilung > 0'; $params = []; $orderBy = 't.id ASC'; } elseif (!$isAdmin) { $base_index_from_user = $indexed_array_geraete_id_index[$selectedFreigabeId]; $startGeraetArrayIndex = $base_index_from_user - $akt_subabt + 1; if ($startGeraetArrayIndex < 1) { $startGeraetArrayIndex += $max_subabt; } $startgeindex = $indexed_array_geraete_index_id[$startGeraetArrayIndex]; $whereClause = 'WHERE agg.abteilung = ? AND agg.geraetId = ?'; $params = [$aktabt, $startgeindex]; $orderBy = 'agg.startIndex ASC'; } elseif ($live_view_admin) { $whereClause = 'WHERE agg.abteilung = ?'; $params = [$aktabt]; $orderBy = 'agg.startIndex ASC'; } else { $whereClause = ''; $params = []; $orderBy = 't.id DESC'; } $stmt = $mysqli->prepare(" SELECT t.*, agg.abteilung, agg.startgeraet, agg.startIndex, agg.abtId, agg.geraetId FROM $db_tabelle_teilnehmende t LEFT JOIN ( SELECT ta.turnerin_id, GROUP_CONCAT(DISTINCT a.order_index SEPARATOR ', ') AS abteilung, GROUP_CONCAT(DISTINCT g.start_index SEPARATOR ', ') AS startgeraet, ta.turnerin_index AS startIndex, ta.abteilung_id AS abtId, ta.geraet_id AS geraetId FROM $db_tabelle_teilnehmende_gruppen ta INNER JOIN $db_tabelle_gruppen a ON a.id = ta.abteilung_id LEFT JOIN $db_tabelle_disziplinen g ON g.id = ta.geraet_id GROUP BY ta.turnerin_id ) agg ON agg.turnerin_id = t.id $whereClause ORDER BY $orderBy "); if (!empty($params)) { $types = str_repeat("s", count($params)); $stmt->bind_param($types, ...$params); } $stmt->execute(); $result = $stmt->get_result(); $entries = $result->fetch_all(MYSQLI_ASSOC); $grouped = []; function groop_by_key($array, $array_key, bool $int = false): array { $grouped = []; if ($int) { foreach ($array as $entry) { $key = (int) $entry[$array_key]; $grouped[$key][] = $entry; } } else { foreach ($array as $entry) { $key = $entry[$array_key]; $grouped[$key][] = $entry; } } return $grouped; } if (!$isAdmin || $abt_view_admin) { $grouped = groop_by_key($entries, 'abtId', true); } elseif ($live_view_admin) { $grouped = groop_by_key($entries, 'geraetId', true); } else { $grouped = groop_by_key($entries, 'programm'); foreach ($grouped as $key => $group) { $orderIndexes[$key] = $indexedProgramme[$key]['order_index'] ?? 10000; } if (isset($orderIndexes)) { uksort($grouped, function ($a, $b) use ($orderIndexes) { return $orderIndexes[$a] <=> $orderIndexes[$b]; }); } } $itemsToLoop = []; $indexedDisciplines = array_column($disciplines, null, 'id'); if ($isAdmin) { foreach ($disciplines as $sd) { $itemsToLoop[] = $sd; } } else { $itemsToLoop[] = ['name' => $selectedFreigabe, 'id' => $selectedFreigabeId ?? null, 'audiofile' => $indexedDisciplines[$selectedFreigabeId ?? 0]['audiofile'] ?? 0]; } ?>

Aktuelle Gruppe

/

Aktuelle Rotation

/

Aktuelle Rotation

/

Aktuelle Rotaion Displays von Aktuelle Gruppe von

Kampfrichterpanel

Eingabetool noch nicht freigeschalten

Alle :

Noch keine Datensätze vorhanden.

prepare($sql); // In PHP 8.1+, you can simply pass an array to execute() // We merge the year with the IDs into one flat array $params = array_merge([$current_wk_id], $ids); $stmt->execute($params); $noten = $stmt->get_result()->fetch_all(MYSQLI_ASSOC); } $rangNote = intval(db_get_var($mysqli, "SELECT `value` FROM $db_tabelle_var WHERE `name` = ?", ['rangNote'])); $orderBestRang = db_get_var($mysqli, "SELECT `value` FROM $db_tabelle_var WHERE `name` = ?", ['orderBestRang']); $okValuesOrderBestRang = ["ASC", "DESC"]; $rangOrderOk = in_array($orderBestRang, $okValuesOrderBestRang) && intval($rangNote) > 0; $notenIndexed = []; foreach ($noten as $sn) { $notenIndexed[$sn['person_id']][$sn['geraet_id']][$sn['note_bezeichnung_id']][$sn['run_number']] = $sn['value']; } $stmt->close(); // Extended Disciplines, contains the 0 disc $disciplinesExtended = array_merge( [["id" => 0, "name" => "None"]], $disciplines ); foreach ($grouped as $abteilung => $entries_group): // Nur sortieren, wenn der Benutzer nicht 'Admin' ist if (!$isAdmin || $live_view_admin) { $entries_with_calculated_index = []; // Optional: Vorab-Caching der MAX-Indices, um DB-Abfragen im Loop zu vermeiden // (Nur aktivieren, wenn $entries_group sehr groß ist und Performance-Probleme auftreten) $maxStartIndexCache = []; foreach ($entries_group as $row) { $old_geraet_id = $row['geraetId']; if ($live_view_admin) { $old_geraet_index = $indexed_array_geraete_id_index[$row['geraetId']]; $shifted_geraet_index = $old_geraet_index + $akt_subabt - 1; if ($shifted_geraet_index > $max_subabt) { $shifted_geraet_index -= $max_subabt; } $row['geraetId'] = $indexed_array_geraete_index_id[$shifted_geraet_index]; } $rohstartindex = intval($row['startIndex']); $abtId = intval($row['abtId']); // Hole maxStartIndex (mit Caching-Logik optional) if (!isset($maxStartIndexCache["$abtId-$old_geraet_id "])) { $maxStartIndexCache["$abtId-$old_geraet_id"] = db_get_var($mysqli, "SELECT COUNT(*) FROM `$db_tabelle_teilnehmende_gruppen` WHERE abteilung_id = ? AND geraet_id = ?", [$abtId, $old_geraet_id]); } $maxstartindex = $maxStartIndexCache["$abtId-$old_geraet_id"]; // Sicherheit: Vermeiden Sie Division durch Null oder Modulo durch 0 if ($maxstartindex < 1) { $maxstartindex = 1; } // The order shift depends on the number of rotations the group has made $rotation_shift = $akt_subabt - 1; $calculedstartindex = $rohstartindex - $rotation_shift; // Sicherstellen, dass das Ergebnis positiv ist (PHP Modulo kann negative Ergebnisse liefern) // Wenn das Ergebnis negativ ist, addieren wir maxstartindex if ($calculedstartindex < 1) { $calculedstartindex += $maxstartindex; } // Kopie der Zeile erstellen, um Originaldaten nicht zu verändern $row['calculedstartindex'] = $calculedstartindex; $entries_with_calculated_index[] = $row; } // Sortieren nach dem berechneten Startindex usort($entries_with_calculated_index, fn($a, $b) => $a['calculedstartindex'] <=> $b['calculedstartindex']); $entries_to_display = $entries_with_calculated_index; } else { $entries_to_display = $entries_group; } $arrayIndexedNoten = []; foreach ($entries_group as $row): if ($isAdmin && $rangOrderOk) { $rangNotenArray[$indexedProgrammIds[$row['programm'] ?? ''] ?? ''][$row['id']] = isset($notenIndexed[$row['id']][0][$rangNote][1]) ? (float) $notenIndexed[$row['id']][0][$rangNote][1] : null; } foreach ($disciplinesExtended as $discipline): // Check if the current user/admin is allowed to see this specific discipline if ($discipline['id'] === 0 || $selectedFreigabeId == $discipline['id'] || $isAdmin): // 2. Now iterate through the scoring configurations for this discipline foreach ($notenConfig as $snC) { if (intval($snC['pro_geraet']) === 1 && intval($discipline['id']) === 0) { continue; } if (intval($snC['pro_geraet']) !== 1) { $allowedGeraete = !empty($snC['geraete_json']) ? json_decode($snC['geraete_json'], true) : []; if (!in_array($discipline['id'], $allowedGeraete)) { continue; } } $defaultValue = $snC['default_value'] ?? 0; $runsJSON = !empty($snC['anzahl_laeufe_json']) ? json_decode($snC['anzahl_laeufe_json'], true) : []; $runs = $runsJSON[$discipline['id']][$indexedProgrammIds[$row['programm'] ?? ''] ?? ''] ?? $runsJSON[$discipline['id']]['all'] ?? $runsJSON["default"] ?? 1; for ($r = 1; $r <= $runs; $r++): $note = $notenIndexed[$row['id']][$discipline['id']][$snC['id']][$r] ?? null; $normalizedNote = ($note !== null) ? number_format($note, $snC['nullstellen'] ?? 2) : null; $arrayIndexedNoten[intval($row['id'])][intval($discipline['id'])][intval($snC['id'])][intval($r)] = ["value" => $normalizedNote]; endfor; } endif; endforeach; endforeach; $table_data_geraet_label = ''; $extra_table_classes = ''; if ($live_view_admin) { $shifted_geraet_index = $indexed_array_geraete_id_index[$abteilung] + $akt_subabt - 1; if ($shifted_geraet_index > $max_subabt) { $shifted_geraet_index -= $max_subabt; } $shifted_geraet_id = $indexed_array_geraete_index_id[$shifted_geraet_index]; $table_data_geraet_label = ' data-geraet-index="' . $shifted_geraet_index . '"'; $extra_table_classes = ' shiftedGeraetTable'; } ?>
>

- Rangliste Online

. Abteilung
0) { $class = 'displayOver' . $min_display_width . 'px'; $display_over_array[] = $min_display_width; } ?> $columnTokens): ?> 1) { $min_display_width = ($headers[$ind]['minDisplayWidth'] ?? 1) - 1; $class = 'displayOver' . $min_display_width . 'px'; $display_over_array[] = $min_display_width; } ?>
>

1) ? $personMehrzahl : $personEinzahl ?>

Gesamt: 1) ? $personMehrzahl : $personEinzahl ?>

Live Synchronsation: