diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 59e6d65..9c46a5e 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -112,27 +112,58 @@ function renderTemplate($template, $vars = []): string ); } -function CSVfromArray($rows,$dateiname) +function exportCSV(array $rows, string $dateiname): void { - $dateiname = bereinigterDateiname($dateiname); - ob_end_clean(); // Wegen UTF-8-Zeichen, die in der ausgabe vorhanden sind - Header("Content-Type: text/x-csv"); - Header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT'); - Header('Content-Disposition: attachment; filename="' . $dateiname . '"'); - Header("Pragma: no-cache"); - - $data = ""; - $trennzeichen = ";"; - $header = ""; - - $header .= implode(';', array_keys($rows[0])); - foreach ($rows as $row) { - $data .= implode(';', $row)."\n"; + if (empty($rows)) { + // Keine Daten → nichts exportieren + return; } - echo $header . "\n" . utf8_decode(trim($data)); + // Dateiname absichern + $dateiname = bereinigterDateiname($dateiname); - die(); + // Output Buffer nur beenden, wenn aktiv + if (ob_get_level() > 0) { + ob_end_clean(); + } + + // CSV-Header für Browser + header('Content-Type: text/csv; charset=UTF-8'); + header('Content-Disposition: attachment; filename="' . $dateiname . '"; filename*=UTF-8\'\'' . rawurlencode($dateiname)); + header('Cache-Control: no-store, no-cache, must-revalidate'); + header('Pragma: no-cache'); + header('Expires: 0'); + + // BOM für Excel + echo "\xEF\xBB\xBF"; + + // Stream öffnen + $out = fopen('php://output', 'w'); + + $delimiter = ';'; + $enclosure = '"'; + $escape = '\\'; + + // Header-Zeile: keys aus erstem Datensatz (Array oder stdClass) + $firstRow = $rows[0] instanceof stdClass ? (array) $rows[0] : $rows[0]; + $header = array_keys($firstRow); + fputcsv($out, $header, $delimiter, $enclosure, $escape); + + // Datenzeilen + foreach ($rows as $row) { + $rowArray = $row instanceof stdClass ? (array) $row : $row; + + // Sicherstellen, dass alle Header-Spalten vorhanden sind + $line = []; + foreach ($header as $key) { + $line[] = $rowArray[$key] ?? ''; + } + + fputcsv($out, $line, $delimiter, $enclosure, $escape); + } + + fclose($out); + exit; } function adminUebersicht(): void @@ -2319,7 +2350,7 @@ function adminImportSpielerDetailsForm(): void adminDeleteSpielerImport($session_id); - HTML_sportsmanager_admin::adminImportSpielerBericht($lizenzen_aktualisiert, array(), 0, array(), array(), array(), false, redirectSessionIdEmpty() ? null : redirectSessionIdSetzen()); + HTML_sportsmanager_admin::adminImportSpielerBericht($lizenzen_aktualisiert, array(), array(), 0, array(), array(), array(), false, redirectSessionIdEmpty() ? null : redirectSessionIdSetzen()); return; } @@ -2575,7 +2606,7 @@ function adminImportSpielerVorschau(): void if ($import_verweigern) { adminDeleteSpielerImport($session_id); } - HTML_sportsmanager_admin::adminImportSpielerVorschau($import_verweigern, $spieler_import, $veranstalter, $session_id, $jInput->get('persoenliche_daten', 0, 'INT'), $jInput->get('lizenznr_beibehalten', 0, 'INT'), $jInput->get('spalten', '', 'RAW')); + HTML_sportsmanager_admin::adminImportSpielerVorschau($import_verweigern, $spieler_import, $veranstalter, $session_id, $jInput->get('persoenliche_daten', 0, 'INT'), $jInput->get('spalten', '', 'RAW')); } function adminImportSpieler(): void @@ -2605,7 +2636,6 @@ function adminImportSpieler(): void $persoenliche_daten = $jInput->get('persoenliche_daten', 0, 'INT'); // 0: "Vor- und Nachname, Geschlecht, Spielernr., Lizenznr.", 1: "Vor- und Nachname, Geschlecht, Spielernr., Lizenznr., Geburtsdatum", "Alle" else $persoenliche_daten = 0; - $lizenznr_beibehalten = $jInput->get('lizenznr_beibehalten', 0, 'INT'); $session_id = $jInput->get('session_id', '', 'RAW'); $query = "SELECT DISTINCT veranstalterbezeichnung" @@ -2757,6 +2787,8 @@ function adminImportSpieler(): void } $aktualisierungen = 0; + $index_nicht_akt_unt = 0; + $nichtAktualisierteUnterschiede = array(); $spielerHinzugefuegt = array(); $vereineHinzugefuegt = 0; $vereineManuell = array(); @@ -2806,17 +2838,20 @@ function adminImportSpieler(): void // Spieler aktualisieren bzw. ergänzen if ($spieler_id != null) { // Spieler aktualisieren + + $query = "SELECT * FROM #__sportsmanager_spieler WHERE spieler_id = $spieler_id"; + $spieler_buffer = loadObjectList($db, $query); + $query = "UPDATE #__sportsmanager_spieler" . "\n SET vorname = '" . $db->escape($vorname) . "'," . "\n nachname = '" . $db->escape($nachname) . "'"; - //. "\n spielernr = '" . $db->escape($spielernr) . "'"; - if (isset($spalten["lizenznr"]) && ($lizenznr_beibehalten == 0 || !empty($lizenznr))) + if (isset($spalten["lizenznr"]) && !empty($lizenznr) && empty($spieler_buffer[0]->lizenznr)) $query .= ",\n lizenznr = '" . $db->escape($lizenznr) . "'"; if (isset($spalten["pseudonym"])) $query .= ",\n pseudonym = '" . $db->escape($pseudonym) . "'"; if (isset($spalten["geschlecht"])) $query .= ",\n geschlecht = '" . $db->escape($geschlecht) . "'"; - if ((isset($spalten["geburtsdatum"]) || isset($spalten["geburtsjahr"])) && $geburtsjahr != null) + if ((isset($spalten["geburtsdatum"]) || isset($spalten["geburtsjahr"])) && empty($spieler_buffer[0]->lizenznr) && $geburtsjahr != null) $query .= ",\n geburtsjahr = " . ("'" . $db->escape($geburtsjahr) . "'"); if ($persoenliche_daten == 2) { if (isset($spalten["strasse"])) @@ -2839,7 +2874,24 @@ function adminImportSpieler(): void if (!$db->execute()) { die($db->stderr(true)); } - + if (!empty($spieler_buffer[0]->lizenznr)){ + if (isset($spalten["lizenznr"]) && !empty($lizenznr) && $lizenznr != $spieler_buffer[0]->lizenznr){ + $nichtAktualisierteUnterschiede[$index_nicht_akt_unt] = new stdClass(); + $nichtAktualisierteUnterschiede[$index_nicht_akt_unt]->spieler = $spieler_buffer[0]->nachname . " " . $spieler_buffer[0]->vorname; + $nichtAktualisierteUnterschiede[$index_nicht_akt_unt]->feld = "Linzenznr"; + $nichtAktualisierteUnterschiede[$index_nicht_akt_unt]->db = $spieler_buffer[0]->lizenznr; + $nichtAktualisierteUnterschiede[$index_nicht_akt_unt]->csv = $lizenznr; + $index_nicht_akt_unt++; + } + if (isset($spalten["geburtsjahr"]) && !empty($geburtsjahr) && $geburtsjahr != $spieler_buffer[0]->geburtsjahr){ + $nichtAktualisierteUnterschiede[$index_nicht_akt_unt] = new stdClass(); + $nichtAktualisierteUnterschiede[$index_nicht_akt_unt]->spieler = $spieler_buffer[0]->nachname . " " . $spieler_buffer[0]->vorname; + $nichtAktualisierteUnterschiede[$index_nicht_akt_unt]->feld = "Geburtsjahr"; + $nichtAktualisierteUnterschiede[$index_nicht_akt_unt]->db = $spieler_buffer[0]->geburtsjahr; + $nichtAktualisierteUnterschiede[$index_nicht_akt_unt]->csv = $geburtsjahr; + $index_nicht_akt_unt++; + } + } $aktualisierungen++; } else { // Spieler ergänzen // Neuen Spieler anlegen @@ -3061,7 +3113,7 @@ function adminImportSpieler(): void einstufungAktualisieren(); } - HTML_sportsmanager_admin::adminImportSpielerBericht($aktualisierungen, $spielerHinzugefuegt, $vereineHinzugefuegt, $spieler_import, $vereineManuell, $ausgetreteneVereineMitAktivenMitgliedern, $kategorie_potentiell_geaendert, redirectSessionIdEmpty() ? null : redirectSessionIdSetzen()); + HTML_sportsmanager_admin::adminImportSpielerBericht($aktualisierungen, $spielerHinzugefuegt, $nichtAktualisierteUnterschiede, $vereineHinzugefuegt, $spieler_import, $vereineManuell, $ausgetreteneVereineMitAktivenMitgliedern, $kategorie_potentiell_geaendert, redirectSessionIdEmpty() ? null : redirectSessionIdSetzen()); } function adminExportSpielerInternationalForm(): void @@ -5041,7 +5093,7 @@ function adminEditSpielverlegung(): void $zeile++; } - CSVfromArray($rows,"Spielverlegungen.csv"); + exportCSV($rows,"Spielverlegungen.csv"); } function adminSpielverlegungMailen(): void @@ -12240,41 +12292,8 @@ function adminBegegnungenExportForm(): void } $dateiname .= ".csv"; - $dateiname = bereinigterDateiname($dateiname); - ob_end_clean(); // Wegen UTF-8-Zeichen, die in der ausgabe vorhanden sind - Header("Content-Type: text/x-csv"); - Header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT'); - Header('Content-Disposition: attachment; filename="' . $dateiname . '"'); - Header("Pragma: no-cache"); - - $data = ""; - $trennzeichen = ";"; - $spalte = 0; - $header = ""; - - foreach ($rows[0] as $field => $value) { - if ($spalte != 0) { - $header .= $trennzeichen; - } - $header .= $field; - $spalte++; - } - foreach ($rows as $row) { - $line = ''; - $spalte = 0; - foreach ($row as $value) { - if ($spalte != 0) { - $line .= $trennzeichen; - } - $line .= $value; - $spalte++; - } - $data .= trim($line) . "\n"; - } - - echo $header . "\n" . utf8_decode($data); - - die(); + + exportCSV($rows, $dateiname); } function adminEditTurnier(): void diff --git a/src/structure/components/com_sportsmanager/sportsmanager.php b/src/structure/components/com_sportsmanager/sportsmanager.php index 05de63e..367e16a 100644 --- a/src/structure/components/com_sportsmanager/sportsmanager.php +++ b/src/structure/components/com_sportsmanager/sportsmanager.php @@ -3103,7 +3103,9 @@ function spielerDetails(): void $spieler = $rows[0]; // Aktive Vereinsmitgliedschaften ermitteln - $query = "SELECT vereinsname" + $query = "SELECT vereinsname," + . "\n CASE #__sportsmanager_mitglied_von_verein.mitgliedsstatus" + . "\n WHEN 1 THEN 'Aktiv' WHEN 2 THEN 'Eingeschränkt' END AS status" . "\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 " 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 95f2e51..3366c06 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php @@ -4536,9 +4536,9 @@ if ($bild != null) { : - vereinsname) . "
"; + echo htmlentities_utf8($verein->vereinsname) . " (" . htmlentities_utf8($verein->status) . ")
"; ?> 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 690e996..07ddea5 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php @@ -2268,28 +2268,20 @@ class HTML_sportsmanager_admin
- - -
-
- - - - - - - - + +
- : - - -
  + + + + + + + - -
+ : + + +
  -
- -
@@ -2340,109 +2332,89 @@ class HTML_sportsmanager_admin
- - -
-
- - - - - - - - - - - - - - - - + +
- - - -
- - -
- - - + + + + + + + + + - - - - + + + + - -
+ + + +
+ + + -
  + } + ?> + +
  -
- -
@@ -2526,7 +2498,7 @@ class HTML_sportsmanager_admin - - + get('pageclass_sfx'); ?>">  + + + + +
+ + + + + + + + + + +
spieler); ?>feld); ?>db); ?>csv); ?>
+   +
- spiel_nr = "";} ?> + spiel_nr ?? null); ?> 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 28445aa..3009007 100644 --- a/src/structure/language/de-DE/de-DE.com_sportsmanager.ini +++ b/src/structure/language/de-DE/de-DE.com_sportsmanager.ini @@ -415,7 +415,7 @@ COM_SPORTSMANAGER_EXPORT="Exportieren" COM_SPORTSMANAGER_INTERNATIONAL_PLAYERS="Spieler (international)" COM_SPORTSMANAGER_COUNTRY_CODE="Landeskennung" COM_SPORTSMANAGER_IMPORT="Importieren" -COM_SPORTSMANAGER_IMPORT_MESSAGE="Im Import sind ausschließlich Spielerdaten zum Verein %s enthalten. Soll ausschließlich der Spielerbestand des einen Vereins aktualisiert werden, muss der zugehörige Verein unten ausgewählt werden. Beinhaltet der Import den gesamten Spielerbestand einer Organisation, muss die zugehörige Organisation gewählt werden." +COM_SPORTSMANAGER_IMPORT_MESSAGE="Im Import sind ausschließlich Spielerdaten zum Verein %s enthalten. Soll ausschließlich der Spielerbestand des einen Vereins aktualisiert werden, muss der zugehörige Verein unten ausgewählt werden. Beinhaltet der Import den gesamten Spielerbestand einer Organisation, muss die zugehörige Organisation gewählt werden.
Bei schon vorhandener Lizenznummer wird die Lizenznummer und das Geburtsjahr nicht überschrieben!" COM_SPORTSMANAGER_CHECK="Prüfen" COM_SPORTSMANAGER_IMPORT_CONFLICTS_MESSAGE="Im Import sind Fehler oder Konflikte enthalten, die im Vorfeld manuell beseitigt werden müssen." COM_SPORTSMANAGER_IMPORT_DUPLICATE_MESSAGE="Versuch, Spielernr. auf eine bereits für einen anderen Spieler vergebene Spielernr. zu ändern" @@ -1069,4 +1069,5 @@ COM_SPORTSMANAGER_MATCH_SWAPPING_HELP="Bei Heimrechttausch gleichen Termin eintr COM_SPORTSMANAGER_NOT_VALID_TIME="Ungültige Uhrzeit" COM_SPORTSMANAGER_REALLY_MATCH_RESCHEDULING="Willst Du diesen Spielverlegung wirklich entfernen?" COM_SPORTSMANAGER_REST_DAYS="Ruhetage" -COM_SPORTSMANAGER_TRAINING_DAYS="Trainingstage" \ No newline at end of file +COM_SPORTSMANAGER_TRAINING_DAYS="Trainingstage" +COM_SPORTSMANAGER_NOT_ACTUALIZED_DATA="Nicht aktualisierte Daten" \ No newline at end of file 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 a37841b..ee0e151 100644 --- a/src/structure/language/en-GB/en-GB.com_sportsmanager.ini +++ b/src/structure/language/en-GB/en-GB.com_sportsmanager.ini @@ -415,7 +415,7 @@ COM_SPORTSMANAGER_EXPORT="Export" COM_SPORTSMANAGER_INTERNATIONAL_PLAYERS="Players (international)" COM_SPORTSMANAGER_COUNTRY_CODE="Country code" COM_SPORTSMANAGER_IMPORT="Import" -COM_SPORTSMANAGER_IMPORT_MESSAGE="In the import there are only player information about club %s present. Shall only the members of that one club be updated, the associated club has to be selected down here. If the import contains all members of the organisation then the organisation must be selected." +COM_SPORTSMANAGER_IMPORT_MESSAGE="In the import there are only player information about club %s present. Shall only the members of that one club be updated, the associated club has to be selected down here. If the import contains all members of the organisation then the organisation must be selected.
If a license number already exists, the license number and the year of birth will not be overwritten." COM_SPORTSMANAGER_CHECK="Check" COM_SPORTSMANAGER_IMPORT_CONFLICTS_MESSAGE="There are faults or conflicts in the import which have to be fixed manually first." COM_SPORTSMANAGER_IMPORT_DUPLICATE_MESSAGE="Attempt to change player number into one that is already assigned to another player." @@ -1069,4 +1069,5 @@ COM_SPORTSMANAGER_MATCH_SWAPPING_HELP="If home advantage is swapped, enter the s COM_SPORTSMANAGER_NOT_VALID_TIME="Not valid time" COM_SPORTSMANAGER_REALLY_MATCH_RESCHEDULING="Do you really want to remove this match rescheduling?" COM_SPORTSMANAGER_REST_DAYS="Rest days" -COM_SPORTSMANAGER_TRAINING_DAYS="Training days" \ No newline at end of file +COM_SPORTSMANAGER_TRAINING_DAYS="Training days" +COM_SPORTSMANAGER_NOT_ACTUALIZED_DATA="Data not updated" \ No newline at end of file