Kommentare aus dem Quelltext entfernen

Aus dem Review: „Der Quelltext ist absolut ueberkommentiert." Nach dem Kuerzen
in 554ad25 jetzt vollstaendig — 294 Kommentarzeilen aus fuenf Dateien.

Nachgewiesen unveraendert: der Diff ohne Kommentar- und Leerzeilen gegen
5aee028 ist vor und nach dieser Aenderung derselbe (gleiche Pruefsumme). Es ist
also ausschliesslich Kommentar entfernt worden, keine Zeile Programmtext.

Entfernt wurden nur die von diesem Zweig HINZUGEFUEGTEN Kommentare; jeder
Kommentar, der im alten Stand schon stand, bleibt unangetastet (auch dort, wo
Formularzeilen verschoben wurden).
This commit is contained in:
svennickel
2026-09-08 18:17:24 +02:00
parent 35384a5c43
commit 7f1bedc41e
5 changed files with 0 additions and 326 deletions
@@ -2683,7 +2683,6 @@ function adminImportSpieler(): void
if (!ini_get('safe_mode'))
set_time_limit(300);
if (!$beschraenkter_zugriff || $ansprechpartner_importieren != 1)
$persoenliche_daten = $jInput->get('persoenliche_daten', 0, 'INT'); // 0: "Vor- und Nachname, Geschlecht, Spielernr., Lizenznr.", 1: "Vor- und Nachname, Geschlecht, Spielernr., Lizenznr., Geburtsdatum", "Alle"
else
@@ -3825,7 +3824,6 @@ function adminVereineZusammenlegenForm(): void
$spieler_id = $row->spieler_id;
}
$query = "UPDATE #__sportsmanager_team"
. "\n SET verein_id = $verein_beizubehalten_id"
. "\n WHERE verein_id = $verein_zu_entfernen_id";
@@ -4553,10 +4551,6 @@ function adminEditTeamspielmodus(): void
$row = $rows[0];
}
// Ob unter diesem Spielplan schon Ergebnisse stehen. „Saetze pro Spiel" zu aendern
// rechnet naemlich nichts um — aus sechs Toren werden sechs Saetze, und aus drei
// Saetzen drei Tore. Das laesst sich auch nicht umrechnen (aus „drei gewonnene
// Saetze" folgt keine Torzahl), also wird davor gewarnt statt gehandelt.
if ($row != null) {
$query = "SELECT COUNT(*) AS anzahl"
. "\n FROM #__sportsmanager_teamspiel AS t"
@@ -4581,11 +4575,6 @@ function adminEditTeamspielmodus(): void
$id = $jInput->get('id', 0, 'INT');
$bezeichnung = $db->escape(trim($jInput->get('bezeichnung', '', 'RAW')));
// Die Auswahl „Saetze pro Spiel" hat drei Eintraege, die Datenbank zwei Felder: der
// dritte Eintrag ist „Mehrere" mit der zusaetzlichen Angabe, dass die Saetze einzeln
// eingetragen werden. punktetyp behaelt damit seine beiden ueberlieferten Werte — es
// ist das Feld, an dem jede fremde Anwendung ablesen muss, ob die Punkte eines Spiels
// Tore oder gewonnene Saetze sind (siehe Datenbankversion 126).
$punktetyp = $jInput->get('punktetyp', 0, 'INT');
$satzergebnisse = $punktetyp == 2 ? 1 : 0;
if ($punktetyp == 2)
@@ -4593,9 +4582,6 @@ function adminEditTeamspielmodus(): void
$punkte_sieg_einzel = $jInput->get('punkte_sieg_einzel', 0, 'INT');
$punkte_sieg_doppel_separat = $jInput->get('punkte_sieg_doppel_separat', 0, 'INT');
$punkte_sieg_doppel = $punkte_sieg_doppel_separat ? $jInput->get('punkte_sieg_doppel', 0, 'INT') : $punkte_sieg_einzel;
// Vorsprung (mindestens 1 Tor, sonst waere kein Spiel je entschieden) und Deckelung
// (0 = keine). Beide folgen derselben "Doppel separat"-Schaltung wie die Siegbedingung,
// zu der sie gehoeren.
$punkte_vorsprung_einzel = max(1, $jInput->get('punkte_vorsprung_einzel', 1, 'INT'));
$punkte_vorsprung_doppel = $punkte_sieg_doppel_separat
? max(1, $jInput->get('punkte_vorsprung_doppel', 1, 'INT'))
@@ -4604,23 +4590,14 @@ function adminEditTeamspielmodus(): void
$punkte_deckel_doppel = $punkte_sieg_doppel_separat
? max(0, $jInput->get('punkte_deckel_doppel', 0, 'INT'))
: $punkte_deckel_einzel;
// Eine Deckelung unterhalb der Siegbedingung wuerde das Spiel vor seinem eigenen Ziel
// beenden — das ist keine Konfiguration, sondern ein Zahlendreher. Dann gilt sie nicht.
if ($punkte_deckel_einzel != 0 && $punkte_deckel_einzel < abs($punkte_sieg_einzel))
$punkte_deckel_einzel = 0;
if ($punkte_deckel_doppel != 0 && $punkte_deckel_doppel < abs($punkte_sieg_doppel))
$punkte_deckel_doppel = 0;
// Vorsprung und Unentschieden schliessen sich aus: das negative Vorzeichen von
// punkte_sieg_* bedeutet „Remis bei Betrag - 1", und genau dieser Stand ist bei zwei
// Toren Vorsprung kein Endstand, sondern ein laufendes Spiel (5:5 bei Sieg 6). Wird ein
// Vorsprung gefordert, wird deshalb die Variante ohne Unentschieden gespeichert — sonst
// stuende in der Konfiguration zweierlei, das sich widerspricht.
if ($punkte_vorsprung_einzel > 1 && $punkte_sieg_einzel < 0)
$punkte_sieg_einzel = abs($punkte_sieg_einzel);
if ($punkte_vorsprung_doppel > 1 && $punkte_sieg_doppel < 0)
$punkte_sieg_doppel = abs($punkte_sieg_doppel);
// Ohne Siegbedingung („Beliebig") gibt es nichts, worauf sich Vorsprung oder Deckelung
// beziehen koennten.
if ($punkte_vorsprung_einzel <= 1) $punkte_deckel_einzel = 0;
if ($punkte_vorsprung_doppel <= 1) $punkte_deckel_doppel = 0;
if ($punkte_sieg_einzel == 0) {
@@ -4631,11 +4608,6 @@ function adminEditTeamspielmodus(): void
$punkte_vorsprung_doppel = 1;
$punkte_deckel_doppel = 0;
}
// Zweite Ebene: die Regel INNERHALB eines Satzes. Sie ergibt nur dort einen Sinn, wo ein
// Spiel ueberhaupt aus Saetzen besteht — bei „Einer" ist das Spiel der Satz, und die
// Regel steht bereits in punkte_sieg_*. 0 heisst „nicht hinterlegt".
// Vorzeichenbehaftet wie punkte_sieg_*: der Betrag ist der Siegwert, ein negatives
// Vorzeichen erlaubt zusaetzlich ein Unentschieden ein Tor darunter.
$satz_sieg_einzel = $jInput->get('satz_sieg_einzel', 0, 'INT');
$satz_sieg_doppel = $punkte_sieg_doppel_separat
? $jInput->get('satz_sieg_doppel', 0, 'INT')
@@ -4665,9 +4637,6 @@ function adminEditTeamspielmodus(): void
$satz_vorsprung_doppel = 1;
$satz_deckel_doppel = 0;
}
// Wie eine Ebene hoeher: eine Grenze unter dem Siegwert ist ein Zahlendreher, und ein
// gefordertes Mindestvorsprung schliesst das Unentschieden aus — bei zwei Toren
// Vorsprung ist ein 5:5 bei „Sieg 6, Remis 5" kein Endstand, sondern ein laufender Satz.
if ($satz_vorsprung_einzel > 1 && $satz_sieg_einzel < 0)
$satz_sieg_einzel = abs($satz_sieg_einzel);
if ($satz_vorsprung_doppel > 1 && $satz_sieg_doppel < 0)
@@ -4678,15 +4647,10 @@ function adminEditTeamspielmodus(): void
$satz_deckel_einzel = 0;
if ($satz_deckel_doppel != 0 && $satz_deckel_doppel < abs($satz_sieg_doppel))
$satz_deckel_doppel = 0;
// Wie viele Saetze ein Spiel hat. Eine Auswahl, zwei Familien: eine feste Zahl (alle
// werden gespielt, positiv) oder Gewinnsaetze (best of 2N-1, negativ). 0 = wie bisher.
$saetze_modus_einzel = $jInput->get('saetze_modus_einzel', 0, 'INT');
$saetze_modus_doppel = $punkte_sieg_doppel_separat
? $jInput->get('saetze_modus_doppel', 0, 'INT')
: $saetze_modus_einzel;
// Abweichende Regel fuer den Entscheidungssatz. Den gibt es nur bei Gewinnsaetzen: er
// ist der Satz, der nach N-1 zu N-1 noch aussteht. Bei fester Satzzahl gaebe es keinen,
// und ohne Angabe zur Satzzahl waere nicht bestimmbar, welcher es waere.
$entscheidung_sieg_einzel = $jInput->get('entscheidung_sieg_einzel', 0, 'INT');
$entscheidung_sieg_doppel = $punkte_sieg_doppel_separat
? $jInput->get('entscheidung_sieg_doppel', 0, 'INT')
@@ -4703,10 +4667,6 @@ function adminEditTeamspielmodus(): void
$saetze_modus_einzel = 0;
$saetze_modus_doppel = 0;
}
// Die Satzzahl wird ZUSAETZLICH nach punkte_sieg_* gespiegelt, damit eine aeltere
// Programmfassung dieselbe wahre Aussage liest: N Gewinnsaetze als N, eine feste
// Satzzahl als den Stand, bei dem sie entschieden ist. Umkehrung der Ueberfuehrung
// in update.php, also verlustfrei.
$sieg_aus_satzzahl = function ($modus) {
if ($modus < 0) return -$modus; // N Gewinnsaetze
if ($modus == 0) return null; // keine Angabe
@@ -4726,8 +4686,6 @@ function adminEditTeamspielmodus(): void
$punkte_vorsprung_doppel = 1;
$punkte_deckel_doppel = 0;
}
// Ohne Gewinnsaetze gibt es keinen Entscheidungssatz, und ohne eigene Siegbedingung
// keine Abweichung — dann bleiben die Felder auf ihren neutralen Werten.
if ($saetze_modus_einzel >= 0) $entscheidung_sieg_einzel = 0;
if ($saetze_modus_doppel >= 0) $entscheidung_sieg_doppel = 0;
if ($entscheidung_sieg_einzel == 0) {
@@ -4748,11 +4706,6 @@ function adminEditTeamspielmodus(): void
$entscheidung_deckel_einzel = 0;
if ($entscheidung_deckel_doppel != 0 && $entscheidung_deckel_doppel < abs($entscheidung_sieg_doppel))
$entscheidung_deckel_doppel = 0;
// Race-Modus: der Stand laeuft ueber die Begegnung durch.
//
// Das Ziel wird NICHT eingegeben — es ergibt sich aus der Spielfolge (Anzahl Spiele mal
// Schritt) und stuende sonst als zweite Wahrheit neben ihr. Mindestvorsprung, Grenze
// und Unentschieden gelten allein fuer das letzte Spiel, also fuer das Ziel.
$zaehlweise = $jInput->get('zaehlweise', 0, 'INT') != 0 ? 1 : 0;
$race_schritt = max(0, $jInput->get('race_schritt', 0, 'INT'));
$race_vorsprung = max(1, $jInput->get('race_vorsprung', 1, 'INT'));
@@ -4812,9 +4765,6 @@ function adminEditTeamspielmodus(): void
if (strlen($verknuepfungen) > 0)
$modus .= "|" . $verknuepfungen;
// Erst hier, weil das Ziel die Anzahl der Spiele braucht: Race setzt „ein Satz je Spiel"
// und „Spielergebnis als Spielpunkte" voraus, und das Ziel wird in die Altfelder gespiegelt
// — dieselbe wahre Aussage, die dort seit jeher steht („das Spiel ist bei N Toren
if ($zaehlweise == 1) {
$spiele_anzahl = count(array_filter(explode(",", explode("|", $modus)[0]), 'strlen'));
$race_ziel = $spiele_anzahl * $race_schritt;
@@ -4843,11 +4793,8 @@ function adminEditTeamspielmodus(): void
$punkte_vorsprung_doppel = 1;
$punkte_deckel_einzel = 0;
$punkte_deckel_doppel = 0;
// Eine Grenze unter dem Ziel waere ein Zahlendreher — und ohne geforderten
// Vorsprung endet das Rennen ohnehin exakt am Ziel.
if ($race_vorsprung <= 1 || ($race_deckel != 0 && $race_deckel < $race_ziel))
$race_deckel = 0;
// Vorsprung und Unentschieden schliessen sich aus, wie eine Ebene tiefer auch.
if ($race_vorsprung > 1 && $race_remis) {
$race_remis = 0;
$punkte_sieg_einzel = $race_ziel;
@@ -5548,7 +5495,6 @@ function adminSpielverlegungMailen(): void
$spielverlegung->genehmigt_von = "";
}
$query = "SELECT nachname, vorname, email"
. "\n FROM #__sportsmanager_vereinsansprechpartner"
. "\n WHERE verein_id IN ('$spielverlegung->heim_verein_id', '$spielverlegung->gast_verein_id')"
@@ -7203,7 +7149,6 @@ function adminEditSaison(): void
die($db->stderr(true));
}
redirectSportsManagerURL('&task=admin_saisons');
}
@@ -10988,16 +10933,6 @@ function adminEditBegegnungSpielplan($bestaetigen): void
}
// Kann ein Spiel dieses Satzmodus ueberhaupt unentschieden enden?
//
// Gleichstand ist nicht immer ein Unentschieden. Wo eine Zahl von GEWINNSAETZEN gilt, hat ein
// Spiel mit gleichem Satzstand noch keinen Sieger — es ist unfertig, und dafuer gibt es keinen
// Punkt. Ohne Angabe zur Satzzahl bleibt es beim bisherigen Verhalten.
//
// Steht bewusst auf Dateiebene und nicht als Closure im Speicher-Loop: die Spielpunkte werden
// an ZWEI Stellen berechnet — hier beim Speichern eines Spielberichts und in
// begegnungenAktualisieren() bei einer Modus-/Wettbewerbsaenderung. Dort fehlte die Regel,
// sodass beide Wege demselben Spiel verschiedene Spielpunkte gaben (gefunden 2026-09-08).
function remisMoeglich($saetze_modus): bool
{
if ($saetze_modus == 0) return true; // keine Angabe
@@ -11055,7 +10990,6 @@ function adminSaveBegegnungSpielplan(): void
redirectSportsManagerURL('&task=admin_begegnungen&veranstaltungid=' . $veranstaltungId . '#id' . $id, Text::_('COM_SPORTSMANAGER_MATCH_REPORT_WAS_DELETED'));
}
$query = "SELECT #__sportsmanager_begegnung.*, unbestaetigtes_ergebnis_id, zwischenergebnis,"
. " (SELECT COUNT(*) FROM #__sportsmanager_begegnung_historie WHERE #__sportsmanager_begegnung_historie.begegnung_id = #__sportsmanager_begegnung.begegnung_id) AS verlegen_aktionen"
. "\n FROM #__sportsmanager_begegnung"
@@ -11217,8 +11151,6 @@ function adminSaveBegegnungSpielplan(): void
} else {
$spiel_heim_punkte_detailliert = $begegnung_input->get('spiel_' . $spiel_nr . '_heim_punkte_detailliert', array(), 'ARRAY');
$spiel_gast_punkte_detailliert = $begegnung_input->get('spiel_' . $spiel_nr . '_gast_punkte_detailliert', array(), 'ARRAY');
// Durchweg leere Satzfelder sind keine Aussage ueber Saetze, sondern „hier wurde
// nichts eingetragen" — sonst loescht blosses Oeffnen und Speichern den Altbestand.
$satzfelder_leer = true;
foreach ($spiel_heim_punkte_detailliert as $wert) {
if ($wert !== '' && $wert !== null) {
@@ -11241,9 +11173,6 @@ function adminSaveBegegnungSpielplan(): void
if (empty($spiel_heim_punkte_detailliert)) {
$spiel_heim_punkte = $begegnung_input->get('spiel_' . $spiel_nr . '_heim_punkte', 0, 'INT');
$spiel_gast_punkte = $begegnung_input->get('spiel_' . $spiel_nr . '_gast_punkte', 0, 'INT');
// Wo der Wettbewerb Ergebnisse JE SATZ fuehrt, bleibt ergebnis_detailliert bei einer
// Meldung ohne Satzfelder LEER: das eine Paar bedeutet dort Saetze, und wer es als
// Tore liest, rechnet 1:0 statt 3:1. Der Satzstand steht in teamspiel_*_punkte.
$ergebnis_detailliert = ($spiel_heim_punkte == 0 && $spiel_gast_punkte == 0)
|| !empty($teamspiel_modus->satzergebnisse)
? ''
@@ -11303,8 +11232,6 @@ function adminSaveBegegnungSpielplan(): void
$spiel_gast_spieler_2_id = $t;
}
// Echte Satzergebnisse nicht durch ihren eigenen Spiegel ersetzen: bringt ein Aufruf
// keine Satzfelder mit und stehen im Bestand mehrere Paare, bleibt der Detailtext.
if (isset($spiel_heim_punkte_detailliert) && empty($spiel_heim_punkte_detailliert)
&& isset($spiele_nummern[$spiel_nr])) {
$bestand = $spiele_nummern[$spiel_nr];
@@ -12049,7 +11976,6 @@ function GruppenspieleMatrix($anzahlteams): array
die("This case is invalid: Nr of teams " . $anzahlteams);
}
//Spieltag_Nr;Spiel_Nr;Heim14;Gast14;Heim12;Gast12;Heim10;Gast10;Heim8;Gast8;Heim6;Gast6;Heim4;Gast4
//Folgende Zeilen dürfen nicht eingrückt werden.
$str_Setzliste_Matrix =
@@ -12333,7 +12259,6 @@ function adminBegegnungenGenerierenForm(): void
$Begegnung[$Zeile]['spiel_nr'] = $spielnr;
$Zeile++;
if ($runden == 2) {
$weiterer_spieltag = $spieltag + $spieltage;
@@ -13550,7 +13475,6 @@ function sportsmanagerExportErgaenzeSpielberichte($db, int $veranstaltungId, arr
$spielmodus = loadObjectList($db, $query);
$Anzahl_Saetze = count(explode(",", $spielmodus[0]->modus));
foreach ($rows as $value) {
$value->vorgeschlagen_um = "";
@@ -14743,7 +14667,6 @@ function adminImportTurnierdisziplinMeldungenSpieleForm(): void
}
}
#[NoReturn] function adminImportTurnierdisziplinMeldungenSpiele(): void
{
$db = getDatabase();
@@ -15956,8 +15879,6 @@ function adminImportTurnierdisziplinMeldungenSpieleForm(): void
}
}
foreach (array(1, 2, 3, 10) as $rundenstufe) {
$query = "SELECT runde, COUNT(*) AS spiele"
. "\n FROM #__sportsmanager_turnierspiel"
@@ -19019,7 +18940,6 @@ function adminEditTermineLand($admin_uebersicht): void
$land = $db->escape(trim($jInput->get('land', '', 'RAW')));
$termine_umbenennen = $jInput->get('termine_umbenennen', 0, 'INT');
if ($termine_umbenennen) {
$query = "SELECT * FROM #__sportsmanager_termin_land WHERE termin_land_id = $id";
$rows = loadObjectList($db, $query);
@@ -5789,22 +5789,6 @@ function updateDatabase(): void
if ($datenbank_version < 122) {
// Siegbedingungen vollstaendig abbilden (Issue #304). Muss der LETZTE Block der
// Kette bleiben, sonst bleibt die kleinere Versionsnummer stehen.
//
// Wertebereiche der neuen Spalten:
// satz_sieg_* 0 = nicht hinterlegt; sonst Betrag = Siegwert, negativ
// erlaubt ein Remis ein Tor darunter (wie punkte_sieg_*)
// saetze_modus_* 0 = wie bisher, N > 0 = feste Satzzahl, -N = N Gewinnsaetze
// entscheidung_* 0 = keine Abweichung vom satz_*-Wert
// zaehlweise 0 = je Spiel, 1 = Race (Stand laeuft durch die Begegnung)
//
// satzergebnisse ist eine EIGENE Spalte und kein dritter punktetyp-Wert: punktetyp
// ist das Feld, aus dem fremde Anwendungen ablesen, ob die Punkte eines Spiels Tore
// oder Saetze sind, und kennt seit jeher zwei Werte.
//
// Alle Vorgabewerte beschreiben das heutige Verhalten; keine bestehende Spalte wird
// angetastet.
$columns = $db->getTableColumns('#__sportsmanager_teamspiel_modus');
if (!array_key_exists('satzergebnisse', $columns)) {
$query = "ALTER TABLE `#__sportsmanager_teamspiel_modus`"
@@ -5838,12 +5822,6 @@ function updateDatabase(): void
}
}
// Bestehende „Mehrere"-Modi in die Satzzahl ueberfuehren — die Umkehrung der
// Spiegelung, die der Editor beim Speichern vornimmt:
// punkte_sieg_* 1 -> ein fester Satz
// N -> N Gewinnsaetze (haeufigere der beiden Lesarten)
// -N -> feste Satzzahl 2(N-1) (Remis setzt alle Saetze voraus)
// 0 -> bleibt 0 („Beliebig")
$query = "UPDATE #__sportsmanager_teamspiel_modus"
. "\n SET saetze_modus_einzel = CASE"
. "\n WHEN punktetyp = 0 THEN 0"
@@ -1773,7 +1773,6 @@ function veranstaltung(): void
// Anzeigen
HTML_sportsmanager::veranstaltungHeaderAlone($veranstaltung, $vorherige_veranstaltung_id, $naechste_veranstaltung_id, $showSeasons, $saisons, $filter_saison_id);
if (!in_array($veranstaltung->tabellenwertung, [0, -1, -3, -4]))
tabelle($veranstaltung, $spieltag, true);
@@ -2338,9 +2337,6 @@ function getTabelleSpieltag($veranstaltung,$spieltag,$mannschaften = "",$offset_
jexit();
}
function erstelleSetzliste($teams): array
{
$seedingPairs[4] = [[1, 4], [2, 3]];
@@ -2350,7 +2346,6 @@ function erstelleSetzliste($teams): array
$seedingPairs[16] = [[1, 16], [8, 9], [5, 12], [4, 13],
[3, 14], [6, 11], [7, 10], [2, 15]];
$seedingPairs[32] = [[1, 32], [16, 17], [9, 24], [8, 25],
[5, 28], [12, 21], [13, 20], [4, 29],
[3, 30], [14, 19], [11, 22], [6, 27],
@@ -2374,8 +2369,6 @@ function erstelleSetzliste($teams): array
[7,122], [58,71], [39,90], [26,103], [23,106], [42,87], [55,74], [10,119],
[15,114], [50,79], [47,82], [18,111], [31,98], [34,95], [63,66], [2,127]];
$matches = [];
// Teams durchschütteln
@@ -2439,7 +2432,6 @@ function getSetzliste($anzahlRunden)
$seedingPairs[16] = [[1, 16], [8, 9], [5, 12], [4, 13],
[3, 14], [6, 11], [7, 10], [2, 15]];
$seedingPairs[32] = [[1, 32], [16, 17], [9, 24], [8, 25],
[5, 28], [12, 21], [13, 20], [4, 29],
[3, 30], [14, 19], [11, 22], [6, 27],
@@ -2577,7 +2569,6 @@ function turnierbaumAnzeigen($veranstaltung): void
}
}
//Alle Begegnungen aus Datenbank
$query = "SELECT t4.bezeichnung AS Liga, t1.zeitpunkt AS Spielstart,"
. "\n if(t2.teamname_kurz <> '',t2.teamname_kurz, t2.teamname) AS Heim,"
@@ -3495,7 +3486,6 @@ function mannschaften($ansicht_vereinigt): void
$jInput = Factory::getContainer()->get(SiteApplication::class)->input;
$filter_saison_id = $jInput->get('filter_saison_id', 0, 'INT');
if ($filter_saison_id == 0)
$filter_saison_id = $jInput->cookie->get('sportsmanager_filter_saison_id', 0, 'INT');
@@ -3519,7 +3509,6 @@ function mannschaften($ansicht_vereinigt): void
$filter_saison_id = $saisons[0]->saison_id;
}
if (!isJson()) {
HTML_sportsmanager::teamsHeader($params->get('titel'), $params->get('beschreibung'), $saisons, $filter_saison_id);
}
@@ -3576,7 +3565,6 @@ function mannschaften($ansicht_vereinigt): void
}
function mannschaftDetails($ansicht_vereinigt, $unabhaengige_ansicht = false): void
{
$db = getDatabase();
@@ -4422,7 +4410,6 @@ function verbandsorganeDetails($uebergabe_id = 0): void
global $params;
$user_id = isExternalDatabase() ? 0 : (isJson() ? getUserID() : $app->getIdentity()->id);
if ($user_id > 0)
$erweiterte_anzeige = true;
@@ -7788,10 +7775,6 @@ function turniervoranmeldungen(): void
administrationFooter();
}
/// Die Einheit der Spalten „T +/-" einer Bestenliste: 0 = Tore, 1 = Saetze, null = gemischt
/// oder unbekannt. Die Werte sind die Summe der teamspiel_*_punkte, und die zaehlen je
/// punktetyp Tore oder gewonnene Saetze. Eine Bestenliste kann mehrere Wettbewerbe umfassen —
/// dann gibt es keine gemeinsame Einheit.
function spielerstatistikEinheit($bestenliste_id): ?int
{
$db = getDatabase();
@@ -7804,7 +7787,6 @@ function spielerstatistikEinheit($bestenliste_id): ?int
if (count($rows) != 1) {
return null;
}
// Individualwettbewerbe kennen keinen punktetyp; sind welche dabei, ist die Einheit offen.
$query = "SELECT COUNT(*) FROM #__sportsmanager_bestenliste_individualwettbewerb"
. "\n WHERE bestenliste_id = " . (int)$bestenliste_id;
if (!empty(loadResult($db, $query))) {
@@ -1017,7 +1017,6 @@ static function turnierdisziplin($turnier, $disziplin, $meldungen, $meldungenSpi
bilder_zeigen();
}
window.addEventListener("resize", onResize);
</script>
@@ -1598,14 +1597,9 @@ if (count($spiele) > 0) {
<td style="text-align: center" nowrap>
<?php
// Der Stand des Spiels, und die Satzergebnisse dahinter, wo sie einzeln
// erfasst sind. Bisher stand hier NUR ergebnis_detailliert: bei reinem
// „Mehrere" ist das derselbe Stand, bei Erfassung je Satz sind es die
// Saetze — und dann fehlte, wer das Spiel gewonnen hat.
$stand = $spiel->teamspiel_heim_punkte . ':' . $spiel->teamspiel_gast_punkte;
$saetze = str_replace(" ", " | ", (string)$spiel->ergebnis_detailliert);
if ($saetze === '' && $spiel->teamspiel_heim_punkte == 0 && $spiel->teamspiel_gast_punkte == 0) {
// Nicht gespielt: wie bisher leer, kein „0:0".
} else if ($saetze === '' || $saetze === $stand) {
echo htmlentities_utf8($saetze !== '' ? $saetze : $stand);
} else {
@@ -1802,9 +1796,6 @@ static function tabelleAnzeigen($veranstaltung, $modus, $teams, $spieltag, $spie
<strong><?php echo Text::_('COM_SPORTSMANAGER_PENALTY'); ?></strong></th>
<?php
}
// Die Spalte zaehlt bei „Einer" Tore und bei „Mehrere" Saetze — sie hiess
// bisher in beiden Faellen „Tore", weil die Bedingung auf punktetyp == 2
// prueft und punktetyp nur 0 und 1 kennt.
if ($veranstaltung->tabellenwertung != 3 && $veranstaltung->tabellenwertung != 6 && $veranstaltung->tabellenwertung != 9 && $veranstaltung->tabellenwertung != 23 && $veranstaltung->tabellenwertung != 26 && $veranstaltung->tabellenwertung != 29) {
if ($alleine_angezeigt && $praesentation == 0) {
?>
@@ -6949,10 +6940,6 @@ static function spielerstatistik($spielerstatistik, $spielerstatistik_punkte, $a
<strong><?php echo Text::_('COM_SPORTSMANAGER_DEFEATS_SHORTCUT'); ?></strong>
</th>
<?php
// Die Spalten summieren teamspiel_*_punkte — je punktetyp also Tore oder
// gewonnene Saetze. Umfasst die Bestenliste beides (oder auch
// Individualwettbewerbe), gibt es keine gemeinsame Einheit; dann steht
// „Punkte", statt eine zu behaupten.
$einheit_lang = $einheit === 0 ? 'COM_SPORTSMANAGER_GOALS'
: ($einheit === 1 ? 'COM_SPORTSMANAGER_SETS' : 'COM_SPORTSMANAGER_POINTS');
$einheit_kurz = $einheit === 0 ? 'COM_SPORTSMANAGER_GOALS_SHORTCUT'
@@ -7927,7 +7914,6 @@ static function ranglistenHeader($titel, $beschreibung, $saisons, $filter_saison
{
global $params;
if (!empty($titel)) { ?>
<div
class="componentheading<?php echo $params->get('pageclass_sfx'); ?>"><?php echo htmlentities_utf8($titel); ?></div><?php }
@@ -8142,7 +8128,6 @@ static function ranglistenpunkte($rangliste, $rangliste_punkte, $turnierdiszipli
?>
<div class="uk-overflow-auto">
<table class="uk-table uk-table-middle"
style="width: 100%; border: none; border-spacing: 0; padding: 3px">
@@ -4642,11 +4642,6 @@ class HTML_sportsmanager_admin
static function adminEditTeamspielmodus($row): void
{
global $params;
// „Doppel separat" war bisher allein an punkte_sieg_* abzulesen. Seit Vorsprung,
// Deckelung und der Satzregel dazugehoeren, reicht das nicht mehr: zwei Modi mit
// gleicher Siegbedingung, aber verschiedenem Vorsprung im Doppel haetten ihre
// Doppel-Zeilen sonst versteckt — und beim naechsten Speichern waere der
// abweichende Wert stillschweigend ueberschrieben worden.
$doppel_separat = !empty($row) && (
$row->punkte_sieg_einzel != $row->punkte_sieg_doppel
|| ($row->punkte_vorsprung_einzel ?? 1) != ($row->punkte_vorsprung_doppel ?? 1)
@@ -4658,22 +4653,13 @@ class HTML_sportsmanager_admin
|| ($row->entscheidung_sieg_einzel ?? 0) != ($row->entscheidung_sieg_doppel ?? 0)
|| ($row->entscheidung_vorsprung_einzel ?? 1) != ($row->entscheidung_vorsprung_doppel ?? 1)
|| ($row->entscheidung_deckel_einzel ?? 0) != ($row->entscheidung_deckel_doppel ?? 0));
// Die Satzregel gibt es nur, wo ein Spiel aus Saetzen besteht.
$saetze_moeglich = !empty($row) && $row->punktetyp != 0;
// Einen Entscheidungssatz gibt es nur bei Gewinnsaetzen: er ist der Satz, der nach
// N-1 zu N-1 noch aussteht. Bei fester Satzzahl gibt es keinen.
$entscheidung_moeglich = $saetze_moeglich && ($row->saetze_modus_einzel ?? 0) < 0;
$entscheidung_moeglich_doppel = $doppel_separat && !empty($row)
&& $row->punktetyp != 0 && ($row->saetze_modus_doppel ?? 0) < 0;
// Wer die Satzzahl waehlt, legt damit die Siegbedingung des Spiels fest — Vorsprung und
// Deckelung auf Spielebene haetten daneben nichts mehr zu sagen.
$eigene_spielregel_verborgen = $saetze_moeglich;
$eigene_spielregel_verborgen_doppel = $saetze_moeglich;
// Im Race-Modus laeuft der Stand ueber die Begegnung durch; die Regeln des
// einzelnen Spiels und des Satzes gibt es dort nicht.
$race_an = !empty($row) && ($row->zaehlweise ?? 0) != 0;
// Die Einheit der Spielebene haengt an punktetyp: Tore bei „Einer", gewonnene
// Saetze bei „Mehrere". Vorher stand in beiden Faellen „Punkte".
$einheit_option = function ($wert, $gewaehlt, $tore, $saetze) use ($saetze_moeglich) {
return "<option value=\"" . $wert . "\"" . ($gewaehlt ? " selected" : "")
. " data-tore=\"" . htmlentities_utf8($tore) . "\""
@@ -4689,7 +4675,6 @@ class HTML_sportsmanager_admin
: <?php echo($row != null ? Text::_('COM_SPORTSMANAGER_CHANGING') : Text::_('COM_SPORTSMANAGER_ADD')); ?></div>
<style>
/* Die Zellen dieses Formulars tragen alle `nowrap` richtig fuer Beschriftungen
und Auswahlfelder, falsch fuer Prosa: die Hinweise zogen die Tabelle beliebig
breit (Sven 2026-09-02). Sie brechen deshalb ausdruecklich um, und zwar mit
einem Mass: ohne max-width liefe eine Zeile auf einem breiten Bildschirm ueber
@@ -4702,20 +4687,12 @@ class HTML_sportsmanager_admin
</style>
<script type="text/javascript">
function punkte_sieg_doppel_anzeigen() {
// Vorsprung, Deckelung und die Satzregel gehoeren zur Siegbedingung — eine
// Schaltung fuer alle, statt eines Knopfes je Zeile.
document.adminForm.punkte_sieg_doppel_separat.value =
document.adminForm.punkte_sieg_doppel_separat.value == 1 ? 0 : 1;
zeilen_anzeigen();
}
// Welche Zeilen sichtbar sind, haengt an genau zwei Schaltern: „Doppel separat"
// und der Frage, ob nach Saetzen gespielt wird. Beide werden hier zusammen
// ausgewertet, damit kein Zustand uebrig bleibt, den niemand herstellen wollte
// (etwa eine Satz-Doppel-Zeile ohne Saetze).
function zeilen_anzeigen() {
// Race blendet alles aus, was das EINZELNE Spiel und den Satz beschreibt:
// dort laeuft ein einziger Zaehler ueber die ganze Begegnung.
var race = document.adminForm.zaehlweise != null
&& document.adminForm.zaehlweise.value == 1;
var separat = document.adminForm.punkte_sieg_doppel_separat.value == 1;
@@ -4724,21 +4701,14 @@ class HTML_sportsmanager_admin
var el = document.getElementById(id);
if (el != null) el.style.display = an ? '' : 'none';
};
// Ohne geforderten Vorsprung endet ein Spiel exakt beim Siegwert — dann
// kann eine Grenze nie greifen, also wird sie auch nicht angeboten.
var vorsprung = function (name) {
var el = document.adminForm[name];
return el == null ? 1 : Number(el.value);
};
// Die Satzzahl-Auswahl bestimmt die Siegbedingung des Spiels mit: bei
// Gewinnsaetzen IST sie die Siegbedingung, bei fester Zahl gibt es keine.
// Deshalb wird das Feld dann nicht mehr angeboten, statt zwei Angaben
// nebeneinander zu stellen, von denen eine die andere ueberschreibt.
var wahl_einzel = saetze ? Number(document.adminForm.saetze_modus_einzel.value) : 0;
var wahl_doppel = separat && saetze
? Number(document.adminForm.saetze_modus_doppel.value)
: wahl_einzel;
// Die Einheit der Spielebene: Tore bei „Einer", Saetze bei „Mehrere".
var einheit = saetze ? 'saetze' : 'tore';
var felder = ['punkte_sieg_einzel', 'punkte_sieg_doppel',
'punkte_vorsprung_einzel', 'punkte_vorsprung_doppel',
@@ -4752,8 +4722,6 @@ class HTML_sportsmanager_admin
if (text != null) sel.options[o].textContent = text;
}
}
// Das Ziel folgt aus der Spielfolge; es wird nicht eingegeben, sondern
// hier laufend nachgerechnet, damit es beim Aendern der Folge mitgeht.
if (race) {
var spiele = 0;
for (var n = 1; ; n++) {
@@ -4779,8 +4747,6 @@ class HTML_sportsmanager_admin
zeigen("row_race_ziel", race);
zeigen("row_race_vorsprung", race);
zeigen("row_race_deckel", race && vorsprung('race_vorsprung') > 1);
// Mit gefordertem Vorsprung endet das Rennen nie auf Gleichstand — ein
// Unentschieden anzubieten waere eine Regel, die sich selbst widerspricht.
zeigen("row_race_remis", race && vorsprung('race_vorsprung') <= 1);
zeigen("row_gruppe_spiel", !race);
zeigen("row_gruppe_satz", saetze);
@@ -4790,8 +4756,6 @@ class HTML_sportsmanager_admin
zeigen("row_saetze_modus_einzel", saetze);
zeigen("row_saetze_modus_doppel", saetze && separat);
zeigen("row_spielpunkte_wertung_doppel", !race && document.getElementById("row_spielpunkte_wertung_doppel") != null && document.adminForm.spielpunkte_wertung_doppel_separat.value == 1);
// Wer eine Satzzahl waehlt, hat die Siegbedingung des Spiels damit gesagt —
// Vorsprung und Deckelung auf Spielebene haetten daneben nichts mehr zu melden.
zeigen("row_punkte_sieg_einzel", !race && !saetze);
zeigen("row_punkte_sieg_doppel", !race && !saetze && separat);
zeigen("row_punkte_vorsprung_einzel", !race && !saetze);
@@ -4816,8 +4780,6 @@ class HTML_sportsmanager_admin
: '<?php echo Text::_('COM_SPORTSMANAGER_GAME_DOUBLES_SEPARATELY');?>';
}
// Spielfolge und Verknuepfungen: hinzufuegen und entfernen ohne Rueckfrage — es ist
// nichts gespeichert, bis der Modus gespeichert wird (Sven 2026-09-01).
function _zeilenZustand(praefix, anzahl) {
var letzte = 0;
for (var i = 1; i <= anzahl; i++) {
@@ -4882,10 +4844,6 @@ class HTML_sportsmanager_admin
if (zeile != null) zeile.style.display = 'none';
}
// „Saetze pro Spiel" zu aendern rechnet nichts um: aus sechs Toren werden sechs
// Saetze, aus drei Saetzen drei Tore. Umrechnen KOENNTE man es auch nicht — aus
// „drei gewonnene Saetze" folgt keine Torzahl. Also wird gefragt, wo schon
// Ergebnisse stehen, und sonst geschwiegen (Sven 2026-09-01).
var _punktetyp_vorher = <?php echo !empty($row->satzergebnisse) ? 2 : (int)($row->punktetyp ?? 0); ?>;
var _hat_ergebnisse = <?php echo !empty($row->hat_ergebnisse) ? 'true' : 'false'; ?>;
@@ -4917,9 +4875,6 @@ class HTML_sportsmanager_admin
<tr>
<td colspan="2" style="padding-bottom: 1em">
<?php
// Die Begriffe stehen vor den Einstellungen, weil
// sie ineinander stecken und die Gruppen unten
// genau dieser Leiter folgen.
?>
<small class="sm_hinweis"><?php echo Text::_('COM_SPORTSMANAGER_MODE_GLOSSARY'); ?></small>
</td>
@@ -4990,10 +4945,6 @@ class HTML_sportsmanager_admin
<select class="uk-select uk-form-width-large" name="race_schritt"
id="race_schritt" size="1" onChange="zeilen_anzeigen();">
<?php
// Sechs ist der Schritt, mit dem der Race-Modus gespielt wird; ohne
// Vorgabe stuende hier sonst die 1, weil der Browser die erste
// Auswahl nimmt — und die Wahl der Zaehlweise haette eine Regel
// gesetzt, die niemand gemeint hat (Sven 2026-09-02).
$race_schritt_vorgabe = ($row->race_schritt ?? 0) > 0
? (int)$row->race_schritt
: 6;
@@ -5011,11 +4962,6 @@ class HTML_sportsmanager_admin
</td>
<td nowrap>
<span class="sm_hinweis" id="race_ziel"><?php
// Immer die Rechenvorschrift, und die konkrete Zahl erst ab zwei
// Spielen: bei einem einzigen (der Anfangszustand) waere „1 Spiele
// × 6 = 6 Tore" nicht nur ungrammatisch, sondern eine Auskunft
// ueber einen Zustand, den niemand gemeint hat — die Spielfolge ist
// dann ja noch nicht eingetragen (Sven 2026-09-02).
$race_spiele = $row != null ? count(array_filter(explode(",", explode("|", $row->modus)[0]), 'strlen')) : 0;
$race_schritt_wert = ($row->race_schritt ?? 0) > 0 ? (int)$row->race_schritt : 6;
$race_ziel_text = Text::_('COM_SPORTSMANAGER_RACE_TARGET_FORMULA');
@@ -5116,7 +5062,6 @@ class HTML_sportsmanager_admin
</td>
</tr>
<tr id="row_gruppe_spiel"<?php if ($race_an) echo " style=\"display:none\""; ?>>
<td nowrap colspan="2" style="padding-top: 1em">
<strong><?php echo Text::_('COM_SPORTSMANAGER_GROUP_GAME'); ?></strong>
@@ -5132,11 +5077,6 @@ class HTML_sportsmanager_admin
<select class="uk-select uk-form-width-large" name="punktetyp"
id="point_type" size="1" onChange="zeilen_anzeigen();">
<?php
// Drei Eintraege, zwei Felder: der dritte ist „Mehrere" samt der
// Angabe, dass die Saetze einzeln eingetragen werden. punktetyp
// behaelt seine beiden ueberlieferten Werte, damit eine fremde
// Anwendung weiter ablesen kann, ob die Punkte eines Spiels Tore
// oder gewonnene Saetze sind (Datenbankversion 122).
$typ = array(Text::_('COM_SPORTSMANAGER_ONE'), Text::_('COM_SPORTSMANAGER_MULTIPLE'), Text::_('COM_SPORTSMANAGER_MULTIPLE_WITH_SETS'));
$gewaehlt = $row != null
? (!empty($row->satzergebnisse) ? 2 : (int)$row->punktetyp)
@@ -5160,16 +5100,8 @@ class HTML_sportsmanager_admin
name="spielpunkte_wertung_einzel" id="points_valuation_single"
size="1">
<?php
// Die vierte Wertung hiess „Keine" und sagte damit das Gegenteil dessen, was
// sie tut: gewertet wird alles, nur ohne Umrechnung — das Ergebnis des
// Spiels IST sein Spielpunktestand (admin.php: $spiel_heim_spielpunkte =
// $spiel_heim_punkte). Welche Zahl das ist, sagt punktetyp: Tore bei
// „Einer", Saetze bei „Mehrere" (Sven 2026-09-01).
$typ = array(Text::_('COM_SPORTSMANAGER_WIN_1_POINT'), Text::_('COM_SPORTSMANAGER_WIN_2_POINTS'), Text::_('COM_SPORTSMANAGER_WIN_3_POINTS'), Text::_('COM_SPORTSMANAGER_RESULT_AS_GAME_POINTS'));
$typ_wert = array(3, 0, 1, 2);
// Die vierte Wertung heisst nach der Einheit, die sie uebernimmt: Tore bei
// „Einer", Saetze bei „Mehrere". Beide Texte haengen an der Option, das
// Umschalten macht zeilen_anzeigen() (Sven 2026-09-08).
$einheit_attr = ' data-tore="' . htmlspecialchars(Text::_('COM_SPORTSMANAGER_RESULT_AS_GAME_POINTS_GOALS'), ENT_QUOTES) . '"'
. ' data-saetze="' . htmlspecialchars(Text::_('COM_SPORTSMANAGER_RESULT_AS_GAME_POINTS_SETS'), ENT_QUOTES) . '"';
for ($i = 0; $i <= 3; $i++) {
@@ -5210,11 +5142,6 @@ class HTML_sportsmanager_admin
</td>
<td nowrap>
<?php
// Eigene Zeile, weil dieser Knopf ALLE Doppel-Zeilen schaltet — auch die
// der Satzregel und des Entscheidungssatzes. Solange er in der Zeile
// „Spiel abgeschlossen bei" sass, verschwand er mit ihr, sobald eine
// Satzzahl gewaehlt war; die Satzregel liess sich dann nicht mehr
// getrennt einstellen.
?>
<input type="button"
value="<?php echo $doppel_separat ? Text::_('COM_SPORTSMANAGER_GAME_DOUBLES_IDENTICAL') : Text::_('COM_SPORTSMANAGER_GAME_DOUBLES_SEPARATELY'); ?>"
@@ -5233,21 +5160,12 @@ class HTML_sportsmanager_admin
id="saetze_modus_einzel" size="1" onChange="zeilen_anzeigen();">
<option value="0"<?php if ($row == null || ($row->saetze_modus_einzel ?? 0) == 0) echo " selected"; ?>><?php echo Text::_('COM_SPORTSMANAGER_ANY'); ?></option>
<?php
// Positiv = feste Satzzahl (alle werden gespielt), negativ = Gewinnsaetze.
// „Beliebig" heisst: der Wettbewerb legt die Satzzahl nicht fest, dann
// gilt allein die Siegbedingung des Spiels — der Zustand, den jeder
// Bestandsmodus VOR der Migration hatte.
for ($i = 1; $i <= 12; $i++) {
echo "<option value=\"" . $i . "\"" . ($row != null ? (($row->saetze_modus_einzel ?? 0) == $i ? " selected" : "") : "") . ">" . htmlentities_utf8($i == 1 ? Text::_('COM_SPORTSMANAGER_ONE_FIXED_SET') : Text::sprintf('COM_SPORTSMANAGER_NUMBER_FIXED_SETS', $i)) . "</option>";
}
for ($i = 2; $i <= 6; $i++) {
echo "<option value=\"" . (-$i) . "\"" . ($row != null ? (($row->saetze_modus_einzel ?? 0) == -$i ? " selected" : "") : "") . ">" . htmlentities_utf8(Text::sprintf('COM_SPORTSMANAGER_NUMBER_WINNING_SETS', $i)) . "</option>";
}
// Ein vorhandener Wert ausserhalb der angebotenen Bereiche bekommt
// seinen eigenen Eintrag — sichtbar und unveraendert speicherbar,
// aber nicht neu waehlbar, sobald man ihn weggestellt hat (Sven
// 2026-09-02). So bleibt eine ungewoehnliche Bestandszahl erhalten,
// ohne dass das Formular sie zur Empfehlung macht.
$vorhanden = (int)($row->saetze_modus_einzel ?? 0);
if ($vorhanden != 0
&& !($vorhanden >= 1 && $vorhanden <= 12)
@@ -5274,21 +5192,12 @@ class HTML_sportsmanager_admin
id="saetze_modus_doppel" size="1" onChange="zeilen_anzeigen();">
<option value="0"<?php if ($row == null || ($row->saetze_modus_doppel ?? 0) == 0) echo " selected"; ?>><?php echo Text::_('COM_SPORTSMANAGER_ANY'); ?></option>
<?php
// Positiv = feste Satzzahl (alle werden gespielt), negativ = Gewinnsaetze.
// „Beliebig" heisst: der Wettbewerb legt die Satzzahl nicht fest, dann
// gilt allein die Siegbedingung des Spiels — der Zustand, den jeder
// Bestandsmodus VOR der Migration hatte.
for ($i = 1; $i <= 12; $i++) {
echo "<option value=\"" . $i . "\"" . ($row != null ? (($row->saetze_modus_doppel ?? 0) == $i ? " selected" : "") : "") . ">" . htmlentities_utf8($i == 1 ? Text::_('COM_SPORTSMANAGER_ONE_FIXED_SET') : Text::sprintf('COM_SPORTSMANAGER_NUMBER_FIXED_SETS', $i)) . "</option>";
}
for ($i = 2; $i <= 6; $i++) {
echo "<option value=\"" . (-$i) . "\"" . ($row != null ? (($row->saetze_modus_doppel ?? 0) == -$i ? " selected" : "") : "") . ">" . htmlentities_utf8(Text::sprintf('COM_SPORTSMANAGER_NUMBER_WINNING_SETS', $i)) . "</option>";
}
// Ein vorhandener Wert ausserhalb der angebotenen Bereiche bekommt
// seinen eigenen Eintrag — sichtbar und unveraendert speicherbar,
// aber nicht neu waehlbar, sobald man ihn weggestellt hat (Sven
// 2026-09-02). So bleibt eine ungewoehnliche Bestandszahl erhalten,
// ohne dass das Formular sie zur Empfehlung macht.
$vorhanden = (int)($row->saetze_modus_doppel ?? 0);
if ($vorhanden != 0
&& !($vorhanden >= 1 && $vorhanden <= 12)
@@ -5363,7 +5272,6 @@ class HTML_sportsmanager_admin
<select class="uk-select uk-form-width-large" name="punkte_vorsprung_einzel"
id="points_margin_single" size="1" onChange="zeilen_anzeigen();">
<?php
// Ein Vorsprung von 1 ist das bisherige Verhalten und bleibt die Vorgabe.
for ($i = 1; $i <= 10; $i++) {
echo $einheit_option($i, $row != null ? $row->punkte_vorsprung_einzel == $i : $i == 1,
$i == 1 ? Text::_('COM_SPORTSMANAGER_NO_MARGIN') : Text::sprintf('COM_SPORTSMANAGER_NUMBER_GOALS', $i),
@@ -5404,8 +5312,6 @@ class HTML_sportsmanager_admin
<option
value="0"><?php echo Text::_('COM_SPORTSMANAGER_GAME_CAP_NONE'); ?></option>
<?php
// Die Deckelung beendet das Spiel unabhaengig vom Vorsprung; darunter kann
// es also kein Unentschieden mehr geben.
for ($i = 2; $i <= 60; $i++) {
echo $einheit_option($i, $row != null && $row->punkte_deckel_einzel == $i,
Text::sprintf('COM_SPORTSMANAGER_NUMBER_GOALS', $i),
@@ -5454,11 +5360,6 @@ class HTML_sportsmanager_admin
value="0"><?php echo Text::_('COM_SPORTSMANAGER_ANY'); ?></option>
<?php
for ($i = 1; $i <= 60; $i++) {
// Wie eine Ebene hoeher entscheidet das Vorzeichen, ob ein Satz remis
// enden kann: der Betrag ist der Siegwert, ein negatives
// Vorzeichen erlaubt zusaetzlich ein Unentschieden eine Tor
// darunter. Ohne diese Faelle waere ein Satz, der remis endet,
// gar nicht hinterlegbar (Sven 2026-09-01).
echo "<option value=\"" . $i . "\"" . ($row != null ? (($row->satz_sieg_einzel ?? 0) == $i ? " selected" : "") : "") . ">" . htmlentities_utf8(($i == 1 ? Text::_('COM_SPORTSMANAGER_ONE_GOAL') : Text::sprintf('COM_SPORTSMANAGER_NUMBER_GOALS', $i)) . Text::_('COM_SPORTSMANAGER_SUFFIX_NO_DRAW')) . "</option>";
if ($i != 1)
echo "<option value=\"" . (-$i) . "\"" . ($row != null ? (($row->satz_sieg_einzel ?? 0) == (-$i) ? " selected" : "") : "") . ">" . htmlentities_utf8(Text::sprintf('COM_SPORTSMANAGER_NUMBER_GOALS', $i) . Text::sprintf('COM_SPORTSMANAGER_SUFFIX_DRAW_AT', ($i - 1), ($i - 1))) . "</option>";
@@ -5480,11 +5381,6 @@ class HTML_sportsmanager_admin
value="0"><?php echo Text::_('COM_SPORTSMANAGER_ANY'); ?></option>
<?php
for ($i = 1; $i <= 60; $i++) {
// Wie eine Ebene hoeher entscheidet das Vorzeichen, ob ein Satz remis
// enden kann: der Betrag ist der Siegwert, ein negatives
// Vorzeichen erlaubt zusaetzlich ein Unentschieden eine Tor
// darunter. Ohne diese Faelle waere ein Satz, der remis endet,
// gar nicht hinterlegbar (Sven 2026-09-01).
echo "<option value=\"" . $i . "\"" . ($row != null ? (($row->satz_sieg_doppel ?? 0) == $i ? " selected" : "") : "") . ">" . htmlentities_utf8(($i == 1 ? Text::_('COM_SPORTSMANAGER_ONE_GOAL') : Text::sprintf('COM_SPORTSMANAGER_NUMBER_GOALS', $i)) . Text::_('COM_SPORTSMANAGER_SUFFIX_NO_DRAW')) . "</option>";
if ($i != 1)
echo "<option value=\"" . (-$i) . "\"" . ($row != null ? (($row->satz_sieg_doppel ?? 0) == (-$i) ? " selected" : "") : "") . ">" . htmlentities_utf8(Text::sprintf('COM_SPORTSMANAGER_NUMBER_GOALS', $i) . Text::sprintf('COM_SPORTSMANAGER_SUFFIX_DRAW_AT', ($i - 1), ($i - 1))) . "</option>";
@@ -5583,11 +5479,6 @@ class HTML_sportsmanager_admin
value="0"><?php echo Text::_('COM_SPORTSMANAGER_DECIDING_SET_SAME'); ?></option>
<?php
for ($i = 1; $i <= 60; $i++) {
// Wie eine Ebene hoeher entscheidet das Vorzeichen, ob ein Satz remis
// enden kann: der Betrag ist der Siegwert, ein negatives
// Vorzeichen erlaubt zusaetzlich ein Unentschieden eine Tor
// darunter. Ohne diese Faelle waere ein Satz, der remis endet,
// gar nicht hinterlegbar (Sven 2026-09-01).
echo "<option value=\"" . $i . "\"" . ($row != null ? (($row->entscheidung_sieg_einzel ?? 0) == $i ? " selected" : "") : "") . ">" . htmlentities_utf8(($i == 1 ? Text::_('COM_SPORTSMANAGER_ONE_GOAL') : Text::sprintf('COM_SPORTSMANAGER_NUMBER_GOALS', $i)) . Text::_('COM_SPORTSMANAGER_SUFFIX_NO_DRAW')) . "</option>";
if ($i != 1)
echo "<option value=\"" . (-$i) . "\"" . ($row != null ? (($row->entscheidung_sieg_einzel ?? 0) == (-$i) ? " selected" : "") : "") . ">" . htmlentities_utf8(Text::sprintf('COM_SPORTSMANAGER_NUMBER_GOALS', $i) . Text::sprintf('COM_SPORTSMANAGER_SUFFIX_DRAW_AT', ($i - 1), ($i - 1))) . "</option>";
@@ -5609,11 +5500,6 @@ class HTML_sportsmanager_admin
value="0"><?php echo Text::_('COM_SPORTSMANAGER_DECIDING_SET_SAME'); ?></option>
<?php
for ($i = 1; $i <= 60; $i++) {
// Wie eine Ebene hoeher entscheidet das Vorzeichen, ob ein Satz remis
// enden kann: der Betrag ist der Siegwert, ein negatives
// Vorzeichen erlaubt zusaetzlich ein Unentschieden eine Tor
// darunter. Ohne diese Faelle waere ein Satz, der remis endet,
// gar nicht hinterlegbar (Sven 2026-09-01).
echo "<option value=\"" . $i . "\"" . ($row != null ? (($row->entscheidung_sieg_doppel ?? 0) == $i ? " selected" : "") : "") . ">" . htmlentities_utf8(($i == 1 ? Text::_('COM_SPORTSMANAGER_ONE_GOAL') : Text::sprintf('COM_SPORTSMANAGER_NUMBER_GOALS', $i)) . Text::_('COM_SPORTSMANAGER_SUFFIX_NO_DRAW')) . "</option>";
if ($i != 1)
echo "<option value=\"" . (-$i) . "\"" . ($row != null ? (($row->entscheidung_sieg_doppel ?? 0) == (-$i) ? " selected" : "") : "") . ">" . htmlentities_utf8(Text::sprintf('COM_SPORTSMANAGER_NUMBER_GOALS', $i) . Text::sprintf('COM_SPORTSMANAGER_SUFFIX_DRAW_AT', ($i - 1), ($i - 1))) . "</option>";
@@ -5729,9 +5615,6 @@ class HTML_sportsmanager_admin
<option value="0"<?php if ($row == null || $row->spiele_in_spielerstatistik == 0) echo " selected"; ?>><?php echo Text::_('COM_SPORTSMANAGER_GAMES_IN_STATISTIK_ALL'); ?></option>
<?php
for ($i = 1; $i <= 36; $i++) {
// Nackte Zahlen neben „Alle Spiele" sagen nicht, was sie zaehlen —
// gemeint sind die ERSTEN n Spiele (die Statistik filtert auf
// teamspiel_nummer <= n).
echo "<option value=\"" . $i . "\"" . ($row != null ? ($row->spiele_in_spielerstatistik == $i ? " selected" : "") : "") . ">" . htmlentities_utf8($i == 1 ? Text::_('COM_SPORTSMANAGER_GAMES_IN_STATISTIK_FIRST_ONE') : Text::sprintf('COM_SPORTSMANAGER_GAMES_IN_STATISTIK_FIRST', $i)) . "</option>";
}
?>
@@ -5739,8 +5622,6 @@ class HTML_sportsmanager_admin
</td>
</tr>
<?php
//Doppel 7 und 8 hinzugefuegt, Jürgen Meyer, 28.03.2025
$spieltyp = array("D1" => Text::_('COM_SPORTSMANAGER_DOUBLES') . " 1", "D2" => Text::_('COM_SPORTSMANAGER_DOUBLES') . " 2",
@@ -5753,9 +5634,6 @@ class HTML_sportsmanager_admin
"S1" => Text::_('COM_SPORTSMANAGER_RESULT_ONLY'));
$modus = $row != null ? explode("|", $row->modus) : null;
$spiele = $modus != null && isset($modus[0]) ? explode(",", $modus[0]) : array();
// Nur die vorhandenen Zeilen zeigen, nicht alle 36 leeren.
// Sven 2026-09-01: „Vorschlag: Spiel hinzufügen und
// Verknüpfung hinzufügen anstelle leere Spiele und
$spiele_gefuellt = 0;
foreach ($spiele as $eintrag) {
if (strlen(trim($eintrag)) > 0) $spiele_gefuellt++;
@@ -5844,8 +5722,6 @@ class HTML_sportsmanager_admin
$spieltyp_doppel = array("D1" => Text::_('COM_SPORTSMANAGER_DOUBLES') . " 1", "D2" => Text::_('COM_SPORTSMANAGER_DOUBLES') . " 2", "D3" => Text::_('COM_SPORTSMANAGER_DOUBLES') . " 3", "D4" => Text::_('COM_SPORTSMANAGER_DOUBLES') . " 4", "D5" => Text::_('COM_SPORTSMANAGER_DOUBLES') . " 5", "D6" => Text::_('COM_SPORTSMANAGER_DOUBLES') . " 6", "D7" => Text::_('COM_SPORTSMANAGER_DOUBLES') . " 7", "D8" => Text::_('COM_SPORTSMANAGER_DOUBLES') . " 8");
$spieltyp_einzel = array("E1" => Text::_('COM_SPORTSMANAGER_SINGLES') . " 1", "E2" => Text::_('COM_SPORTSMANAGER_SINGLES') . " 2", "E3" => Text::_('COM_SPORTSMANAGER_SINGLES') . " 3", "E4" => Text::_('COM_SPORTSMANAGER_SINGLES') . " 4", "E5" => Text::_('COM_SPORTSMANAGER_SINGLES') . " 5", "E6" => Text::_('COM_SPORTSMANAGER_SINGLES') . " 6", "E7" => Text::_('COM_SPORTSMANAGER_SINGLES') . " 7", "E8" => Text::_('COM_SPORTSMANAGER_SINGLES') . " 8");
$verknuepfungen = $modus != null && isset($modus[1]) ? explode(",", $modus[1]) : array();
// Wie bei den Spielen: nur vorhandene Zeilen, der Rest auf Zuruf. Hier
// faengt es bei NULL an — eine Verknuepfung ist die Ausnahme, kein Regelfall.
$verkn_gefuellt = 0;
foreach ($verknuepfungen as $eintrag) {
if (strlen(trim($eintrag)) > 0) $verkn_gefuellt++;
@@ -5944,9 +5820,6 @@ class HTML_sportsmanager_admin
<input type="hidden" name="id" value="<?php echo($row != null ? $row->teamspiel_modus_id : "0"); ?>"/>
</form>
<script type="text/javascript">
// Einmal beim Laden, damit der anfaengliche Zustand aus PHP und die Regeln in
// zeilen_anzeigen() dasselbe sagen — sonst waere etwa die Siegbedingung erst
// nach der ersten Aenderung gesperrt.
zeilen_anzeigen();
</script>
<?php
@@ -12137,7 +12010,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
}
?>
<tr class="sectiontableentry<?php echo $k + 1;
$k = ($k + 1) % 2; ?><?php echo $params->get('pageclass_sfx'); ?>">
@@ -12667,9 +12539,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
</tr>
<?php
}
// Der Gesamtstand, wie er beim Speichern entsteht — nicht
// der gespeicherte. Hier stand „Zwischenergebnis" mit dem
// Wert aus der Datenbank.
?>
<tr>
<td nowrap colspan="2">&nbsp;</td>
@@ -12734,8 +12603,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
$punkte_sieg_doppel = abs($teamspiel_modus->punkte_sieg_doppel);
$punkte_unentschieden_einzel = $teamspiel_modus->punkte_sieg_einzel < 0 ? abs($teamspiel_modus->punkte_sieg_einzel + 1) : 0;
$punkte_unentschieden_doppel = $teamspiel_modus->punkte_sieg_doppel < 0 ? abs($teamspiel_modus->punkte_sieg_doppel + 1) : 0;
// Vorsprung und Unentschieden schliessen sich aus (siehe punkte_gegner). Alte
// Daten koennen beides gesetzt haben, wenn ein Vorsprung nachtraeglich kam.
if (max(1, (int)($teamspiel_modus->punkte_vorsprung_einzel ?? 1)) > 1)
$punkte_unentschieden_einzel = 0;
if (max(1, (int)($teamspiel_modus->punkte_vorsprung_doppel ?? 1)) > 1)
@@ -12744,16 +12611,9 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
$punkte_vorsprung_doppel = max(1, (int)($teamspiel_modus->punkte_vorsprung_doppel ?? 1));
$punkte_deckel_einzel = max(0, (int)($teamspiel_modus->punkte_deckel_einzel ?? 0));
$punkte_deckel_doppel = max(0, (int)($teamspiel_modus->punkte_deckel_doppel ?? 0));
// Zweite Ebene: die Regel im einzelnen Satz. Eingetragen
// werden einzelne Saetze nur bei „Mehrere mit
// Satzergebnissen" — nur dort greift sie also.
$heim_hat_spieler = !empty($heim_spieler);
$gast_hat_spieler = !empty($gast_spieler);
$satzweise = ($teamspiel_modus->satzergebnisse ?? 0) != 0;
// Race: der Stand laeuft durch, jedes Spiel hat sein eigenes Etappenziel
// (Spiel N endet bei N mal Schritt). Mindestvorsprung, Grenze und ein
// moegliches Unentschieden gelten nur fuer das letzte Spiel — also fuer
// das Ziel selbst.
$race_an = ($teamspiel_modus->zaehlweise ?? 0) != 0
&& ($teamspiel_modus->race_schritt ?? 0) > 0;
$race_schritt = max(0, (int)($teamspiel_modus->race_schritt ?? 0));
@@ -12764,8 +12624,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
$race_remis = ($teamspiel_modus->race_remis ?? 0) != 0 && $race_vorsprung <= 1
? $race_ziel - 1
: 0;
// Je Spiel die Zahl der von Anfang an sichtbaren Satzzeilen; wird in der
// Spiel-Schleife gefuellt und nach dem Formular an JavaScript uebergeben.
$satz_min_je_spiel = array();
$satz_sieg_einzel = (int)($teamspiel_modus->satz_sieg_einzel ?? 0);
$satz_sieg_doppel = (int)($teamspiel_modus->satz_sieg_doppel ?? 0);
@@ -12773,21 +12631,16 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
$satz_vorsprung_doppel = max(1, (int)($teamspiel_modus->satz_vorsprung_doppel ?? 1));
$satz_deckel_einzel = max(0, (int)($teamspiel_modus->satz_deckel_einzel ?? 0));
$satz_deckel_doppel = max(0, (int)($teamspiel_modus->satz_deckel_doppel ?? 0));
// Satzzahl: positiv = feste Zahl, negativ = Gewinnsaetze, 0 = keine Angabe.
$saetze_modus_einzel = (int)($teamspiel_modus->saetze_modus_einzel ?? 0);
$saetze_modus_doppel = (int)($teamspiel_modus->saetze_modus_doppel ?? 0);
// Abweichende Regel fuer den Entscheidungssatz; 0 = keine.
$entscheidung_sieg_einzel = (int)($teamspiel_modus->entscheidung_sieg_einzel ?? 0);
$entscheidung_sieg_doppel = (int)($teamspiel_modus->entscheidung_sieg_doppel ?? 0);
$entscheidung_vorsprung_einzel = max(1, (int)($teamspiel_modus->entscheidung_vorsprung_einzel ?? 1));
$entscheidung_vorsprung_doppel = max(1, (int)($teamspiel_modus->entscheidung_vorsprung_doppel ?? 1));
$entscheidung_deckel_einzel = max(0, (int)($teamspiel_modus->entscheidung_deckel_einzel ?? 0));
$entscheidung_deckel_doppel = max(0, (int)($teamspiel_modus->entscheidung_deckel_doppel ?? 0));
// punkte_gegner brauchen beide Ebenen — das Spiel und der Satz.
if ($handheld != "yes" && ($race_an || $punkte_sieg_einzel != 0 || $punkte_sieg_doppel != 0
|| ($satzweise && ($satz_sieg_einzel != 0 || $satz_sieg_doppel != 0)))) {
// Der Gegenwert zu einem eingegebenen Stand: was die andere Seite hoechstens haben
// kann, wenn dieser Stand das Spiel beendet.
echo "function punkte_gegner(eingabe, sieg, vorsprung, deckel, unentschieden) {\n"
. " var v = Number(eingabe);\n"
. " if (unentschieden != 0 && v == unentschieden)\n"
@@ -12803,7 +12656,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
. "}\n";
if ($race_an)
echo "function race_gegner(nr, feld, schritt, letztes, vorsprung, deckel, remis, seite) {\n"
// Was beide Seiten aus den vorherigen Spielen schon haben.
. " var vorEigen = 0, vorAnder = 0;\n"
. " for (var i = 1; i < nr; i++) {\n"
. " var h = document.adminForm['spiel_' + i + '_heim_punkte'];\n"
@@ -12816,8 +12668,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
. " var ziel = nr * schritt;\n"
. " var eigenLaufend = vorEigen + Number(feld.value);\n"
. " var anderLaufend;\n"
// Nur das letzte Spiel kennt Vorsprung, Grenze und Remis — und die
// gelten fuer den laufenden Stand, nicht fuer die Differenz.
. " if (letztes) {\n"
. " anderLaufend = punkte_gegner(eigenLaufend, ziel, vorsprung, deckel, remis);\n"
. " if (anderLaufend === '') return '';\n"
@@ -12828,8 +12678,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
. " var differenz = anderLaufend - vorAnder;\n"
. " return differenz < 0 ? '' : differenz;\n"
. "}\n";
// Bei satzweiser Eingabe gibt es keine anfassbaren Summenfelder; dort
// ergaenzt saetze_changed() den Gegenwert, und zwar innerhalb des Satzes.
if (!$satzweise) {
echo "function punkte_changed(form) {\n"
. " if (form.value == '')\n"
@@ -12837,11 +12685,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
. " switch(form.name) {\n";
$n = count($spieltypen);
for ($i = 1; $i <= $n; $i++) {
// Bei Race gilt die Etappe fuer den LAUFENDEN Stand, eingetragen wird
// aber die Differenz dieses Spiels — so fuehrt der Sports Manager es
// seit jeher (gemessen 2026-09-01 an 91 Bundesliga-Begegnungen: die
// Summe der Spielwerte IST der Begegnungsstand). Die Ergaenzung muss
// deshalb abziehen, was bis hierher schon auf dem Konto steht.
if ($race_an) {
$letztes = $i == $race_letztes ? 1 : 0;
$args = $i . ", form, " . $race_schritt . ", " . $letztes . ", "
@@ -12878,8 +12721,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
. "}\n";
}
}
// Der Gesamtstand: die Spielpunkte, wie sie Liste, Mannschaftsseite und Kopfzeile
// zeigen — gerechnet mit derselben Arithmetik wie beim Speichern.
echo "function gesamtstand_aktualisieren() {\n"
. " var sh = 0, sg = 0, h, g;\n";
for ($i = 1; $i <= count($spieltypen); $i++) {
@@ -12903,11 +12744,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
. " if (feld != null) feld.textContent = sh + ':' + sg;\n"
. "}\n";
if ($satzweise) {
// Ein Satz ist eingetragen, also: den Gegenwert IM SATZ ergaenzen, die
// gewonnenen Saetze neu zaehlen und in die versteckten Summenfelder
// schreiben. Gezaehlt wird nach derselben Regel wie auf dem Server
// (adminSaveBegegnungSpielplan): ein Satz zaehlt fuer die Seite mit den
// meisten Toren, ein 0:0 zaehlt fuer niemanden.
echo "function saetze_changed(nr, feld, sieg, vorsprung, deckel, unentschieden) {\n"
. " var heim = document.getElementsByName('spiel_' + nr + '_heim_punkte_detailliert[]');\n"
. " var gast = document.getElementsByName('spiel_' + nr + '_gast_punkte_detailliert[]');\n"
@@ -12934,9 +12770,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
. " satzzeilen_anzeigen(nr);\n"
. " gesamtstand_aktualisieren();\n"
. "}\n"
// Gestaffelt zeigen: sichtbar ist die Mindestzahl,
// und dahinter genau eine leere Zeile — nicht die
// volle Hoechstzahl.
. "function satzzeilen_anzeigen(nr) {\n"
. " var min = satz_min_je_spiel[nr];\n"
. " if (min == null) return;\n"
@@ -13076,10 +12909,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
. " var punkte_gast;\n";
$n = count($spieltypen);
for ($i = 1; $i <= $n; $i++) {
// Geprueft wird nur, was es auch gibt: hat eine Mannschaft keine
// hinterlegten Spieler, steht dort kein Auswahlfeld — und eine
// Forderung nach Namen, die niemand erfuellen kann, wuerde das
// Melden verhindern statt es zu ordnen.
if (!$heim_hat_spieler && !$gast_hat_spieler)
continue;
if ($spielernamen == 1) {
@@ -13260,9 +13089,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
</td>
</tr>
<?php } else {
// „Mehrere (mit Satzergebnissen)":
// eingetragen werden die SAETZE, das
// Spielergebnis ergibt sich daraus.
$doppelspiel = $spieltypen[$spiel_nr - 1][0] == "D";
$satz_sieg = $doppelspiel ? $satz_sieg_doppel : $satz_sieg_einzel;
$satz_vorsprung = $doppelspiel ? $satz_vorsprung_doppel : $satz_vorsprung_einzel;
@@ -13270,8 +13096,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
$spiel_sieg = $doppelspiel ? $punkte_sieg_doppel : $punkte_sieg_einzel;
$spiel_deckel = $doppelspiel ? $punkte_deckel_doppel : $punkte_deckel_einzel;
$saetze_wahl = $doppelspiel ? $saetze_modus_doppel : $saetze_modus_einzel;
// Abweichende Regel fuer den Entscheidungssatz — den gibt es nur
// bei Gewinnsaetzen, und er ist dort der letzte moegliche Satz.
$ent_sieg = $doppelspiel ? $entscheidung_sieg_doppel : $entscheidung_sieg_einzel;
$ent_vorsprung = $doppelspiel ? $entscheidung_vorsprung_doppel : $entscheidung_vorsprung_einzel;
$ent_deckel = $doppelspiel ? $entscheidung_deckel_doppel : $entscheidung_deckel_einzel;
@@ -13279,9 +13103,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
? (-2 * $saetze_wahl - 2) // 0-basiert: der (2N-1)-te Satz
: -1;
// Vorbelegen nur, wenn die
// gespeicherten Saetze den
// gespeicherten Spielstand auch
$satz_werte = array();
if ($spiel != null && !empty($spiel->ergebnis_detailliert)) {
$gelesen = array();
@@ -13305,9 +13126,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
$satz_werte = $gelesen;
}
// Wie viele Satzzeilen angeboten
// werden: die Deckelung des SPIELS ist
// die Hoechstzahl der Saetze; fehlt
$satz_zeilen = $saetze_wahl > 0
? $saetze_wahl
: ($saetze_wahl < 0
@@ -13317,16 +13135,12 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
: ($spiel_sieg != 0 ? 2 * $spiel_sieg - 1 : 5)));
$satz_zeilen = min(15, max(1, $satz_zeilen));
$satz_zeilen = max($satz_zeilen, count($satz_werte));
// Wie viele Zeilen sichtbar sind. Alle stehen im Dokument, weil das Speichern
// spiel_1, spiel_2 ... der Reihe nach liest und beim ersten leeren Paar abbricht.
$satz_min = $saetze_wahl > 0
? $satz_zeilen
: ($saetze_wahl < 0
? -$saetze_wahl
: ($spiel_sieg != 0 ? $spiel_sieg : 1));
$satz_min = min($satz_zeilen, max(1, $satz_min));
// Was gespeichert ist, bleibt sichtbar — samt einer leeren
// Zeile dahinter, damit fortsetzen ohne Umweg geht.
$satz_min = max($satz_min, min($satz_zeilen, count($satz_werte) + 1));
$satz_min_je_spiel[$spiel_nr] = $satz_min;
for ($satz = 0; $satz < $satz_zeilen; $satz++) {
@@ -13336,8 +13150,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
$zeilen_sieg = $ist_entscheidung ? $ent_sieg : $satz_sieg;
$zeilen_vorsprung = $ist_entscheidung ? $ent_vorsprung : $satz_vorsprung;
$zeilen_deckel = $ist_entscheidung ? $ent_deckel : $satz_deckel;
// Der Siegwert ist vorzeichenbehaftet (negativ = Remis
// moeglich); fuer Auswahl und Ergaenzung zaehlt der Betrag.
$zeilen_sieg_betrag = abs($zeilen_sieg);
$zeilen_remis = $zeilen_sieg < 0 && $zeilen_vorsprung <= 1
? abs($zeilen_sieg + 1)
@@ -13471,9 +13283,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
<?php
echo "<script type=\"text/javascript\">gesamtstand_aktualisieren();</script>\n";
if ($satzweise && !empty($satz_min_je_spiel)) {
// Erst hier, weil die Mindestzahlen in der Spiel-Schleife entstehen. Der Aufruf
// beim Laden bringt Anfangszustand und Regel auf denselben Stand — ein bereits
// gespeichertes Fuenf-Satz-Spiel zeigt so alle fuenf Zeilen, ein leeres drei.
echo "<script type=\"text/javascript\">\n"
. "var satz_min_je_spiel = " . json_encode($satz_min_je_spiel) . ";\n";
foreach (array_keys($satz_min_je_spiel) as $nr)