From 269af499c8ac3052344d626a691ac8d537241bd0 Mon Sep 17 00:00:00 2001 From: Tim <43742253+TQxTim@users.noreply.github.com> Date: Tue, 24 Jun 2025 13:48:13 +0000 Subject: [PATCH 01/22] feat: add auto-email reminder script for missing tournament results --- scripts/send_missing_results_reminder.php | 53 +++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 scripts/send_missing_results_reminder.php diff --git a/scripts/send_missing_results_reminder.php b/scripts/send_missing_results_reminder.php new file mode 100644 index 0000000..feef687 --- /dev/null +++ b/scripts/send_missing_results_reminder.php @@ -0,0 +1,53 @@ +getQuery(true) + ->select('t.*, u.email AS user_email, v.email AS verband_email') + ->from('#__sportsmanager_turnier AS t') + ->leftJoin('#__users AS u ON t.responsible_user_id = u.id') + ->leftJoin('#__sportsmanager_verband AS v ON t.verband_id = v.verband_id') + ->where('t.letzter_tag BETWEEN ' . $db->quote($twoWeeksAgo) . ' AND ' . $db->quote($oneDayAgo)) + ->where('NOT EXISTS (SELECT 1 FROM #__sportsmanager_turnierergebnis e WHERE e.turnier_id = t.turnier_id)') + ->where('(t.reminder_sent IS NULL OR t.reminder_sent < DATE_SUB(' . $db->quote($now) . ', INTERVAL 1 DAY))'); + $db->setQuery($query); + $tournaments = $db->loadObjectList(); + + foreach ($tournaments as $tournament) { + $mailer = Factory::getContainer()->get(MailerFactoryInterface::class)->createMailer(); + $config = Factory::getConfig(); + $mailer->setSender([$config->get('mailfrom'), $config->get('fromname')]); + $mailer->setSubject('Erinnerung: Turnierergebnisse fehlen für ' . $tournament->turnierbezeichnung); + $body = "Für das Turnier '" . $tournament->turnierbezeichnung . "' am " . $tournament->letzter_tag . + " wurden noch keine Ergebnisse hochgeladen. Laut Turnierordnung müssen die Ergebnisse spätestens 24 Stunden nach Turnierende eingetragen werden. Bitte reichen Sie die Ergebnisse umgehend nach."; + $mailer->setBody($body); + $mailer->addRecipient($tournament->user_email); + if (!empty($tournament->verband_email)) { + $mailer->addBcc($tournament->verband_email); + } + $mailer->send(); + + // Mark reminder as sent (or log in a separate table for multiple reminders) + $db->setQuery('UPDATE #__sportsmanager_turnier SET reminder_sent = ' . $db->quote($now) . ' WHERE turnier_id = ' . (int)$tournament->turnier_id); + $db->execute(); + } +} + +sendMissingTournamentResultsReminders(); From 1e8a7a3ae098c2d3bf705e23bc86585bc1793fd5 Mon Sep 17 00:00:00 2001 From: Tim <43742253+TQxTim@users.noreply.github.com> Date: Tue, 24 Jun 2025 13:53:11 +0000 Subject: [PATCH 02/22] chore: add migration script for tournament reminder fields --- scripts/migrate_add_reminder_fields.php | 45 +++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 scripts/migrate_add_reminder_fields.php diff --git a/scripts/migrate_add_reminder_fields.php b/scripts/migrate_add_reminder_fields.php new file mode 100644 index 0000000..0eea06a --- /dev/null +++ b/scripts/migrate_add_reminder_fields.php @@ -0,0 +1,45 @@ +setQuery("SHOW COLUMNS FROM #__sportsmanager_turnier"); + $existing = array_column($db->loadAssocList(), 'Field'); + $alter = []; + if (!in_array('reminder_24h_sent', $existing)) { + $alter[] = 'ADD COLUMN `reminder_24h_sent` DATETIME DEFAULT NULL'; + } + if (!in_array('reminder_3d_sent', $existing)) { + $alter[] = 'ADD COLUMN `reminder_3d_sent` DATETIME DEFAULT NULL'; + } + if (!in_array('reminder_7d_sent', $existing)) { + $alter[] = 'ADD COLUMN `reminder_7d_sent` DATETIME DEFAULT NULL'; + } + if ($alter) { + $query = 'ALTER TABLE #__sportsmanager_turnier ' . implode(', ', $alter); + $db->setQuery($query); + $db->execute(); + echo "Migration successful: reminder fields added.\n"; + } else { + echo "Migration skipped: fields already exist.\n"; + } +} + +addReminderFieldsToTurnierTable(); From 56679669c0e4773fbfd6c97bb5be6684093c67b3 Mon Sep 17 00:00:00 2001 From: Tim <43742253+TQxTim@users.noreply.github.com> Date: Tue, 24 Jun 2025 13:58:02 +0000 Subject: [PATCH 03/22] feat: extend tournament result upload window to 14 days for uploaders --- .../components/com_sportsmanager/sportsmanager.php | 6 +++--- src/structure/components/com_sportsmanager/tools.php | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/structure/components/com_sportsmanager/sportsmanager.php b/src/structure/components/com_sportsmanager/sportsmanager.php index 4e71fb0..5601140 100644 --- a/src/structure/components/com_sportsmanager/sportsmanager.php +++ b/src/structure/components/com_sportsmanager/sportsmanager.php @@ -1099,7 +1099,7 @@ function benutzerVeranstaltungModerator($veranstaltung_id = NULL) return false; $user_id = Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id; - $query = "SELECT * FROM #__sportsmanager_berechtigt_fuer_veranstaltung INNER JOIN #__sportsmanager_veranstaltung ON veranstaltung_id = berechtigt_veranstaltung_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -14"; + $query = "SELECT * FROM #__sportsmanager_berechtigt_fuer_veranstaltung INNER JOIN #__sportsmanager_veranstaltung ON veranstaltung_id = berechtigt_veranstaltung_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -21"; if ($veranstaltung_id != NULL) $query .= " AND berechtigt_veranstaltung_id = $veranstaltung_id"; $db->setQuery($query); @@ -1121,7 +1121,7 @@ function benutzerVeranstaltungIdsModerator() return array(); $user_id = Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id; - $query = "SELECT DISTINCT veranstaltung_id FROM #__sportsmanager_berechtigt_fuer_veranstaltung INNER JOIN #__sportsmanager_veranstaltung ON veranstaltung_id = berechtigt_veranstaltung_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -14"; + $query = "SELECT DISTINCT veranstaltung_id FROM #__sportsmanager_berechtigt_fuer_veranstaltung INNER JOIN #__sportsmanager_veranstaltung ON veranstaltung_id = berechtigt_veranstaltung_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -21"; $db->setQuery($query); if (!$db->execute()) { die($db->stderr(true)); @@ -1143,7 +1143,7 @@ function benutzerTurnierModerator($turnier_id = NULL) return false; $user_id = Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id; - $query = "SELECT * FROM #__sportsmanager_berechtigt_fuer_turnier INNER JOIN #__sportsmanager_turnier ON turnier_id = berechtigt_turnier_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -14"; + $query = "SELECT * FROM #__sportsmanager_berechtigt_fuer_turnier INNER JOIN #__sportsmanager_turnier ON turnier_id = berechtigt_turnier_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -21"; if ($turnier_id != NULL) $query .= " AND berechtigt_turnier_id = $turnier_id"; $db->setQuery($query); diff --git a/src/structure/components/com_sportsmanager/tools.php b/src/structure/components/com_sportsmanager/tools.php index 9d1451f..0c74205 100644 --- a/src/structure/components/com_sportsmanager/tools.php +++ b/src/structure/components/com_sportsmanager/tools.php @@ -202,7 +202,7 @@ function kategorieFilter($prefix, $suffix = ""): string function turnierFilter($prefix): string { $user_id = isExternalDatabase() ? 0 : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id; - return " " . $prefix . " (SELECT berechtigt_turnier_id FROM #__sportsmanager_berechtigt_fuer_turnier WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -14) "; + return " " . $prefix . " (SELECT berechtigt_turnier_id FROM #__sportsmanager_berechtigt_fuer_turnier WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -21) "; } function vereinFilter($prefix): string @@ -220,7 +220,7 @@ function veranstalterFilter($prefix): string function veranstaltungFilter($prefix): string { $user_id = isExternalDatabase() ? 0 : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id; - return " " . $prefix . " (SELECT berechtigt_veranstaltung_id FROM #__sportsmanager_berechtigt_fuer_veranstaltung INNER JOIN #__sportsmanager_veranstaltung ON veranstaltung_id = berechtigt_veranstaltung_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -14) "; + return " " . $prefix . " (SELECT berechtigt_veranstaltung_id FROM #__sportsmanager_berechtigt_fuer_veranstaltung INNER JOIN #__sportsmanager_veranstaltung ON veranstaltung_id = berechtigt_veranstaltung_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -21) "; } // Berechnet Datum zum Montag der ersten Kalenderwoche eines Jahres From ea85f102a5439fec08235cc4ae3a0035531a5e7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Thu, 11 Sep 2025 10:22:52 +0200 Subject: [PATCH 04/22] =?UTF-8?q?=C3=84nderungen=20nach=20issue=20#180?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/com_sportsmanager/admin.php | 29 +++++++-- .../views/sportsmanager/view_admin.php | 62 ++++++++++++++++--- .../de-DE/de-DE.com_sportsmanager.ini | 1 + .../en-GB/en-GB.com_sportsmanager.ini | 1 + 4 files changed, 79 insertions(+), 14 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index cab859e..4f5a70b 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -6448,7 +6448,6 @@ function adminEditMannschaft(): void if ($id == 0) { $query = "INSERT INTO #__sportsmanager_team (verein_id, veranstaltung_id, teamname, teamname_kurz, tischtyp, tischeigenschaften, heimspiel_wochentag, heimspiel_uhrzeit, heimspielort_id, nichtraucherschutz, zusatzpunkte" . ($veranstaltung->tabellenwertung == -2 ? ", platz" : "") . ", pin)" . "\n VALUES (" . ($verein_id != 0 ? "'$verein_id'" : "NULL") . ", '$veranstaltungId', '$teamname', '$teamname_kurz', '$tischtyp', '$tischeigenschaften', '$heimspiel_wochentag', '$heimspiel_uhrzeit', " . ($heimspielort_id != 0 ? "'$heimspielort_id'" : "NULL") . ", '$nichtraucherschutz', '$zusatzpunkte'" . ($veranstaltung->tabellenwertung == -2 ? ($platz != 0 ? ", '$platz'" : ", NULL") : "") . ", '$pin');"; - echo $query; $db->setQuery($query); if (!$db->execute()) { die($db->stderr(true)); @@ -9818,7 +9817,12 @@ function adminBegegnungenPokalrundeAuslosenForm(): void . "\n ORDER BY spieltag DESC"; $veranstaltung->nicht_abgeschlossene_spiele = loadResult($db, $query); - HTML_sportsmanager_admin::adminBegegnungenPokalrundeAuslosenForm($veranstaltung,getAuswahlSpieltagtitel()); + $query = "SELECT *" + . "\n FROM #__sportsmanager_spielort" + . "\n ORDER BY ortsname, name, ortsteil"; + $spielorte = loadObjectList($db, $query); + + HTML_sportsmanager_admin::adminBegegnungenPokalrundeAuslosenForm($veranstaltung,getAuswahlSpieltagtitel(),$spielorte); } #[NoReturn] function adminBegegnungenPokalrundeAuslosen(): void @@ -9828,6 +9832,7 @@ function adminBegegnungenPokalrundeAuslosenForm(): void $sperren = false; $veranstaltungId = $jInput->get('veranstaltungid', 0, 'INT'); + $spielort_id = $jInput->get('spielort_id', 0, 'INT'); $rundenNr = $jInput->get('runde', 0, 'INT'); $rundenTitel = $jInput->get('rundentitel', 0, 'STRING'); $spielumplatz3 = $jInput->get('spielumplatz3', 0, 'INT'); @@ -9978,7 +9983,7 @@ function adminBegegnungenPokalrundeAuslosenForm(): void $query .= "('" . $match['zeitpunkt'] . "', " . $rundenNr . ", '" . $match['rundentitel'] . "', " . $key . ", '" . $match['heim'] . "', '" . $match['gast'] . "'" . - ", " . ($match['heimspielort_id'] != 0 ? "'" . $match['heimspielort_id'] . "'" : "NULL") . ")"; + ", " . ($spielort_id != 0 ? "'" . $spielort_id . "'" : "NULL") . ")"; } $query .= "; "; $db->setQuery($query); @@ -10007,9 +10012,11 @@ function adminBegegnungenPokalrundeAuslosenForm(): void $sperren = false; $veranstaltungId = $jInput->get('veranstaltungid', 0, 'INT'); + $spielort_id = $jInput->get('spielort_id', 0, 'INT'); $rundenNr = $jInput->get('runde', 0, 'INT'); $rundenTitel = $jInput->get('rundentitel', 0, 'STRING'); $spielumplatz3 = $jInput->get('spielumplatz3', 0, 'INT'); + $heimrecht_losen = $jInput->get('heimrecht_losen', 0, 'INT'); if ($veranstaltungId == 0) die("Missing id!"); @@ -10159,12 +10166,22 @@ function adminBegegnungenPokalrundeAuslosenForm(): void $matches[2]['rundentitel'] = "Spiel um Platz 3"; } + if ($heimrecht_losen) + { + foreach ($matches as $key => $match) { + if (random_int(0, 1) === 1) { + $tmp = $matches[$key]['heim']; + $matches[$key]['heim'] = $matches[$key]['gast']; + $matches[$key]['gast'] = $tmp; + } + } + } + $Fehlertext = ""; foreach($matches AS $spiel_nr => $match) { $matches[$spiel_nr]['rundentitel'] = $matches[$spiel_nr]['rundentitel'] ?? $rundenTitel; $matches[$spiel_nr]['zeitpunkt'] = $zeitpunkt; - $matches[$spiel_nr]['heimspielort_id'] = $teams[$teams_setzliste[$setzung[0]]]['heimspielort_id']; $team_heim = $match['heim']; if ($datum_kw != null && $teams[$team_heim]['heimspiel_wochentag'] !== 0) { $ts = getdate(mondaykw($datum_kw, $datum_jahr, $teams[$team_heim]['heimspiel_wochentag'] - 1)); @@ -10185,14 +10202,14 @@ function adminBegegnungenPokalrundeAuslosenForm(): void $query .= "('" . $match['zeitpunkt'] . "', " . $rundenNr . ", '" . $match['rundentitel'] . "', " . $key . ", '" . $match['heim'] . "', '" . $match['gast'] . "'" . - ", " . ($match['heimspielort_id'] != 0 ? "'" . $match['heimspielort_id'] . "'" : "NULL") . ")"; + ", " . ($spielort_id != 0 ? "'" . $spielort_id . "'" : "NULL") . ")"; } $query .= "; "; $db->setQuery($query); if (!$db->execute()) { die($db->stderr(true)); } - + redirectSportsManagerURL('&task=admin_begegnungen&veranstaltungid=' . $veranstaltungId); } else{ 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 6a01e20..51300b3 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php @@ -8761,16 +8761,16 @@ class HTML_sportsmanager_admin - - - - tabellenwertung == -3 || $veranstaltung->tabellenwertung == -4){ ?> + + + + unterteilung == 0 ? Text::_('COM_SPORTSMANAGER_GAMEDAY_GENERATION') : Text::_('COM_SPORTSMANAGER_ROUND_GENERATION'); ?> @@ -8900,6 +8900,7 @@ class HTML_sportsmanager_admin { global $params; ?> +
'bezeichnung); ?> @@ -8909,11 +8910,11 @@ class HTML_sportsmanager_admin action="begegnung_id) : ''); ?>" method="post" name="adminForm" id="adminForm">
- +
- +
+ + + + + tabellenwertung == -4){ ?> + + + + + letzteRunde == $veranstaltung->naechsteRunde) {$display = "";} else {$display = "none";} ?> - + - From d0258d967d69e651a9c0eb0118e880b4fd02e8b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Wed, 24 Sep 2025 09:44:11 +0200 Subject: [PATCH 19/22] Optimierung Inserts fuer Aktualisierung Ranglisten --- .../com_sportsmanager/sportsmanager.php | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/structure/components/com_sportsmanager/sportsmanager.php b/src/structure/components/com_sportsmanager/sportsmanager.php index 359e1af..9aeb6f0 100644 --- a/src/structure/components/com_sportsmanager/sportsmanager.php +++ b/src/structure/components/com_sportsmanager/sportsmanager.php @@ -4822,7 +4822,6 @@ function teamstatistikAktualisieren($geaenderte_veranstaltung_id = 0, $geaendert function ranglisteAktualisieren($geaenderte_rangliste_id = 0, $geaenderte_turnierdisziplin_id = 0, $geaenderte_spieler_id = 0, $berechnungen_auswerten = FALSE): void { $db = getDatabase(); - if ($geaenderte_spieler_id != 0) { $query = "SELECT DISTINCT #__sportsmanager_rangliste.*" . "\n FROM #__sportsmanager_turniermeldung_spieler" @@ -4837,7 +4836,6 @@ function ranglisteAktualisieren($geaenderte_rangliste_id = 0, $geaenderte_turnie . "\n FROM #__sportsmanager_berechnung" . "\n INNER JOIN #__sportsmanager_rangliste ON id = rangliste_id" . "\n WHERE typ = 'rangliste' AND " . (empty($session_id) ? ("session_id < SUBTIME(NOW(), '00:10:00')") : ("session_id = '" . $session_id . "'")); - $berechnungen = loadObjectList($db, $query); } else if ($geaenderte_rangliste_id != 0) { $query = "SELECT * FROM #__sportsmanager_rangliste" . "\n WHERE rangliste_id = $geaenderte_rangliste_id"; @@ -4939,6 +4937,8 @@ function ranglisteAktualisieren($geaenderte_rangliste_id = 0, $geaenderte_turnie $db->transactionStart(); $meldungen = array(); + $Anzahl = 0; + $query = "INSERT INTO #__sportsmanager_rangliste_turnierdisziplin_punkte (rangliste_id, spieler_id, turnierdisziplin_id, platz, punkte) VALUES "; foreach ($turnierplatzierungen as $index => $turnierplatzierung) { if (empty($turnierplatzierung->spieler_id)) continue; @@ -5030,12 +5030,17 @@ function ranglisteAktualisieren($geaenderte_rangliste_id = 0, $geaenderte_turnie } } $punkte[$turnierplatzierung->spieler_id][] = $p; - $query = "INSERT INTO #__sportsmanager_rangliste_turnierdisziplin_punkte (rangliste_id, spieler_id, turnierdisziplin_id, platz, punkte) VALUES ('$rangliste_id', '$turnierplatzierung->spieler_id', '$turnierdisziplin->turnierdisziplin_id', '$turnierplatzierung->platz', '$p') ON DUPLICATE KEY UPDATE punkte = punkte + VALUES(punkte);"; - $db->setQuery($query); - if (!$db->execute()) { - die($db->stderr(true)); - } + if ($Anzahl > 0) $query .= ","; + $query .= "('$rangliste_id', '$turnierplatzierung->spieler_id', '$turnierdisziplin->turnierdisziplin_id', '$turnierplatzierung->platz', '$p')"; + $Anzahl++; } + $query .= " ON DUPLICATE KEY UPDATE punkte = punkte + VALUES(punkte);"; + if ($Anzahl > 0){ + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + } $db->transactionCommit(); } @@ -5056,22 +5061,26 @@ function ranglisteAktualisieren($geaenderte_rangliste_id = 0, $geaenderte_turnie $platz = 1; $tatsaechlicher_platz = 1; $spieler_punkte = 0; - + $Anzahl = 0; $db->transactionStart(); + $query = "INSERT INTO #__sportsmanager_rangliste_punkte(rangliste_id, spieler_id, punkte, teilnahmen, platz) VALUES "; foreach ($punkte_summe as $spieler_id => $spieler_punkte_summe) { $spieler_teilnahmen = $teilnahmen[$spieler_id]; if ($platz == 1 || $spieler_punkte != $spieler_punkte_summe) $tatsaechlicher_platz = $platz; - - $query = "INSERT INTO #__sportsmanager_rangliste_punkte (rangliste_id, spieler_id, punkte, teilnahmen, platz) VALUES ('$rangliste_id', '$spieler_id', '$spieler_punkte_summe', '$spieler_teilnahmen', '$tatsaechlicher_platz') ON DUPLICATE KEY UPDATE punkte = VALUES(punkte), teilnahmen = VALUES(teilnahmen), platz = VALUES(platz);"; - $db->setQuery($query); - if (!$db->execute()) { - die($db->stderr(true)); - } - + if ($Anzahl > 0) $query .= ","; + $query .= "('$rangliste_id', '$spieler_id', '$spieler_punkte_summe', '$spieler_teilnahmen', '$tatsaechlicher_platz') "; + $Anzahl++; $spieler_punkte = $spieler_punkte_summe; $platz++; } + $query .= " ON DUPLICATE KEY UPDATE punkte = VALUES(punkte), teilnahmen = VALUES(teilnahmen), platz = VALUES(platz);"; + if ($Anzahl > 0){ + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + } $db->transactionCommit(); // Unabhängig von $berechnungen_auswerten ausführen, um ggf. vorhandene Inhalte zu entfernen From 64ce39a59f2dda818bcc862fdbe097efaf1c49df Mon Sep 17 00:00:00 2001 From: Marvin Flock Date: Thu, 25 Sep 2025 02:53:50 +0200 Subject: [PATCH 20/22] feat: add email reminder functionality --- scripts/migrate_add_reminder_fields.php | 45 ------- scripts/send_missing_results_reminder.php | 53 -------- .../components/com_sportsmanager/admin.php | 21 +-- .../com_sportsmanager/database/update.php | 22 ++- .../com_sportsmanager/sportsmanager.php | 3 + .../com_sportsmanager/util/email.php | 125 ++++++++++++++++++ .../views/sportsmanager/view_admin.php | 83 +++++++++--- .../de-DE/de-DE.com_sportsmanager.ini | 3 +- .../en-GB/en-GB.com_sportsmanager.ini | 3 +- src/structure/script.php | 13 +- 10 files changed, 236 insertions(+), 135 deletions(-) delete mode 100644 scripts/migrate_add_reminder_fields.php delete mode 100644 scripts/send_missing_results_reminder.php create mode 100644 src/structure/components/com_sportsmanager/util/email.php diff --git a/scripts/migrate_add_reminder_fields.php b/scripts/migrate_add_reminder_fields.php deleted file mode 100644 index 0eea06a..0000000 --- a/scripts/migrate_add_reminder_fields.php +++ /dev/null @@ -1,45 +0,0 @@ -setQuery("SHOW COLUMNS FROM #__sportsmanager_turnier"); - $existing = array_column($db->loadAssocList(), 'Field'); - $alter = []; - if (!in_array('reminder_24h_sent', $existing)) { - $alter[] = 'ADD COLUMN `reminder_24h_sent` DATETIME DEFAULT NULL'; - } - if (!in_array('reminder_3d_sent', $existing)) { - $alter[] = 'ADD COLUMN `reminder_3d_sent` DATETIME DEFAULT NULL'; - } - if (!in_array('reminder_7d_sent', $existing)) { - $alter[] = 'ADD COLUMN `reminder_7d_sent` DATETIME DEFAULT NULL'; - } - if ($alter) { - $query = 'ALTER TABLE #__sportsmanager_turnier ' . implode(', ', $alter); - $db->setQuery($query); - $db->execute(); - echo "Migration successful: reminder fields added.\n"; - } else { - echo "Migration skipped: fields already exist.\n"; - } -} - -addReminderFieldsToTurnierTable(); diff --git a/scripts/send_missing_results_reminder.php b/scripts/send_missing_results_reminder.php deleted file mode 100644 index feef687..0000000 --- a/scripts/send_missing_results_reminder.php +++ /dev/null @@ -1,53 +0,0 @@ -getQuery(true) - ->select('t.*, u.email AS user_email, v.email AS verband_email') - ->from('#__sportsmanager_turnier AS t') - ->leftJoin('#__users AS u ON t.responsible_user_id = u.id') - ->leftJoin('#__sportsmanager_verband AS v ON t.verband_id = v.verband_id') - ->where('t.letzter_tag BETWEEN ' . $db->quote($twoWeeksAgo) . ' AND ' . $db->quote($oneDayAgo)) - ->where('NOT EXISTS (SELECT 1 FROM #__sportsmanager_turnierergebnis e WHERE e.turnier_id = t.turnier_id)') - ->where('(t.reminder_sent IS NULL OR t.reminder_sent < DATE_SUB(' . $db->quote($now) . ', INTERVAL 1 DAY))'); - $db->setQuery($query); - $tournaments = $db->loadObjectList(); - - foreach ($tournaments as $tournament) { - $mailer = Factory::getContainer()->get(MailerFactoryInterface::class)->createMailer(); - $config = Factory::getConfig(); - $mailer->setSender([$config->get('mailfrom'), $config->get('fromname')]); - $mailer->setSubject('Erinnerung: Turnierergebnisse fehlen für ' . $tournament->turnierbezeichnung); - $body = "Für das Turnier '" . $tournament->turnierbezeichnung . "' am " . $tournament->letzter_tag . - " wurden noch keine Ergebnisse hochgeladen. Laut Turnierordnung müssen die Ergebnisse spätestens 24 Stunden nach Turnierende eingetragen werden. Bitte reichen Sie die Ergebnisse umgehend nach."; - $mailer->setBody($body); - $mailer->addRecipient($tournament->user_email); - if (!empty($tournament->verband_email)) { - $mailer->addBcc($tournament->verband_email); - } - $mailer->send(); - - // Mark reminder as sent (or log in a separate table for multiple reminders) - $db->setQuery('UPDATE #__sportsmanager_turnier SET reminder_sent = ' . $db->quote($now) . ' WHERE turnier_id = ' . (int)$tournament->turnier_id); - $db->execute(); - } -} - -sendMissingTournamentResultsReminders(); diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 1a42438..dfbd2f6 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -661,15 +661,12 @@ function adminEinstellungen(): void $spalte_mitglieder_zeigen = $jInput->get('spalte_mitglieder_zeigen', 0, 'INT'); $turnierbaum_zeigen = $jInput->get('turnierbaum_zeigen', 0, 'INT'); $termine_beantragen = $jInput->get('termine_beantragen', 0, 'INT'); + $enableEmailReminders = $jInput->get('enable_email_reminders', 0, 'INT'); + $spielerimport_persoenliche_daten_vorauswahl = $jInput->get('spielerimport_persoenliche_daten_vorauswahl', 0, 'INT'); $api_push_key = $jInput->get('api_push_key', '', 'RAW'); - /* - $twitter_benutzername = $db->escape(trim( $jInput->get('twitter_benutzername', '', 'RAW') )); - $twitter_kennwort = !empty($twitter_benutzername) ? $db->escape(trim( $jInput->get('twitter_kennwort', '', 'RAW') )) : ""; - */ - $query = "REPLACE #__sportsmanager_einstellungen" . "\n SET name = 'basis_spielernr'" . ", wert = '$basis_spielernr'"; @@ -780,6 +777,12 @@ function adminEinstellungen(): void die($db->stderr(true)); } + $query = "REPLACE #__sportsmanager_einstellungen SET name = 'enable_email_reminders', wert = '$enableEmailReminders'"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + redirectSportsManagerURL('&task=admin_uebersicht'); } @@ -10218,7 +10221,7 @@ function adminBegegnungenPokalrundeAuslosenForm(): void if (!$db->execute()) { die($db->stderr(true)); } - + redirectSportsManagerURL('&task=admin_begegnungen&veranstaltungid=' . $veranstaltungId); } else{ @@ -10564,6 +10567,7 @@ function adminEditTurnier(): void $turnierort = $db->escape(trim($jInput->get('turnierort', '', 'RAW'))); $erster_tag = normalisiertesDatum(sprintf("%04d-%02d-%02d", $jInput->get('erster_tag_jahr', 2000, 'INT'), $jInput->get('erster_tag_monat', 1, 'INT'), $jInput->get('erster_tag_tag', 1, 'INT'))); $mehrtaegig = $jInput->get('mehrtaegig', 0, 'INT'); + $reminder_count = $jInput->get('reminder_count', 0, 'INT'); if (!$mehrtaegig) $letzter_tag = $erster_tag; else @@ -10587,7 +10591,7 @@ function adminEditTurnier(): void } if ($id == 0) { - $query = "INSERT INTO #__sportsmanager_turnier (veranstalter_id, turnierbezeichnung, saison_id, turnierort, erster_tag" . ($letzter_tag != null ? ", letzter_tag" : "") . ", kategorie) VALUES ('$veranstalterId', '$turnierbezeichnung', '$saison_id', '$turnierort', '$erster_tag'" . ($letzter_tag != null ? ", '$letzter_tag'" : "") . ", '$kategorie');"; + $query = "INSERT INTO #__sportsmanager_turnier (veranstalter_id, turnierbezeichnung, saison_id, turnierort, erster_tag" . ($letzter_tag != null ? ", letzter_tag" : "") . ", kategorie, reminder_count) VALUES ('$veranstalterId', '$turnierbezeichnung', '$saison_id', '$turnierort', '$erster_tag'" . ($letzter_tag != null ? ", '$letzter_tag'" : "") . ", '$kategorie', '0');"; $db->setQuery($query); if (!$db->execute()) { die($db->stderr(true)); @@ -10601,7 +10605,8 @@ function adminEditTurnier(): void . "\n turnierort = '$turnierort'," . "\n erster_tag = '$erster_tag'," . "\n letzter_tag = " . ($letzter_tag != null ? "'$letzter_tag'" : "NULL") . "," - . "\n kategorie = '$kategorie'" + . "\n kategorie = '$kategorie'," + . "\n reminder_count = '$reminder_count'" . "\n WHERE turnier_id = $id"; $db->setQuery($query); if (!$db->execute()) { diff --git a/src/structure/components/com_sportsmanager/database/update.php b/src/structure/components/com_sportsmanager/database/update.php index 9b3055b..e824373 100644 --- a/src/structure/components/com_sportsmanager/database/update.php +++ b/src/structure/components/com_sportsmanager/database/update.php @@ -5300,11 +5300,11 @@ function updateDatabase(): void $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'verband_anzeigen', wert = '1';"; $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } - + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'turnierbaum_zeigen', wert = '0';"; $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } - + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'spalte_mitglieder_zeigen', wert = '1';"; $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } @@ -5318,6 +5318,24 @@ function updateDatabase(): void } } + if ($datenbank_version < 108) { + $query = "ALTER TABLE #__sportsmanager_turnier ADD COLUMN `reminder_count` TINYINT DEFAULT '3'"; // 3: prevent email flood for past tournaments + $db->setQuery($query); + if (!$db->execute()) { die($db->stderr(true)); } + + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'enable_email_reminders', wert = '0';"; + $db->setQuery( $query ); + if (!$db->execute()) { die($db->stderr(true)); } + + $query = "UPDATE #__sportsmanager_einstellungen" + . "\n SET wert = '108'" + . "\n WHERE name = 'datenbank_version'"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + } + if ($termin_aktionen_email_setzen) { $query = "SELECT aktion_user_id, termin_aktion_id" . "\n FROM #__sportsmanager_termin_aktion"; diff --git a/src/structure/components/com_sportsmanager/sportsmanager.php b/src/structure/components/com_sportsmanager/sportsmanager.php index bec7237..5d0b164 100644 --- a/src/structure/components/com_sportsmanager/sportsmanager.php +++ b/src/structure/components/com_sportsmanager/sportsmanager.php @@ -42,11 +42,14 @@ require_once JPATH_SITE . '/components/com_sportsmanager/views/sportsmanager/vie require_once JPATH_SITE . '/components/com_sportsmanager/views/sportsmanager/view_admin.php'; require_once JPATH_SITE . '/components/com_sportsmanager/views/sportsmanager/view_ticker.php'; require_once JPATH_SITE . '/components/com_sportsmanager/util/image.php'; +require_once JPATH_SITE . '/components/com_sportsmanager/util/email.php'; require_once JPATH_SITE . '/components/com_sportsmanager/database/update.php'; // will also include init.php and util.php initDatabase(); updateDatabase(); +sentEmailReminders(); + if (isset($_POST['filter_saison_id'])) setcookie('sportsmanager_filter_saison_id', $_POST['filter_saison_id'], time() + (60 * 60 * 24)); else if (isset($_REQUEST['filter_saison_id'])) diff --git a/src/structure/components/com_sportsmanager/util/email.php b/src/structure/components/com_sportsmanager/util/email.php new file mode 100644 index 0000000..4b2b5c5 --- /dev/null +++ b/src/structure/components/com_sportsmanager/util/email.php @@ -0,0 +1,125 @@ +get(SiteApplication::class); + $db = getDatabase(); + + $query = $db->getQuery(true) + ->select('wert') + ->from('#__sportsmanager_einstellungen') + ->where('name = ' . $db->quote('enable_email_reminders')); + $row = loadResult($db, $query); + + if (!$row) { + return; // quit when email reminders are disabled + } + + $query = $db->getQuery(true) + ->select('tournament.turnier_id, tournament.turnierbezeichnung, tournament.letzter_tag, tournament.reminder_count, GROUP_CONCAT(user.email SEPARATOR ", ") as emails') + ->from($db->quoteName('#__sportsmanager_turnier', 'tournament')) + ->join('INNER', $db->quoteName('#__sportsmanager_berechtigt_fuer_turnier', 'entitled') . ' ON tournament.turnier_id = entitled.berechtigt_turnier_id') + ->join('INNER', $db->quoteName('#__users', 'user') . ' ON entitled.berechtigt_user_id = user.id') + ->where('tournament.reminder_count < 3') + ->group('tournament.turnier_id, tournament.turnierbezeichnung'); + $rows = loadObjectList($db, $query); + + if(!empty($rows)) { + $mailFrom = $app->getCfg('mailfrom'); + $fromName = $app->getCfg('fromname'); + + $mailer = Factory::getContainer()->get(MailerFactoryInterface::class)->createMailer(); + $mailer->setSender($mailFrom, $fromName); + foreach ($rows as $row) { + $currentReminder = $row->reminder_count + 1; + + if (hasResultsAlready($db, $row)) { + updateDBReminders($db, $row, 3); // do not sent any more reminders + continue; + } + + if (!isset($row->emails) || $row->emails == "" || $row->emails == NULL) { + Log::add('can\'t sent ' . $currentReminder .'. email reminder for tournament ' . $row->turnierbezeichnung . ': no recipient set', Log::WARNING, 'com_sportsmanager'); + continue; + } + + $now = new DateTime(); + $last_day = new DateTime($row->letzter_tag); + $last_day->modify('+1 day'); // start to count at the end of the day, not at the beginning + $diff = $now->getTimestamp() - $last_day->getTimestamp(); + + $reminderDelays = [ + 1 => 24*60*60, // 24h + 2 => 3*24*60*60, // 3d + 3 => 13*24*60*60 // 13d + ]; + + foreach ($reminderDelays as $count => $delay) { + if ($diff >= $delay && $row->reminder_count < $count) { + $subject = ($row->reminder_count == 2 ? "Letzte " : "") . "Erinnerung: " . $row->turnierbezeichnung . " Ergebnisse einreichen!"; + $body = "Hi," + . "\n\nDies ist die " . $currentReminder . ". " . ($row->reminder_count == 2 ? "*und damit letzte* " : "") . "Erinnerung die Turnierergebnisse einzureichen." + . "\n\nTurnier: " . $row->turnierbezeichnung + . "\nTurnierende: " . FormatiertesDatum($row->letzter_tag, false, false) + . "\n\nLaut Turnierordnung müssen die Ergebnisse spätestens 24 Stunden nach Turnierende eingetragen werden. Bitte reich die Ergebnisse umgehend nach." + . "\n\nDu erhältst diese Mail, weil du als Berechtigter für das Turnier eingetragen wurdest. Falls du nicht der Veranstalter bist, leite diese Email bitte entsprechend weiter." + . "\n\nHochladen der Ergebnisse über " . SportsManagerURL('&task=admin_turnierdisziplinen&turnierid=' . $row->turnier_id, -1) . "."; + + $mailer->setSubject($subject); + $mailer->setBody($body); + + $emailArray = explode(", ", $row->emails); + foreach ($emailArray as $email) { + $mailer->addBcc($email); + } + $mailer->send(); + + updateDBReminders($db, $currentReminder, $row->turnier_id); + } + } + } + } +} + +function updateDBReminders($db, $reminder, $tournamentId): void +{ + $query = $db->getQuery(true) + ->update($db->quoteName('#__sportsmanager_turnier')) + ->set($db->quoteName('reminder_count') . ' = ' . $db->quote($reminder)) + ->where($db->quoteName('turnier_id') . ' = ' . $db->quote($tournamentId)); + + $db->setQuery($query); + $db->execute(); +} + +/** + * checks if a tournament has at least one result entry for a discipline + * @param $db + * @param $row mixed tournament entry + * @return bool true if at least one result is given, else false + * @since 2.2 + */ +function hasResultsAlready($db, mixed $row): bool +{ + $subQuery = $db->getQuery(true) + ->select($db->quoteName('turnierdisziplin_id')) + ->from($db->quoteName('#__sportsmanager_turnierdisziplin')) + ->where($db->quoteName('turnier_id') . ' = ' . $db->quote($row->turnier_id)); + + $query = $db->getQuery(true) + ->select('COUNT(*) AS count') + ->from($db->quoteName('#__sportsmanager_turniermeldung', 'tm')) + ->where($db->quoteName('tm.turnierdisziplin_id') . ' IN (' . $subQuery . ')'); + + $result = loadResult($db, $query); + return $result && $result[0]->count > 0; +} 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 261b5ce..f4236f6 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php @@ -727,9 +727,10 @@ class HTML_sportsmanager_admin : @@ -867,6 +868,22 @@ class HTML_sportsmanager_admin + + + + - tabellenwertung == -4){ ?> + tabellenwertung == -4){ ?> - + letzteRunde == $veranstaltung->naechsteRunde) {$display = "";} else {$display = "none";} ?> @@ -11586,14 +11590,51 @@ class HTML_sportsmanager_admin - "/> "/> + "/> + + setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } - $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'datenbank_version', wert = '107';"; + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'datenbank_version', wert = '108';"; $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } @@ -1144,15 +1145,19 @@ return new class () implements InstallerScriptInterface $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'verband_anzeigen', wert = '1';"; $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } - + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'turnierbaum_zeigen', wert = '0';"; $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } - + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'spalte_mitglieder_zeigen', wert = '1';"; $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } - + + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'enable_email_reminders', wert = '0';"; + $db->setQuery( $query ); + if (!$db->execute()) { die($db->stderr(true)); } + $query = "INSERT INTO #__sportsmanager_verschieberegel (bezeichnung, initial_ohne_termin, keine_gegenvorschlaege, vorlaufzeit_tage, termine_minimal, termine_maximal, ablehnen)" . "\n VALUES ('Beliebig', '0', '0', '0', '1', '3', '0');"; $db->setQuery($query); From bbe786a07546bdc2548d3b4f9238853cd365c0d9 Mon Sep 17 00:00:00 2001 From: Marvin Flock Date: Thu, 25 Sep 2025 18:13:58 +0200 Subject: [PATCH 21/22] fix: update regarding code review --- src/structure/components/com_sportsmanager/admin.php | 2 +- .../components/com_sportsmanager/database/update.php | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index dfbd2f6..2e64542 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -10591,7 +10591,7 @@ function adminEditTurnier(): void } if ($id == 0) { - $query = "INSERT INTO #__sportsmanager_turnier (veranstalter_id, turnierbezeichnung, saison_id, turnierort, erster_tag" . ($letzter_tag != null ? ", letzter_tag" : "") . ", kategorie, reminder_count) VALUES ('$veranstalterId', '$turnierbezeichnung', '$saison_id', '$turnierort', '$erster_tag'" . ($letzter_tag != null ? ", '$letzter_tag'" : "") . ", '$kategorie', '0');"; + $query = "INSERT INTO #__sportsmanager_turnier (veranstalter_id, turnierbezeichnung, saison_id, turnierort, erster_tag" . ($letzter_tag != null ? ", letzter_tag" : "") . ", kategorie) VALUES ('$veranstalterId', '$turnierbezeichnung', '$saison_id', '$turnierort', '$erster_tag'" . ($letzter_tag != null ? ", '$letzter_tag'" : "") . ", '$kategorie');"; $db->setQuery($query); if (!$db->execute()) { die($db->stderr(true)); diff --git a/src/structure/components/com_sportsmanager/database/update.php b/src/structure/components/com_sportsmanager/database/update.php index e824373..46e052a 100644 --- a/src/structure/components/com_sportsmanager/database/update.php +++ b/src/structure/components/com_sportsmanager/database/update.php @@ -5319,10 +5319,16 @@ function updateDatabase(): void } if ($datenbank_version < 108) { - $query = "ALTER TABLE #__sportsmanager_turnier ADD COLUMN `reminder_count` TINYINT DEFAULT '3'"; // 3: prevent email flood for past tournaments + $query = "ALTER TABLE #__sportsmanager_turnier ADD COLUMN `reminder_count` TINYINT DEFAULT '0'"; $db->setQuery($query); if (!$db->execute()) { die($db->stderr(true)); } + // set all existing tournaments to 3 to prevent email flooding + $query = "UPDATE #__sportsmanager_turnier SET `reminder_count` = '3'"; + $db->setQuery($query); + if (!$db->execute()) { die($db->stderr(true)); } + + // 3: prevent email flood for past tournaments $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'enable_email_reminders', wert = '0';"; $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } From 9b4eb13d520dfdac45d62268daa126834ce64cd8 Mon Sep 17 00:00:00 2001 From: Marvin Flock Date: Thu, 25 Sep 2025 23:43:11 +0200 Subject: [PATCH 22/22] feat: prevent email flood on new created tournaments when email reminder are turned on in later stages --- .../components/com_sportsmanager/admin.php | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 2ad549e..c783808 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -21,14 +21,14 @@ require_once JPATH_SITE . '/components/com_sportsmanager/database/init.php'; function UhrzeitWandlerDE(string $input): string { // mögliche Datumsformate $formats = [ - 'Y-m-d H:i', - 'd.m.Y H:i', + 'Y-m-d H:i', + 'd.m.Y H:i', 'd.m.Y H:i:s', ]; foreach ($formats as $format) { $dt = DateTime::createFromFormat($format, $input); - + // prüfen, ob Parsing erfolgreich war UND das Datum exakt passt if ($dt && $dt->format($format) === $input) { return $dt->format('Y-m-d H:i:s'); @@ -9618,7 +9618,7 @@ function adminBegegnungenImportieren(): void if ($encoding == "UTF-8") echo $data[$Titelzeile['Heim']]; else - echo utf8_encode($data[$Titelzeile['Heim']]); + echo utf8_encode($data[$Titelzeile['Heim']]); echo ""; if ($Begegnung[$Zeile]['gast_team_id'] == "") { if ($data[$Titelzeile['Gast']] == "spielfrei") { @@ -10633,7 +10633,20 @@ function adminEditTurnier(): void } if ($id == 0) { - $query = "INSERT INTO #__sportsmanager_turnier (veranstalter_id, turnierbezeichnung, saison_id, turnierort, erster_tag" . ($letzter_tag != null ? ", letzter_tag" : "") . ", kategorie) VALUES ('$veranstalterId', '$turnierbezeichnung', '$saison_id', '$turnierort', '$erster_tag'" . ($letzter_tag != null ? ", '$letzter_tag'" : "") . ", '$kategorie');"; + $query = $db->getQuery(true) + ->select('wert') + ->from('#__sportsmanager_einstellungen') + ->where('name = ' . $db->quote('enable_email_reminders')); + $remindersEnabled = loadResult($db, $query); + + $query = "INSERT INTO #__sportsmanager_turnier (veranstalter_id, turnierbezeichnung, saison_id, turnierort, erster_tag" + . ($letzter_tag != null ? ", letzter_tag" : "") + . ", kategorie, reminder_count) VALUES ('$veranstalterId', '$turnierbezeichnung', '$saison_id', '$turnierort', '$erster_tag'" + . ($letzter_tag != null ? ", '$letzter_tag'" : "") + . ", '$kategorie', " + . (!$remindersEnabled ? "'3'" : "'0'") + . ")"; + $db->setQuery($query); if (!$db->execute()) { die($db->stderr(true));
+ + + +
@@ -10385,8 +10413,26 @@ class HTML_sportsmanager_admin
+ + + +
diff --git a/src/structure/language/de-DE/de-DE.com_sportsmanager.ini b/src/structure/language/de-DE/de-DE.com_sportsmanager.ini index 7800f19..ff891b3 100644 --- a/src/structure/language/de-DE/de-DE.com_sportsmanager.ini +++ b/src/structure/language/de-DE/de-DE.com_sportsmanager.ini @@ -646,6 +646,7 @@ COM_SPORTSMANAGER_GAMEDAYS="Spieltage" COM_SPORTSMANAGER_ROUND="Runde" COM_SPORTSMANAGER_ROUNDS="Runden" COM_SPORTSMANAGER_ROUND_TITLE="Runde Bezeichnung" +COM_SPORTSMANAGER_DRAW_FOR_HOME="Heimrecht auslosen" COM_SPORTSMANAGER_MATCH_PLACE3="Spiel um Platz 3" COM_SPORTSMANAGER_MONTH="Monat" COM_SPORTSMANAGER_MONTHS="Monate" diff --git a/src/structure/language/en-GB/en-GB.com_sportsmanager.ini b/src/structure/language/en-GB/en-GB.com_sportsmanager.ini index 270b3c9..486d83a 100644 --- a/src/structure/language/en-GB/en-GB.com_sportsmanager.ini +++ b/src/structure/language/en-GB/en-GB.com_sportsmanager.ini @@ -646,6 +646,7 @@ COM_SPORTSMANAGER_GAMEDAYS="Gamedays" COM_SPORTSMANAGER_ROUND="Round" COM_SPORTSMANAGER_ROUNDS="Rounds" COM_SPORTSMANAGER_ROUND_TITLE="Round Title" +COM_SPORTSMANAGER_DRAW_FOR_HOME="Draw for home" COM_SPORTSMANAGER_MATCH_PLACE3="Match for place 3" COM_SPORTSMANAGER_MONTH="Month" COM_SPORTSMANAGER_MONTHS="Months" From 1d9aa13300da996c45595182cc8d4906e2b4a71c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Fri, 12 Sep 2025 10:56:25 +0200 Subject: [PATCH 05/22] =?UTF-8?q?=C3=9Cberarbeitung=20Anzeige=20Vereinslis?= =?UTF-8?q?te=20in=20Frontend=20(issue=20#178)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/com_sportsmanager/admin.php | 9 +++ .../com_sportsmanager/sportsmanager.php | 7 ++- .../views/sportsmanager/view.html.php | 17 ++++-- .../views/sportsmanager/view_admin.php | 58 ++++++++++++++++--- .../de-DE/de-DE.com_sportsmanager.ini | 5 +- .../en-GB/en-GB.com_sportsmanager.ini | 5 +- 6 files changed, 80 insertions(+), 21 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index cab859e..e9042ed 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -658,6 +658,7 @@ function adminEinstellungen(): void $lizenz_anzeigen = $jInput->get('lizenz_anzeigen', 0, 'INT'); $anzahl_mitglieder_zeigen = $jInput->get('anzahl_mitglieder_zeigen', 0, 'INT'); $verband_anzeigen = $jInput->get('verband_anzeigen', 0, 'INT'); + $spalte_mitglieder_zeigen = $jInput->get('spalte_mitglieder_zeigen', 0, 'INT'); $turnierbaum_zeigen = $jInput->get('turnierbaum_zeigen', 0, 'INT'); $termine_beantragen = $jInput->get('termine_beantragen', 0, 'INT'); $spielerimport_persoenliche_daten_vorauswahl = $jInput->get('spielerimport_persoenliche_daten_vorauswahl', 0, 'INT'); @@ -717,6 +718,14 @@ function adminEinstellungen(): void die($db->stderr(true)); } + $query = "REPLACE #__sportsmanager_einstellungen" + . "\n SET name = 'spalte_mitglieder_zeigen'" + . ", wert = '$spalte_mitglieder_zeigen'"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + $query = "REPLACE #__sportsmanager_einstellungen" . "\n SET name = 'turnierbaum_zeigen'" . ", wert = '$turnierbaum_zeigen'"; diff --git a/src/structure/components/com_sportsmanager/sportsmanager.php b/src/structure/components/com_sportsmanager/sportsmanager.php index b1dcbc4..90c901b 100644 --- a/src/structure/components/com_sportsmanager/sportsmanager.php +++ b/src/structure/components/com_sportsmanager/sportsmanager.php @@ -3787,13 +3787,14 @@ function vereine($sort): void $db = getDatabase(); global $params; $organisationAnzeigen = einstellungswert('verband_anzeigen'); - + $spalteMitgliederAnzeigen = einstellungswert('spalte_mitglieder_zeigen'); + if (!$spalteMitgliederAnzeigen) $sort = "vereinsname"; $query = "SELECT t1.verein_id, t1.vereinsname, t1.vereinssitz," . "\n t2.veranstalterbezeichnung, COUNT(*) As mitglieder" . "\n FROM #__sportsmanager_verein AS t1" . "\n LEFT JOIN #__sportsmanager_veranstalter AS t2 USING (veranstalter_id)" . "\n LEFT JOIN #__sportsmanager_mitglied_von_verein AS t3 USING (verein_id)" - . "\n WHERE t1.ausgetreten = 0 AND verstecken = 0" + . "\n WHERE t1.ausgetreten = 0 AND t1.verstecken = 0 AND t3.ausgetreten = 0" . "\n GROUP BY t1.verein_id"; if ($sort == "mitglieder"){ $query .= "\n HAVING mitglieder >= " . einstellungswert('anzahl_mitglieder_zeigen'); @@ -3804,7 +3805,7 @@ function vereine($sort): void } $vereine = loadObjectList($db, $query); - HTML_sportsmanager::vereine($params->get('titel'), $params->get('beschreibung'), $vereine, $organisationAnzeigen); + HTML_sportsmanager::vereine($params->get('titel'), $params->get('beschreibung'), $vereine, $organisationAnzeigen, $spalteMitgliederAnzeigen); administrationFooter(); } 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 3fc8916..bad6dde 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php @@ -3082,7 +3082,7 @@ static function tabelleAnzeigen($veranstaltung, $modus, $teams, $spieltag, $spie } } - static function vereine($titel, $beschreibung, $rows, $organisationAnzeigen): void + static function vereine($titel, $beschreibung, $rows, $organisationAnzeigen, $spalteMitgliederAnzeigen): void { global $params; if (!empty($titel)) { ?> @@ -3115,17 +3115,20 @@ static function tabelleAnzeigen($veranstaltung, $modus, $teams, $spieltag, $spie - + - - + + + + @@ -3153,9 +3156,11 @@ static function tabelleAnzeigen($veranstaltung, $modus, $teams, $spieltag, $spie vereinsname)); ?> + + " . $row->veranstalterbezeichnung . ""; 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 6a01e20..87640e8 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php @@ -727,14 +727,9 @@ class HTML_sportsmanager_admin : @@ -755,6 +750,24 @@ class HTML_sportsmanager_admin + + + + @@ -945,7 +945,7 @@ class HTML_sportsmanager_admin }); } - enableNumberOnly(document.getElementById("anzahl_mitglieder_zeigen")); + enableNumberOnly(document.getElementById("show_member_count")); Date: Wed, 17 Sep 2025 08:54:22 +0200 Subject: [PATCH 07/22] Initialisierung neuer Einstellungen --- .../com_sportsmanager/database/update.php | 27 +++++++++++++++++++ src/structure/script.php | 22 ++++++++++++--- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/structure/components/com_sportsmanager/database/update.php b/src/structure/components/com_sportsmanager/database/update.php index 66dfd2c..9b3055b 100644 --- a/src/structure/components/com_sportsmanager/database/update.php +++ b/src/structure/components/com_sportsmanager/database/update.php @@ -5291,6 +5291,33 @@ function updateDatabase(): void } } + if ($datenbank_version < 107) { + + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'anzahl_mitglieder_zeigen', wert = '0';"; + $db->setQuery( $query ); + if (!$db->execute()) { die($db->stderr(true)); } + + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'verband_anzeigen', wert = '1';"; + $db->setQuery( $query ); + if (!$db->execute()) { die($db->stderr(true)); } + + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'turnierbaum_zeigen', wert = '0';"; + $db->setQuery( $query ); + if (!$db->execute()) { die($db->stderr(true)); } + + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'spalte_mitglieder_zeigen', wert = '1';"; + $db->setQuery( $query ); + if (!$db->execute()) { die($db->stderr(true)); } + + $query = "UPDATE #__sportsmanager_einstellungen" + . "\n SET wert = '107'" + . "\n WHERE name = 'datenbank_version'"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + } + if ($termin_aktionen_email_setzen) { $query = "SELECT aktion_user_id, termin_aktion_id" . "\n FROM #__sportsmanager_termin_aktion"; diff --git a/src/structure/script.php b/src/structure/script.php index d029684..5ff6caa 100644 --- a/src/structure/script.php +++ b/src/structure/script.php @@ -1117,7 +1117,7 @@ return new class () implements InstallerScriptInterface $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } - $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'datenbank_version', wert = '106';"; + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'datenbank_version', wert = '107';"; $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } @@ -1125,11 +1125,11 @@ return new class () implements InstallerScriptInterface $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } - $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'spielerliste_elo', wert = '0';"; + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'spielerliste_elo', wert = '0';"; $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } - $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'ansprechpartner_ausblenden', wert = '0';"; + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'ansprechpartner_ausblenden', wert = '0';"; $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } @@ -1137,6 +1137,22 @@ return new class () implements InstallerScriptInterface $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'anzahl_mitglieder_zeigen', wert = '0';"; + $db->setQuery( $query ); + if (!$db->execute()) { die($db->stderr(true)); } + + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'verband_anzeigen', wert = '1';"; + $db->setQuery( $query ); + if (!$db->execute()) { die($db->stderr(true)); } + + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'turnierbaum_zeigen', wert = '0';"; + $db->setQuery( $query ); + if (!$db->execute()) { die($db->stderr(true)); } + + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'spalte_mitglieder_zeigen', wert = '1';"; + $db->setQuery( $query ); + if (!$db->execute()) { die($db->stderr(true)); } + $query = "INSERT INTO #__sportsmanager_verschieberegel (bezeichnung, initial_ohne_termin, keine_gegenvorschlaege, vorlaufzeit_tage, termine_minimal, termine_maximal, ablehnen)" . "\n VALUES ('Beliebig', '0', '0', '0', '1', '3', '0');"; $db->setQuery($query); From e8c4ab2d1d60273d78db4567e0c11815a613b07e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Wed, 17 Sep 2025 10:41:59 +0200 Subject: [PATCH 08/22] Korrektur Dropdown Spielorte --- .../com_sportsmanager/views/sportsmanager/view_admin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 51300b3..57be5e1 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php @@ -10379,7 +10379,7 @@ class HTML_sportsmanager_admin echo "ortsname) ? $spielort->ortsname : Text::_('COM_SPORTSMANAGER_WITHOUT_PLACE')) . "\">"; $ortsname = $spielort->ortsname; } - echo ""; + echo ""; } if ($ortsname != -1) echo ""; From 9babcec39e6c1ab5ab03292b40d6b9442ec8ea4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Wed, 17 Sep 2025 19:17:30 +0200 Subject: [PATCH 09/22] Passive und inaktive Spieler werden im oeffentlichen Bereich nicht mehr gezeigt (issue #150) --- .../com_sportsmanager/sportsmanager.php | 19 +++++++++++++++---- .../views/sportsmanager/view.html.php | 9 ++++++++- .../views/sportsmanager/view.json.php | 1 + 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/structure/components/com_sportsmanager/sportsmanager.php b/src/structure/components/com_sportsmanager/sportsmanager.php index 90c901b..c1f96b0 100644 --- a/src/structure/components/com_sportsmanager/sportsmanager.php +++ b/src/structure/components/com_sportsmanager/sportsmanager.php @@ -2872,12 +2872,14 @@ function spieler(): void $query .= "\n INNER JOIN (SELECT spieler_id, teamname FROM #__sportsmanager_veranstaltung INNER JOIN #__sportsmanager_team USING (veranstaltung_id) INNER JOIN #__sportsmanager_mitglied_von_team USING (team_id) WHERE status > 0 AND veranstaltung_id = $veranstaltungid AND NOT ausgetreten GROUP BY spieler_id ORDER BY YEAR(letzter_tag) DESC, reihenfolge, letzter_tag DESC, bezeichnung, teamname) AS mannschaftsmitglied USING (spieler_id)"; $query .= "\n LEFT JOIN #__sportsmanager_verein ON aktueller_verein_id = verein_id" . "\n LEFT JOIN #__sportsmanager_veranstalter USING (veranstalter_id)" - . "\n WHERE NOT ISNULL(aktueller_verein_id)"; + . "\n LEFT JOIN #__sportsmanager_mitglied_von_verein USING (spieler_id)" + . "\n WHERE NOT ISNULL(aktueller_verein_id) AND #__sportsmanager_mitglied_von_verein.mitgliedsstatus IN (1,2)"; if (!empty($search)) $query .= "\n AND (CONCAT_WS(', ', nachname, vorname) LIKE '$searchEscapedWildcards' OR CONCAT_WS(' ', vorname, nachname) LIKE '$searchEscapedWildcards' OR spielernr = '$searchEscaped' OR lizenznr = '$searchEscaped')"; if ($einstufungid != 0) $query .= "\n AND (einstufung_allgemein_id = $einstufungid OR einstufung_einzel_id = $einstufungid OR einstufung_doppel_id = $einstufungid)"; - if (!empty($kategorie)) + $query .= "\n GROUP BY spieler_id"; + if (!empty($kategorie)) $query .= "\n HAVING kategorie = '" . $db->escape($kategorie) . "'"; $query .= "\n ORDER BY " . $sortierung_query . "\n LIMIT $beginn, 50"; @@ -2995,7 +2997,11 @@ function spielerDetails(): void $query = "SELECT vereinsname" . "\n FROM #__sportsmanager_mitglied_von_verein, #__sportsmanager_verein" . "\n LEFT JOIN #__sportsmanager_veranstalter USING (veranstalter_id)" - . "\n WHERE #__sportsmanager_mitglied_von_verein.spieler_id = $id AND NOT #__sportsmanager_verein.ausgetreten AND NOT #__sportsmanager_mitglied_von_verein.ausgetreten AND #__sportsmanager_verein.verein_id = #__sportsmanager_mitglied_von_verein.verein_id" + . "\n WHERE #__sportsmanager_mitglied_von_verein.spieler_id = $id " + . "\n AND NOT #__sportsmanager_verein.ausgetreten" + . "\n AND NOT #__sportsmanager_mitglied_von_verein.ausgetreten" + . "\n AND #__sportsmanager_mitglied_von_verein.mitgliedsstatus IN (1,2)" + . "\n AND #__sportsmanager_verein.verein_id = #__sportsmanager_mitglied_von_verein.verein_id" . "\n ORDER BY vereinsname"; $vereine = loadObjectList($db, $query); @@ -3003,7 +3009,12 @@ function spielerDetails(): void $query = "SELECT veranstalterbezeichnung" . "\n FROM #__sportsmanager_mitglied_von_verein, #__sportsmanager_verein" . "\n LEFT JOIN #__sportsmanager_veranstalter USING (veranstalter_id)" - . "\n WHERE #__sportsmanager_mitglied_von_verein.spieler_id = $id AND NOT #__sportsmanager_verein.ausgetreten AND NOT #__sportsmanager_mitglied_von_verein.ausgetreten AND #__sportsmanager_verein.verein_id = #__sportsmanager_mitglied_von_verein.verein_id" + . "\n WHERE #__sportsmanager_mitglied_von_verein.spieler_id = $id" + . "\n AND NOT #__sportsmanager_verein.ausgetreten" + . "\n AND NOT #__sportsmanager_mitglied_von_verein.ausgetreten" + . "\n AND #__sportsmanager_mitglied_von_verein.mitgliedsstatus IN (1,2)" + . "\n AND #__sportsmanager_verein.verein_id = #__sportsmanager_mitglied_von_verein.verein_id" + . "\n GROUP BY veranstalterbezeichnung" . "\n ORDER BY veranstalterbezeichnung"; $veranstalter = loadObjectList($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 bad6dde..d64d205 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php @@ -4282,9 +4282,16 @@ static function tabelleAnzeigen($veranstaltung, $modus, $teams, $spieltag, $spie } } - static function spielerDetails($spieler, $vereine, $veranstalter, $spieler_elo_verlauf_einzel, $spieler_elo_verlauf_doppel, $spielerNamen, $teamNamen, $veranstaltungBezeichnungen, $turnierdisziplinBezeichnungen, $individualwettbewerbBezeichnungen, $ranglistenplatzierungen, $turnierplatzierungen, $teams, $sortierung, $vorheriger_spieler_id, $naechster_spieler_id, $elo_detailliert, $statistik, $beginn, $kategorie, $einstufungen, $filter, $veranstaltungid, $veranstalterid, $einstufungid, $unabhaengige_ansicht, $details_anzeigen, $lizenz_anzeigen):void { + static function spielerDetails($spieler, $vereine, $veranstalter, $spieler_elo_verlauf_einzel, $spieler_elo_verlauf_doppel, + $spielerNamen, $teamNamen, $veranstaltungBezeichnungen, $turnierdisziplinBezeichnungen, + $individualwettbewerbBezeichnungen, $ranglistenplatzierungen, $turnierplatzierungen, + $teams, $sortierung, $vorheriger_spieler_id, $naechster_spieler_id, $elo_detailliert, + $statistik, $beginn, $kategorie, $einstufungen, $filter, $veranstaltungid, $veranstalterid, + $einstufungid, $unabhaengige_ansicht, $details_anzeigen, $lizenz_anzeigen):void { global $params; + if (count($vereine) == 0){echo "Sie haben keine Berechtigung auf diesen Datensatz!!!"; die;} + ?>
VereinslogoVereinslogo - - + + + Organisation mitglieder; ?> vereinssitz)) echo htmlentities_utf8($row->vereinssitz . (!empty($row->vereinssitz_ortsteil) ? ("-" . $row->vereinssitz_ortsteil) : "")); ?> - + + id="anzahl_mitglieder_zeigen" name="anzahl_mitglieder_zeigen" placeholder="Zahl eingeben">
+ + + +
- id="anzahl_mitglieder_zeigen" name="anzahl_mitglieder_zeigen" placeholder="Zahl eingeben"> + id="show_member_count" name="anzahl_mitglieder_zeigen" placeholder="Zahl eingeben">
diff --git a/src/structure/components/com_sportsmanager/views/sportsmanager/view.json.php b/src/structure/components/com_sportsmanager/views/sportsmanager/view.json.php index 5d7f3ed..c19377d 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view.json.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view.json.php @@ -197,6 +197,7 @@ class JSON_sportsmanager #[NoReturn] static function spielerDetails($spieler, $vereine, $veranstalter, $spieler_elo_verlauf_einzel, $spieler_elo_verlauf_doppel, $spielerNamen, $teamNamen, $veranstaltungBezeichnungen, $turnierdisziplinBezeichnungen, $individualwettbewerbBezeichnungen, $ranglistenplatzierungen, $turnierplatzierungen, $teams, $elo_detailliert, $statistik, $einstufungen): void { + if (count($vereine) == 0){die;} $letzte_einzel = []; $spieler->bild = playerImage($spieler->spieler_id, $spieler->geschlecht); for ($i = sizeof($spieler_elo_verlauf_einzel) - 1; $i >= max(sizeof($spieler_elo_verlauf_einzel) - 10, 0); $i--) { From 49e3bde81623eb9bf3872b526f48c725373410ad Mon Sep 17 00:00:00 2001 From: Marvin Flock Date: Wed, 17 Sep 2025 21:23:51 +0200 Subject: [PATCH 10/22] fix: display disciplines under each other in admin and public tournament view --- .../views/sportsmanager/view.html.php | 19 +++++++++++++------ .../views/sportsmanager/view_admin.php | 17 +++++++++++++---- 2 files changed, 26 insertions(+), 10 deletions(-) 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 d64d205..7af3bbe 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php @@ -444,7 +444,14 @@ static function turniere($turniere): void if (!empty($turnier->disziplinen)) { ?>
- disziplinen; ?> + + disziplinen); + $parts = array_map('trim', $parts); // remove extra spaces + foreach ($parts as $discipline) { + echo $discipline . "
"; + } ?> +
@@ -4282,11 +4289,11 @@ static function tabelleAnzeigen($veranstaltung, $modus, $teams, $spieltag, $spie } } - static function spielerDetails($spieler, $vereine, $veranstalter, $spieler_elo_verlauf_einzel, $spieler_elo_verlauf_doppel, - $spielerNamen, $teamNamen, $veranstaltungBezeichnungen, $turnierdisziplinBezeichnungen, - $individualwettbewerbBezeichnungen, $ranglistenplatzierungen, $turnierplatzierungen, - $teams, $sortierung, $vorheriger_spieler_id, $naechster_spieler_id, $elo_detailliert, - $statistik, $beginn, $kategorie, $einstufungen, $filter, $veranstaltungid, $veranstalterid, + static function spielerDetails($spieler, $vereine, $veranstalter, $spieler_elo_verlauf_einzel, $spieler_elo_verlauf_doppel, + $spielerNamen, $teamNamen, $veranstaltungBezeichnungen, $turnierdisziplinBezeichnungen, + $individualwettbewerbBezeichnungen, $ranglistenplatzierungen, $turnierplatzierungen, + $teams, $sortierung, $vorheriger_spieler_id, $naechster_spieler_id, $elo_detailliert, + $statistik, $beginn, $kategorie, $einstufungen, $filter, $veranstaltungid, $veranstalterid, $einstufungid, $unabhaengige_ansicht, $details_anzeigen, $lizenz_anzeigen):void { global $params; 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 261b5ce..bc7a059 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php @@ -374,7 +374,16 @@ class HTML_sportsmanager_admin echo htmlentities_utf8($row->turnierbezeichnung); if (!empty($row->disziplinen)) { ?> -
disziplinen; ?> +
+ + disziplinen); + $parts = array_map('trim', $parts); // remove extra spaces + foreach ($parts as $discipline) { + echo $discipline . "
"; + } + ?> +
@@ -727,7 +736,7 @@ class HTML_sportsmanager_admin :
@@ -10455,7 +10464,7 @@ class HTML_sportsmanager_admin - tabellenwertung == -4){ ?> + tabellenwertung == -4){ ?> - + letzteRunde == $veranstaltung->naechsteRunde) {$display = "";} else {$display = "none";} ?> "; if ($Begegnung[$Zeile]['spieltag'] > 99 or $Begegnung[$Zeile]['spieltag'] < 1) { $bgcolor = "red"; @@ -9560,7 +9592,6 @@ function adminBegegnungenImportieren(): void $Mannschaften[$data[$Titelzeile['Heim']]]['heimspiel_uhrzeit']); } - $Begegnung[$Zeile]['zeitpunkt'] = $data[$Titelzeile['Spielstart']]; if (!validateDate($Begegnung[$Zeile]['zeitpunkt'])) { $bgcolor = "red"; $import = false; @@ -9580,7 +9611,12 @@ function adminBegegnungenImportieren(): void } else { $bgcolor = "green"; } - echo ""; + echo ""; if ($Begegnung[$Zeile]['gast_team_id'] == "") { if ($data[$Titelzeile['Gast']] == "spielfrei") { $bgcolor = "orange"; @@ -9592,7 +9628,12 @@ function adminBegegnungenImportieren(): void } else { $bgcolor = "green"; } - echo ""; + echo ""; echo ""; } if (!$import_zeile) { @@ -9600,6 +9641,7 @@ function adminBegegnungenImportieren(): void } $Zeile++; } + echo ""; echo "
- id="show_member_count" name="anzahl_mitglieder_zeigen" placeholder="Zahl eingeben">
From 56776c01f027c92512525c6aa64e80c2e2433eb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Thu, 18 Sep 2025 16:54:22 +0200 Subject: [PATCH 11/22] Doppelte Live-Ergebnisse eines Spiels (issue #190) --- .../components/com_sportsmanager/admin.php | 4 ++-- .../com_sportsmanager/database/update.php | 23 +++++++++++++++++++ src/structure/script.php | 4 ++-- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 1a42438..120b3cf 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -8327,7 +8327,7 @@ function adminSaveBegegnungSpielplan(): void } if ($zwischenergebnis) { - $query = "INSERT INTO #__sportsmanager_unbestaetigtes_ergebnis (begegnung_id, vorschlagendes_team_id, zwischenergebnis, kommentar, vorgeschlagen)" + $query = "INSERT IGNORE INTO #__sportsmanager_unbestaetigtes_ergebnis (begegnung_id, vorschlagendes_team_id, zwischenergebnis, kommentar, vorgeschlagen)" . "\n VALUES ('$id', " . ($bestaetigen != 0 ? "'$vorschlagendes_team_id'" : "'0'") . ", '1', '$kommentar', now());"; $db->setQuery($query); if (!$db->execute()) { @@ -8341,7 +8341,7 @@ function adminSaveBegegnungSpielplan(): void abortWithError($db->stderr(true)); } } else if ($bestaetigen != 0) { - $query = "INSERT INTO #__sportsmanager_unbestaetigtes_ergebnis (begegnung_id, vorschlagendes_team_id, kommentar, vorgeschlagen)" + $query = "INSERT IGNORE INTO #__sportsmanager_unbestaetigtes_ergebnis (begegnung_id, vorschlagendes_team_id, kommentar, vorgeschlagen)" . "\n VALUES ('$id', '$vorschlagendes_team_id', '$kommentar', now());"; $db->setQuery($query); if (!$db->execute()) { diff --git a/src/structure/components/com_sportsmanager/database/update.php b/src/structure/components/com_sportsmanager/database/update.php index 9b3055b..f1606e5 100644 --- a/src/structure/components/com_sportsmanager/database/update.php +++ b/src/structure/components/com_sportsmanager/database/update.php @@ -5318,6 +5318,29 @@ function updateDatabase(): void } } + if ($datenbank_version < 108) { + + $query = "DELETE t1 FROM tfvhh_sportsmanager_unbestaetigtes_ergebnis t1" + . "\n INNER JOIN tfvhh_sportsmanager_unbestaetigtes_ergebnis t2" + . "\n ON t1.begegnung_id = t2.begegnung_id" + . "\n AND t1.unbestaetigtes_ergebnis_id < t2.unbestaetigtes_ergebnis_id;"; + $db->setQuery( $query ); + if (!$db->execute()) { die($db->stderr(true)); } + + $query = " ALTER TABLE `tfvhh`.`tfvhh_sportsmanager_unbestaetigtes_ergebnis`" + . "\n DROP INDEX `begegnung_id`, ADD UNIQUE `begegnung_id` (`begegnung_id`) USING BTREE;"; + $db->setQuery( $query ); + if (!$db->execute()) { die($db->stderr(true)); } + + $query = "UPDATE #__sportsmanager_einstellungen" + . "\n SET wert = '108'" + . "\n WHERE name = 'datenbank_version'"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + } + if ($termin_aktionen_email_setzen) { $query = "SELECT aktion_user_id, termin_aktion_id" . "\n FROM #__sportsmanager_termin_aktion"; diff --git a/src/structure/script.php b/src/structure/script.php index 5ff6caa..5fbe9db 100644 --- a/src/structure/script.php +++ b/src/structure/script.php @@ -1005,7 +1005,7 @@ return new class () implements InstallerScriptInterface $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } - $query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_unbestaetigtes_ergebnis` (" + $query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_unbestaetigtes_ergebnis` (" . "\n `unbestaetigtes_ergebnis_id` int(11) NOT NULL AUTO_INCREMENT," . "\n `begegnung_id` int(11) NOT NULL DEFAULT '0'," . "\n `vorschlagendes_team_id` int(11) NOT NULL DEFAULT '0'," @@ -1013,7 +1013,7 @@ return new class () implements InstallerScriptInterface . "\n `kommentar` varchar(255) DEFAULT NULL," . "\n `vorgeschlagen` datetime DEFAULT NULL," . "\n PRIMARY KEY (`unbestaetigtes_ergebnis_id`)," - . "\n KEY `begegnung_id` (`begegnung_id`)," + . "\n UNIQUE KEY `begegnung_id` (`begegnung_id`)," . "\n KEY `vorschlagendes_team_id` (`vorschlagendes_team_id`)" . "\n) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"; $db->setQuery( $query ); From 11e42c237449433c5cf04b08213d7cd25438ebf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Thu, 18 Sep 2025 17:10:24 +0200 Subject: [PATCH 12/22] tfvhh durch #_ ersetzt --- .../components/com_sportsmanager/database/update.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/structure/components/com_sportsmanager/database/update.php b/src/structure/components/com_sportsmanager/database/update.php index f1606e5..712aa2d 100644 --- a/src/structure/components/com_sportsmanager/database/update.php +++ b/src/structure/components/com_sportsmanager/database/update.php @@ -5320,14 +5320,14 @@ function updateDatabase(): void if ($datenbank_version < 108) { - $query = "DELETE t1 FROM tfvhh_sportsmanager_unbestaetigtes_ergebnis t1" - . "\n INNER JOIN tfvhh_sportsmanager_unbestaetigtes_ergebnis t2" + $query = "DELETE t1 FROM #__sportsmanager_unbestaetigtes_ergebnis t1" + . "\n INNER JOIN #__sportsmanager_unbestaetigtes_ergebnis t2" . "\n ON t1.begegnung_id = t2.begegnung_id" . "\n AND t1.unbestaetigtes_ergebnis_id < t2.unbestaetigtes_ergebnis_id;"; $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } - $query = " ALTER TABLE `tfvhh`.`tfvhh_sportsmanager_unbestaetigtes_ergebnis`" + $query = " ALTER TABLE `#__sportsmanager_unbestaetigtes_ergebnis`" . "\n DROP INDEX `begegnung_id`, ADD UNIQUE `begegnung_id` (`begegnung_id`) USING BTREE;"; $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } From 29a108d88c6c8c9d9a7758a2848710922adbb72f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Mon, 22 Sep 2025 04:52:40 +0200 Subject: [PATCH 13/22] Style Manuelle Tabelle an andere Tabellen angepasst (issue #193) --- .../views/sportsmanager/view.html.php | 136 +++++++----------- 1 file changed, 53 insertions(+), 83 deletions(-) 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 d64d205..cc7b241 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php @@ -1731,8 +1731,8 @@ static function tabelleAnzeigen($veranstaltung, $modus, $teams, $spieltag, $spie - - +
-
+
+
- - + + + + platz == null; $platz = -1; $k = 0; - foreach ($teams - - as $team) { - if ($laufende_veranstaltung && $team->platz != $platz && $team->platz == null) { - ?> - - - - - - - - + foreach ($teams as $team) { + if ($laufende_veranstaltung && $team->platz != $platz && $team->platz == null) { + ?> + + + + + + + + - - letzter_spieltag); - ?> - - - - - - + team_id) . "\">" . htmlentities_utf8(NichtLeererString($team->teamname)) . ""; + ?> + + + + + +
+
- -
+ +
platz != $platz) { @@ -2040,63 +2041,32 @@ static function tabelleAnzeigen($veranstaltung, $modus, $teams, $spieltag, $spie ?> - - - - - - - - -
- team_id) . "\">" . htmlentities_utf8(NichtLeererString($team->teamname)) . ""; - ?> - - team_id, 50, 50, 0, 0, 'border="0"'); - if ($bild != null) { - echo $bild; - } else if ($team->verein_id != null) { - $bild = bildHTML("vereine", $team->verein_id, 50, 50, 0, 0, 'border="0"'); - if ($bild != null) - echo $bild; - } - ?> -
- -
- letzter_spieltag; - ?> - - zuletzt_gewonnen; - ?> - - -
+ team_id, 50, 50, 0, 0, 'border="0"'); + if ($bild != null) { + echo $bild; + } else if ($team->verein_id != null) { + $bild = bildHTML("vereine", $team->verein_id, 50, 50, 0, 0, 'border="0"'); + if ($bild != null) + echo $bild; + } + ?> +
Date: Mon, 22 Sep 2025 06:32:08 +0200 Subject: [PATCH 14/22] Import Gruppenspiele optimiert (issue #194) --- .../components/com_sportsmanager/admin.php | 76 ++++++++++++++----- 1 file changed, 59 insertions(+), 17 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 1a42438..44a9550 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -18,18 +18,25 @@ defined('_JEXEC') or die('Restricted access'); require_once JPATH_SITE . '/components/com_sportsmanager/util/image.php'; require_once JPATH_SITE . '/components/com_sportsmanager/database/init.php'; -function UhrzeitWandlerDE($Zeitstempel): mixed -{ - $Temp = explode(' ', $Zeitstempel); - $Datum = $Temp[0]; - $Uhrzeit = $Temp[1]; - if (preg_match("/\d{2}\.\d{2}\.\d{4}/", $Datum)) { - $Datum = substr($Datum, 6, 4) . "-" . substr($Datum, 3, 2) . "-" . substr($Datum, 0, 2); - } else if (preg_match("/\d{4}-\d{2}-\d{2}/", $Datum)) { - return $Zeitstempel; - } - return $Datum . " " . $Uhrzeit; +function UhrzeitWandlerDE(string $input): string { + // mögliche Datumsformate + $formats = [ + 'Y-m-d H:i', + 'd.m.Y H:i', + 'd.m.Y H:i:s', + ]; + foreach ($formats as $format) { + $dt = DateTime::createFromFormat($format, $input); + + // prüfen, ob Parsing erfolgreich war UND das Datum exakt passt + if ($dt && $dt->format($format) === $input) { + return $dt->format('Y-m-d H:i:s'); + } + } + + // falls kein bekanntes Format -> Original zurückgeben + return $input; } function validateDate($date, $format = 'Y-m-d H:i:s'): bool @@ -38,6 +45,22 @@ function validateDate($date, $format = 'Y-m-d H:i:s'): bool return $d && $d->format($format) == $date; } +function detectFileEncoding(string $filename): string { + $handle = fopen($filename, "r"); + if (!$handle) { + throw new Exception("Datei konnte nicht geöffnet werden: $filename"); + } + + // Erstes Stück der Datei lesen (nicht alles, reicht für Erkennung) + $sample = fread($handle, 1000); + fclose($handle); + + // Encoding bestimmen + $encoding = mb_detect_encoding($sample, ['UTF-8', 'ISO-8859-1', 'Windows-1252'], true); + + return $encoding ?: 'UTF-8'; // Fallback auf UTF-8 +} + function adminUebersicht(): void { $db = getDatabase(); @@ -9499,6 +9522,8 @@ function adminBegegnungenImportieren(): void redirectSportsManagerURL('&task=admin_spieler', Text::_('COM_SPORTSMANAGER_NO_FILE_SPECIFIED')); } + $encoding = detectFileEncoding($_FILES["daten"]["tmp_name"]); + $handle = fopen($_FILES["daten"]["tmp_name"], "r"); if (!$handle) { redirectSportsManagerURL('&task=admin_spieler', Text::_('COM_SPORTSMANAGER_COULD_NOT_OPEN_FILE')); @@ -9537,10 +9562,17 @@ function adminBegegnungenImportieren(): void $bgcolor = "green"; $Begegnung[$Zeile]['spieltag'] = $data[$Titelzeile['Spieltag_Nr']]; $Begegnung[$Zeile]['zeitpunkt'] = UhrzeitWandlerDE($data[$Titelzeile['Spielstart']]); - $Begegnung[$Zeile]['heim_team_id'] = $Mannschaften[$data[$Titelzeile['Heim']]]['team_id']; - $Begegnung[$Zeile]['gast_team_id'] = $Mannschaften[$data[$Titelzeile['Gast']]]['team_id']; + if ($encoding == "UTF-8"){ + $Begegnung[$Zeile]['heim_team_id'] = $Mannschaften[$data[$Titelzeile['Heim']]]['team_id']; + $Begegnung[$Zeile]['gast_team_id'] = $Mannschaften[$data[$Titelzeile['Gast']]]['team_id']; + if (isset($data[$Titelzeile['Spiel_Nr']])) $Begegnung[$Zeile]['spiel_nr'] = $data[$Titelzeile['Spiel_Nr']]; + if (isset($data[$Titelzeile['Spieltag_Titel']])) $Begegnung[$Zeile]['spieltag_titel'] = $data[$Titelzeile['Spieltag_Titel']]; + } else { + $Begegnung[$Zeile]['heim_team_id'] = $Mannschaften[utf8_encode($data[$Titelzeile['Heim']])]['team_id']; + $Begegnung[$Zeile]['gast_team_id'] = $Mannschaften[utf8_encode($data[$Titelzeile['Gast']])]['team_id']; + if (isset($data[$Titelzeile['Spieltag_Titel']])) $Begegnung[$Zeile]['spieltag_titel'] = utf8_encode($data[$Titelzeile['Spieltag_Titel']]); + } if (isset($data[$Titelzeile['Spiel_Nr']])) $Begegnung[$Zeile]['spiel_nr'] = $data[$Titelzeile['Spiel_Nr']]; - if (isset($data[$Titelzeile['Spieltag_Titel']])) $Begegnung[$Zeile]['spieltag_titel'] = $data[$Titelzeile['Spieltag_Titel']]; echo "
" . $data[$Titelzeile['Heim']] . ""; + if ($encoding == "UTF-8") + echo $data[$Titelzeile['Heim']]; + else + echo utf8_encode($data[$Titelzeile['Heim']]); + echo "" . $data[$Titelzeile['Gast']] . ""; + if ($encoding == "UTF-8") + echo $data[$Titelzeile['Gast']]; + else + echo utf8_encode($data[$Titelzeile['Gast']]); + echo "
Dateiformat: $encoding
"; fclose($handle); From d84c2eefcfb44f1f14ac8060f384d551649df06c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Mon, 22 Sep 2025 06:37:27 +0200 Subject: [PATCH 15/22] Kleine Korrektur --- src/structure/components/com_sportsmanager/admin.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 44a9550..888b440 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -9565,7 +9565,6 @@ function adminBegegnungenImportieren(): void if ($encoding == "UTF-8"){ $Begegnung[$Zeile]['heim_team_id'] = $Mannschaften[$data[$Titelzeile['Heim']]]['team_id']; $Begegnung[$Zeile]['gast_team_id'] = $Mannschaften[$data[$Titelzeile['Gast']]]['team_id']; - if (isset($data[$Titelzeile['Spiel_Nr']])) $Begegnung[$Zeile]['spiel_nr'] = $data[$Titelzeile['Spiel_Nr']]; if (isset($data[$Titelzeile['Spieltag_Titel']])) $Begegnung[$Zeile]['spieltag_titel'] = $data[$Titelzeile['Spieltag_Titel']]; } else { $Begegnung[$Zeile]['heim_team_id'] = $Mannschaften[utf8_encode($data[$Titelzeile['Heim']])]['team_id']; From 4f89abc63048790adf8fc047f648aa7374073c15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Mon, 22 Sep 2025 11:34:27 +0200 Subject: [PATCH 16/22] Leerzeilen in Importdatei werden ignoriert. --- src/structure/components/com_sportsmanager/admin.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 888b440..bc91f89 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -9545,6 +9545,7 @@ function adminBegegnungenImportieren(): void $Titelzeile = null; $import_zeile = false; while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { + if (empty($data[0])){continue;} if ($Zeile == 1) { foreach($data as $spalte_nr => $spalte) { @@ -9553,7 +9554,7 @@ function adminBegegnungenImportieren(): void if (vergleich($spalte,"heim,heimteam,heimmannschaft")) $Titelzeile['Heim'] = $spalte_nr; if (vergleich($spalte,"gast,gastteam,gastmannschaft")) $Titelzeile['Gast'] = $spalte_nr; if (vergleich($spalte,"spielnr,spielnummer")) $Titelzeile['Spiel_Nr'] = $spalte_nr; - if (vergleich($spalte,"spieltagtitel")) $Titelzeile['Spieltag_Titel'] = $spalte_nr; + if (vergleich($spalte,"spieltagtitel,spieltitel")) $Titelzeile['Spieltag_Titel'] = $spalte_nr; if (vergleich($spalte,"jahr,spieljahr")) $Titelzeile['Spieljahr'] = $spalte_nr; if (vergleich($spalte,"kalenderwoche,woche,kw")) $Titelzeile['Kalenderwoche'] = $spalte_nr; } From 1f147081e1ed266d1b78e4e7374963cb4f2157f3 Mon Sep 17 00:00:00 2001 From: Marvin Flock Date: Tue, 23 Sep 2025 18:18:24 +0200 Subject: [PATCH 17/22] fix: add removed part back to sportsmanager --- .../components/com_sportsmanager/sportsmanager.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/structure/components/com_sportsmanager/sportsmanager.php b/src/structure/components/com_sportsmanager/sportsmanager.php index 4583fd9..359e1af 100644 --- a/src/structure/components/com_sportsmanager/sportsmanager.php +++ b/src/structure/components/com_sportsmanager/sportsmanager.php @@ -4831,6 +4831,13 @@ function ranglisteAktualisieren($geaenderte_rangliste_id = 0, $geaenderte_turnie . "\n INNER JOIN #__sportsmanager_rangliste_turnierdisziplin USING (turnierdisziplin_id)" . "\n INNER JOIN #__sportsmanager_rangliste USING (rangliste_id)" . "\n WHERE spieler_id = $geaenderte_spieler_id AND rundenstufe = 0"; + } else if ($berechnungen_auswerten) { + $session_id = redirectRequestGetSessionId(); + $query = "SELECT DISTINCT #__sportsmanager_rangliste.*" + . "\n FROM #__sportsmanager_berechnung" + . "\n INNER JOIN #__sportsmanager_rangliste ON id = rangliste_id" + . "\n WHERE typ = 'rangliste' AND " . (empty($session_id) ? ("session_id < SUBTIME(NOW(), '00:10:00')") : ("session_id = '" . $session_id . "'")); + $berechnungen = loadObjectList($db, $query); } else if ($geaenderte_rangliste_id != 0) { $query = "SELECT * FROM #__sportsmanager_rangliste" . "\n WHERE rangliste_id = $geaenderte_rangliste_id"; From 26fd06afef745a4ee73e2501b996e22b29bcc01b Mon Sep 17 00:00:00 2001 From: MarvinF Date: Tue, 23 Sep 2025 19:48:03 +0200 Subject: [PATCH 18/22] Update view.html.php --- .../com_sportsmanager/views/sportsmanager/view.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 cc7b241..c696269 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php @@ -2002,7 +2002,7 @@ static function tabelleAnzeigen($veranstaltung, $modus, $teams, $spieltag, $spie class="uk-table-hover uk-table-divider uk-table-middle dtfl-table-small contentpaneopenget('pageclass_sfx'); ?>">
+ - - id="show_member_count" name="anzahl_mitglieder_zeigen" placeholder="Zahl eingeben"> + name="anzahl_mitglieder_zeigen" placeholder="Zahl eingeben">
+ + + +
  @@ -10455,7 +10472,7 @@ class HTML_sportsmanager_admin
@@ -11360,20 +11377,6 @@ class HTML_sportsmanager_admin class="componentheadingget('pageclass_sfx'); ?>"> : - -
@@ -11556,8 +11559,8 @@ class HTML_sportsmanager_admin +