diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 2e64542..2ad549e 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(); @@ -8330,7 +8353,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()) { @@ -8344,7 +8367,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()) { @@ -9502,6 +9525,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')); @@ -9523,6 +9548,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) { @@ -9531,7 +9557,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; } @@ -9540,10 +9566,16 @@ 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['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 ""; if ($Begegnung[$Zeile]['spieltag'] > 99 or $Begegnung[$Zeile]['spieltag'] < 1) { $bgcolor = "red"; @@ -9563,7 +9595,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; @@ -9583,7 +9614,12 @@ function adminBegegnungenImportieren(): void } else { $bgcolor = "green"; } - echo "" . $data[$Titelzeile['Heim']] . ""; + echo ""; + if ($encoding == "UTF-8") + echo $data[$Titelzeile['Heim']]; + else + echo utf8_encode($data[$Titelzeile['Heim']]); + echo ""; if ($Begegnung[$Zeile]['gast_team_id'] == "") { if ($data[$Titelzeile['Gast']] == "spielfrei") { $bgcolor = "orange"; @@ -9595,7 +9631,12 @@ function adminBegegnungenImportieren(): void } else { $bgcolor = "green"; } - echo "" . $data[$Titelzeile['Gast']] . ""; + echo ""; + if ($encoding == "UTF-8") + echo $data[$Titelzeile['Gast']]; + else + echo utf8_encode($data[$Titelzeile['Gast']]); + echo ""; echo ""; } if (!$import_zeile) { @@ -9603,6 +9644,7 @@ function adminBegegnungenImportieren(): void } $Zeile++; } + echo "Dateiformat: $encoding"; echo ""; fclose($handle); diff --git a/src/structure/components/com_sportsmanager/database/update.php b/src/structure/components/com_sportsmanager/database/update.php index 46e052a..ad54812 100644 --- a/src/structure/components/com_sportsmanager/database/update.php +++ b/src/structure/components/com_sportsmanager/database/update.php @@ -5319,6 +5319,29 @@ function updateDatabase(): void } if ($datenbank_version < 108) { + + $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 `#__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 ($datenbank_version < 109) { $query = "ALTER TABLE #__sportsmanager_turnier ADD COLUMN `reminder_count` TINYINT DEFAULT '0'"; $db->setQuery($query); if (!$db->execute()) { die($db->stderr(true)); } @@ -5334,7 +5357,7 @@ function updateDatabase(): void if (!$db->execute()) { die($db->stderr(true)); } $query = "UPDATE #__sportsmanager_einstellungen" - . "\n SET wert = '108'" + . "\n SET wert = '109'" . "\n WHERE name = 'datenbank_version'"; $db->setQuery($query); if (!$db->execute()) { 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..d8c663b 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 . "
"; + } ?> +
@@ -1731,8 +1738,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 +2048,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; + } + ?> +
turnierbezeichnung); if (!empty($row->disziplinen)) { ?> -
disziplinen; ?> +
+ + disziplinen); + $parts = array_map('trim', $parts); // remove extra spaces + foreach ($parts as $discipline) { + echo $discipline . "
"; + } + ?> +
diff --git a/src/structure/script.php b/src/structure/script.php index 17d9ce9..ce72cd8 100644 --- a/src/structure/script.php +++ b/src/structure/script.php @@ -1006,7 +1006,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'," @@ -1014,7 +1014,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 );