diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 52a8c81..19c748f 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -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); diff --git a/src/structure/components/com_sportsmanager/database/update.php b/src/structure/components/com_sportsmanager/database/update.php index bc142e2..34cbd75 100644 --- a/src/structure/components/com_sportsmanager/database/update.php +++ b/src/structure/components/com_sportsmanager/database/update.php @@ -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" diff --git a/src/structure/components/com_sportsmanager/sportsmanager.php b/src/structure/components/com_sportsmanager/sportsmanager.php index 303a2b3..e7dfaef 100644 --- a/src/structure/components/com_sportsmanager/sportsmanager.php +++ b/src/structure/components/com_sportsmanager/sportsmanager.php @@ -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))) { diff --git a/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php b/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php index a0744bf..cda00a2 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php @@ -1017,7 +1017,6 @@ static function turnierdisziplin($turnier, $disziplin, $meldungen, $meldungenSpi bilder_zeigen(); } - window.addEventListener("resize", onResize); @@ -1598,14 +1597,9 @@ if (count($spiele) > 0) { 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 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
-
diff --git a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php index 03692ed..1e04b18 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php @@ -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 " @@ -12667,9 +12539,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void @@ -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 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 gesamtstand_aktualisieren();\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 "