diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 120b3cf..b70b281 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')); @@ -9520,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) { @@ -9528,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; } @@ -9537,10 +9563,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"; @@ -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 "" . $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"; @@ -9592,7 +9628,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) { @@ -9600,6 +9641,7 @@ function adminBegegnungenImportieren(): void } $Zeile++; } + echo "Dateiformat: $encoding"; echo ""; fclose($handle);