feat: add email reminder functionality

This commit is contained in:
Marvin Flock
2025-09-25 02:53:50 +02:00
parent 6187456e31
commit 64ce39a59f
10 changed files with 236 additions and 135 deletions
-45
View File
@@ -1,45 +0,0 @@
<?php
// Migration script to add reminder fields to #__sportsmanager_turnier
// Usage: php scripts/migrate_add_reminder_fields.php
use Joomla\CMS\Factory;
if (!defined('_JEXEC')) {
define('_JEXEC', 1);
define('JPATH_BASE', dirname(__DIR__, 6));
require_once JPATH_BASE . '/includes/defines.php';
require_once JPATH_BASE . '/includes/framework.php';
}
function addReminderFieldsToTurnierTable()
{
$db = Factory::getDbo();
$columns = [
'reminder_24h_sent',
'reminder_3d_sent',
'reminder_7d_sent',
];
// Check if columns already exist
$db->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();
-53
View File
@@ -1,53 +0,0 @@
<?php
// CLI script to send reminder emails for missing tournament results
use Joomla\CMS\Factory;
use Joomla\CMS\Mail\MailerFactoryInterface;
// Bootstrap Joomla if needed
if (!defined('_JEXEC')) {
define('_JEXEC', 1);
define('JPATH_BASE', dirname(__DIR__, 6));
require_once JPATH_BASE . '/includes/defines.php';
require_once JPATH_BASE . '/includes/framework.php';
}
function sendMissingTournamentResultsReminders()
{
$db = Factory::getDbo();
$now = date('Y-m-d H:i:s');
$oneDayAgo = date('Y-m-d H:i:s', strtotime('-1 day'));
$twoWeeksAgo = date('Y-m-d H:i:s', strtotime('-2 week'));
// Query tournaments that ended between 2 weeks ago and 1 day ago, with missing results
$query = $db->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();
@@ -661,15 +661,12 @@ function adminEinstellungen(): void
$spalte_mitglieder_zeigen = $jInput->get('spalte_mitglieder_zeigen', 0, 'INT'); $spalte_mitglieder_zeigen = $jInput->get('spalte_mitglieder_zeigen', 0, 'INT');
$turnierbaum_zeigen = $jInput->get('turnierbaum_zeigen', 0, 'INT'); $turnierbaum_zeigen = $jInput->get('turnierbaum_zeigen', 0, 'INT');
$termine_beantragen = $jInput->get('termine_beantragen', 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'); $spielerimport_persoenliche_daten_vorauswahl = $jInput->get('spielerimport_persoenliche_daten_vorauswahl', 0, 'INT');
$api_push_key = $jInput->get('api_push_key', '', 'RAW'); $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" $query = "REPLACE #__sportsmanager_einstellungen"
. "\n SET name = 'basis_spielernr'" . "\n SET name = 'basis_spielernr'"
. ", wert = '$basis_spielernr'"; . ", wert = '$basis_spielernr'";
@@ -780,6 +777,12 @@ function adminEinstellungen(): void
die($db->stderr(true)); 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'); redirectSportsManagerURL('&task=admin_uebersicht');
} }
@@ -10564,6 +10567,7 @@ function adminEditTurnier(): void
$turnierort = $db->escape(trim($jInput->get('turnierort', '', 'RAW'))); $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'))); $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'); $mehrtaegig = $jInput->get('mehrtaegig', 0, 'INT');
$reminder_count = $jInput->get('reminder_count', 0, 'INT');
if (!$mehrtaegig) if (!$mehrtaegig)
$letzter_tag = $erster_tag; $letzter_tag = $erster_tag;
else else
@@ -10587,7 +10591,7 @@ function adminEditTurnier(): void
} }
if ($id == 0) { 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); $db->setQuery($query);
if (!$db->execute()) { if (!$db->execute()) {
die($db->stderr(true)); die($db->stderr(true));
@@ -10601,7 +10605,8 @@ function adminEditTurnier(): void
. "\n turnierort = '$turnierort'," . "\n turnierort = '$turnierort',"
. "\n erster_tag = '$erster_tag'," . "\n erster_tag = '$erster_tag',"
. "\n letzter_tag = " . ($letzter_tag != null ? "'$letzter_tag'" : "NULL") . "," . "\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"; . "\n WHERE turnier_id = $id";
$db->setQuery($query); $db->setQuery($query);
if (!$db->execute()) { if (!$db->execute()) {
@@ -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) { if ($termin_aktionen_email_setzen) {
$query = "SELECT aktion_user_id, termin_aktion_id" $query = "SELECT aktion_user_id, termin_aktion_id"
. "\n FROM #__sportsmanager_termin_aktion"; . "\n FROM #__sportsmanager_termin_aktion";
@@ -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_admin.php';
require_once JPATH_SITE . '/components/com_sportsmanager/views/sportsmanager/view_ticker.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/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 require_once JPATH_SITE . '/components/com_sportsmanager/database/update.php'; // will also include init.php and util.php
initDatabase(); initDatabase();
updateDatabase(); updateDatabase();
sentEmailReminders();
if (isset($_POST['filter_saison_id'])) if (isset($_POST['filter_saison_id']))
setcookie('sportsmanager_filter_saison_id', $_POST['filter_saison_id'], time() + (60 * 60 * 24)); setcookie('sportsmanager_filter_saison_id', $_POST['filter_saison_id'], time() + (60 * 60 * 24));
else if (isset($_REQUEST['filter_saison_id'])) else if (isset($_REQUEST['filter_saison_id']))
@@ -0,0 +1,125 @@
<?php
use Joomla\CMS\Factory;
use Joomla\CMS\Log\Log;
use Joomla\CMS\Mail\MailerFactoryInterface;
use Joomla\CMS\Application\SiteApplication;
/**
* @since 2.2
* @throws Exception
*/
function sentEmailReminders(): void
{
$app = Factory::getContainer()->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;
}
@@ -728,8 +728,9 @@ class HTML_sportsmanager_admin
</td> </td>
<td nowrap> <td nowrap>
<input style='height: 34px;' class="uk-select uk-form-width-medium" type="text" <input style='height: 34px;' class="uk-select uk-form-width-medium" type="text"
id="show_member_count"
value= <?php echo $einstellungen["anzahl_mitglieder_zeigen"]; ?> value= <?php echo $einstellungen["anzahl_mitglieder_zeigen"]; ?>
id="show_member_count" name="anzahl_mitglieder_zeigen" placeholder="Zahl eingeben"> name="anzahl_mitglieder_zeigen" placeholder="Zahl eingeben">
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -867,6 +868,22 @@ class HTML_sportsmanager_admin
</select> </select>
</td> </td>
</tr> </tr>
<tr>
<td nowrap style="width: 20%; text-align: right">
<label
for="enable_email_reminders"><?php echo Text::_('COM_SPORTSMANAGER_USE_EMAIL_REMINDERS'); ?>
:</label>
</td>
<td nowrap>
<select class="uk-select uk-form-width-medium" name="enable_email_reminders"
id="enable_email_reminders" size="1">
<?php
echo "<option value='1'" . (isset($einstellungen['enable_email_reminders']) && $einstellungen['enable_email_reminders'] == 1 ? " selected" : "") . ">" . htmlentities_utf8(Text::_('JYES')) . "</option>";
echo "<option value='0'" . (isset($einstellungen['enable_email_reminders']) && $einstellungen['enable_email_reminders'] == 0 ? " selected" : "") . ">" . htmlentities_utf8(Text::_('JNO')) . "</option>";
?>
</select>
</td>
</tr>
<tr> <tr>
<td nowrap colspan="2">&nbsp; <td nowrap colspan="2">&nbsp;
@@ -11360,20 +11377,6 @@ class HTML_sportsmanager_admin
class="componentheading<?php echo $params->get('pageclass_sfx'); ?>"><?php echo Text::_('COM_SPORTSMANAGER_TOURNAMENT'); ?> class="componentheading<?php echo $params->get('pageclass_sfx'); ?>"><?php echo Text::_('COM_SPORTSMANAGER_TOURNAMENT'); ?>
: <?php echo($row != null ? ($vorlage ? Text::_('COM_SPORTSMANAGER_ADD_VIA_TEMPLATE') : Text::_('COM_SPORTSMANAGER_CHANGING')) : Text::_('COM_SPORTSMANAGER_ADD')); ?></div> : <?php echo($row != null ? ($vorlage ? Text::_('COM_SPORTSMANAGER_ADD_VIA_TEMPLATE') : Text::_('COM_SPORTSMANAGER_CHANGING')) : Text::_('COM_SPORTSMANAGER_ADD')); ?></div>
<script type="text/javascript">
function letzter_tag_anzeigen() {
if (document.getElementById("row_letzter_tag").style.display !== '') {
document.getElementById("row_letzter_tag").style.display = '';
document.getElementById("button_mehrtaegig").value = 'Eintägig'
document.adminForm.mehrtaegig.value = 1;
} else {
document.getElementById("row_letzter_tag").style.display = 'none';
document.getElementById("button_mehrtaegig").value = 'Mehrtägig'
document.adminForm.mehrtaegig.value = 0;
}
}
</script>
<form action="<?php echo SportsManagerURL(); ?>" method="post" name="adminForm" id="adminForm"> <form action="<?php echo SportsManagerURL(); ?>" method="post" name="adminForm" id="adminForm">
<div class="uk-overflow-auto"> <div class="uk-overflow-auto">
<table class="uk-table" style="width: 100%"> <table class="uk-table" style="width: 100%">
@@ -11556,8 +11559,8 @@ class HTML_sportsmanager_admin
<td nowrap> <td nowrap>
<select class="uk-select uk-form-width-medium" <select class="uk-select uk-form-width-medium"
name="berechtigt_fuer_turnier_user_<?php echo $nummer; ?>_id" name="berechtigt_fuer_turnier_user_<?php echo $nummer; ?>_id"
aria-label="<?php echo Text::_('COM_SPORTSMANAGER_ARIA_LABEL_ELIGIBLE_USER'); ?>" id="eligible_for_tournament_<?php echo $nummer; ?>_id"
size="1"> aria-label="<?php echo Text::_('COM_SPORTSMANAGER_ARIA_LABEL_ELIGIBLE_USER'); ?>">
<option value="0"></option> <option value="0"></option>
<?php <?php
foreach ($users as $user) foreach ($users as $user)
@@ -11570,6 +11573,7 @@ class HTML_sportsmanager_admin
} }
?> ?>
</tr> </tr>
<tr id='eligible_for_tournament-error'></tr>
</table> </table>
</td> </td>
</tr> </tr>
@@ -11586,14 +11590,51 @@ class HTML_sportsmanager_admin
</div> </div>
<input type="submit" name="save" value="<?php echo Text::_('COM_SPORTSMANAGER_SAVE'); ?>" class="button"/> <input type="submit" name="save" value="<?php echo Text::_('COM_SPORTSMANAGER_SAVE'); ?>" class="button"/>
<input type="submit" name="cancel" value="<?php echo Text::_('COM_SPORTSMANAGER_CANCEL'); ?>" <input type="button" name="cancel" value="<?php echo Text::_('COM_SPORTSMANAGER_CANCEL'); ?>"
onclick="window.location.href='<?php echo SportsManagerURL(); ?>'"
class="button"/> class="button"/>
<input type="hidden" name="task" value="admin_turnier_save"/> <input type="hidden" name="task" value="admin_turnier_save"/>
<input type="hidden" name="id" value="<?php echo($row != null ? $row->turnier_id : "0"); ?>"/> <input type="hidden" name="id" value="<?php echo($row != null ? $row->turnier_id : "0"); ?>"/>
<input type="hidden" name="vorlage" value="<?php echo $vorlage; ?>"/> <input type="hidden" name="vorlage" value="<?php echo $vorlage; ?>"/>
<input type="hidden" name="mehrtaegig" <input type="hidden" name="mehrtaegig"
value="<?php echo !empty($row) && $row->erster_tag != $row->letzter_tag ? "1" : "0"; ?>"/> value="<?php echo !empty($row) && $row->erster_tag != $row->letzter_tag ? "1" : "0"; ?>"/>
<input type="hidden" name="reminder_count"
value="<?php echo !empty($row) ? $row->reminder_count : "0"; ?>"/>
</form> </form>
<script type="text/javascript">
function letzter_tag_anzeigen() {
if (document.getElementById("row_letzter_tag").style.display !== '') {
document.getElementById("row_letzter_tag").style.display = '';
document.getElementById("button_mehrtaegig").value = 'Eintägig'
document.adminForm.mehrtaegig.value = 1;
} else {
document.getElementById("row_letzter_tag").style.display = 'none';
document.getElementById("button_mehrtaegig").value = 'Mehrtägig'
document.adminForm.mehrtaegig.value = 0;
}
}
document.getElementById('adminForm').addEventListener('submit', function(e) {
// Get all selects
const selects = this.querySelectorAll('[id^="eligible_for_tournament_"]');
let valid = false;
// Check if at least one has a value
selects.forEach(select => {
if (select.value !== '0') {
valid = true;
}
});
if (!valid) {
e.preventDefault(); // Stop form submission
document.getElementById('eligible_for_tournament-error').innerHTML = "<td colspan='2' style='color: red'>Please select at least one organizer.</td>";
} else {
document.getElementById('eligible_for_tournament-error').innerHTML = ""; // Clear error
}
});
</script>
<?php <?php
} }
@@ -1,4 +1,4 @@
; Sports Manager (C) 2006-2020, Sven Nickel (Test) ; Sports Manager (C) 2006-2020, Sven Nickel (Test)
COM_SPORTSMANAGER="Sports Manager" COM_SPORTSMANAGER="Sports Manager"
COM_SPORTSMANAGER_PLAYERS="Spieler" COM_SPORTSMANAGER_PLAYERS="Spieler"
COM_SPORTSMANAGER_CLUBS="Vereine" COM_SPORTSMANAGER_CLUBS="Vereine"
@@ -1013,3 +1013,4 @@ COM_SPORTSMANAGER_ARIA_LABEL_CLUB="Verein"
COM_SPORTSMANAGER_NUM_REQUESTED_SHIFTS="Verschiebungen" COM_SPORTSMANAGER_NUM_REQUESTED_SHIFTS="Verschiebungen"
COM_SPORTSMANAGER_NUM_REQUESTED_SHFITS_TOOLTIP="Spielverschiebungen durch diese Mannschaft" COM_SPORTSMANAGER_NUM_REQUESTED_SHFITS_TOOLTIP="Spielverschiebungen durch diese Mannschaft"
COM_SPORTSMANAGER_GAME_RESULT_DELAYS="Verzögerung" COM_SPORTSMANAGER_GAME_RESULT_DELAYS="Verzögerung"
COM_SPORTSMANAGER_USE_EMAIL_REMINDERS="Verwende Email Erinnerungen"
@@ -1,4 +1,4 @@
; Sports Manager (C) 2006-2020, Sven Nickel ; Sports Manager (C) 2006-2020, Sven Nickel
COM_SPORTSMANAGER="Sports Manager" COM_SPORTSMANAGER="Sports Manager"
COM_SPORTSMANAGER_PLAYERS="Players" COM_SPORTSMANAGER_PLAYERS="Players"
COM_SPORTSMANAGER_CLUBS="Clubs" COM_SPORTSMANAGER_CLUBS="Clubs"
@@ -1011,3 +1011,4 @@ COM_SPORTSMANAGER_ARIA_LABEL_CLUB="Club"
COM_SPORTSMANAGER_NUM_REQUESTED_SHIFTS="Shifts" COM_SPORTSMANAGER_NUM_REQUESTED_SHIFTS="Shifts"
COM_SPORTSMANAGER_NUM_REQUESTED_SHFITS_TOOLTIP="Game shifts caused by this team" COM_SPORTSMANAGER_NUM_REQUESTED_SHFITS_TOOLTIP="Game shifts caused by this team"
COM_SPORTSMANAGER_GAME_RESULT_DELAYS="Delay" COM_SPORTSMANAGER_GAME_RESULT_DELAYS="Delay"
COM_SPORTSMANAGER_USE_EMAIL_REMINDERS="Use email reminders"
+6 -1
View File
@@ -905,6 +905,7 @@ return new class () implements InstallerScriptInterface
. "\n `erster_tag` date NOT NULL DEFAULT '0000-00-00'," . "\n `erster_tag` date NOT NULL DEFAULT '0000-00-00',"
. "\n `letzter_tag` date DEFAULT NULL," . "\n `letzter_tag` date DEFAULT NULL,"
. "\n `kategorie` tinyint(4) DEFAULT '1'," . "\n `kategorie` tinyint(4) DEFAULT '1',"
. "\n `reminder_count` tinyint DEFAULT '0',"
. "\n PRIMARY KEY (`turnier_id`)," . "\n PRIMARY KEY (`turnier_id`),"
. "\n KEY `saison_id` (`saison_id`)," . "\n KEY `saison_id` (`saison_id`),"
. "\n KEY `veranstalter_id` (`veranstalter_id`)" . "\n KEY `veranstalter_id` (`veranstalter_id`)"
@@ -1117,7 +1118,7 @@ return new class () implements InstallerScriptInterface
$db->setQuery( $query ); $db->setQuery( $query );
if (!$db->execute()) { die($db->stderr(true)); } 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 ); $db->setQuery( $query );
if (!$db->execute()) { die($db->stderr(true)); } if (!$db->execute()) { die($db->stderr(true)); }
@@ -1153,6 +1154,10 @@ return new class () implements InstallerScriptInterface
$db->setQuery( $query ); $db->setQuery( $query );
if (!$db->execute()) { die($db->stderr(true)); } 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)" $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');"; . "\n VALUES ('Beliebig', '0', '0', '0', '1', '3', '0');";
$db->setQuery($query); $db->setQuery($query);