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