diff --git a/package-lock.json b/package-lock.json index f8769cf..fbfff06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.0.tgz", "integrity": "sha512-iV7Gwg0DePKvdDZZWRTkj4MW+6/AbVWd4ZCg+zk8H1RVt5xBpUZS6vLQWwb3pyLg4BFTaGiQCPoJ4Ibmbne4fA==", "dev": true, - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/generator": "^7.12.0", @@ -2695,10 +2694,25 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001148", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001148.tgz", - "integrity": "sha512-E66qcd0KMKZHNJQt9hiLZGE3J4zuTqE1OnU53miEVtylFbwOEmeA5OsRu90noZful+XGSQOni1aT2tiqu/9yYw==", - "dev": true + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "1.1.3", diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 66edaa2..f83ab36 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -7839,6 +7839,27 @@ function adminHalloffameMitglieder(): void if (count($rows) > 0){ $mitglieder = []; if ($halloffame->spielform == 1){ + // team_id fuer alle Zeilen ohne verein_id in einer einzigen Abfrage ermitteln statt einer Query je Zeile + $benoetigteTeamnamen = array(); + foreach ($rows as $row) { + if (empty($row->verein_id)) + $benoetigteTeamnamen[(string) $row->teamname] = true; + } + $teamIdsByTeamname = array(); + if (count($benoetigteTeamnamen) > 0) { + $subqueries = array(); + foreach (array_keys($benoetigteTeamnamen) as $teamname) { + $subqueries[] = "(SELECT '" . $db->escape($teamname) . "' AS teamname, team_id" + . " FROM #__sportsmanager_team" + . " WHERE teamname LIKE '" . $db->escape($teamname) . "%'" + . " ORDER BY team_id DESC LIMIT 1)"; + } + $query = implode("\n UNION ALL\n", $subqueries); + foreach (loadObjectList($db, $query) as $treffer) { + $teamIdsByTeamname[$treffer->teamname] = $treffer->team_id; + } + } + foreach ($rows as $row) { $index_vereinid = "verein_id_" . $row->platz; $index_teamid = "team_id_" . $row->platz; @@ -7848,16 +7869,15 @@ function adminHalloffameMitglieder(): void } $mitglieder[$row->jahr]->jahr = $row->jahr; $mitglieder[$row->jahr]->$index_vereinid = $row->verein_id; - $mitglieder[$row->jahr]->$index_team = $row->teamname; + $mitglieder[$row->jahr]->$index_team = !empty($row->nicht_ausgespielt) ? Text::_('COM_SPORTSMANAGER_HALL_OF_FAME_NOT_HELD') : $row->teamname; if ($row->platz == 2 && !empty($row->teamname)) $halloffame->platz2_zeigen = 1; if ($row->platz == 3 && !empty($row->teamname)) $halloffame->platz3_zeigen = 1; - //Suche team_id wenn keine verein_id vorhanden + //team_id wenn keine verein_id vorhanden if (empty($row->verein_id)){ - $query = "SELECT team_id FROM #__sportsmanager_team WHERE teamname LIKE '$row->teamname%' ORDER BY team_id DESC LIMIT 1;"; - $mitglieder[$row->jahr]->$index_teamid = loadResult($db, $query); + $mitglieder[$row->jahr]->$index_teamid = $teamIdsByTeamname[(string) $row->teamname] ?? null; } else { $mitglieder[$row->jahr]->$index_teamid = ""; } @@ -7875,7 +7895,7 @@ function adminHalloffameMitglieder(): void } $mitglieder[$row->jahr]->jahr = $row->jahr; $mitglieder[$row->jahr]->$index_spieler1id = $row->spieler1_id; - $mitglieder[$row->jahr]->$index_spieler1 = $row->spieler1; + $mitglieder[$row->jahr]->$index_spieler1 = !empty($row->nicht_ausgespielt) ? Text::_('COM_SPORTSMANAGER_HALL_OF_FAME_NOT_HELD') : $row->spieler1; $mitglieder[$row->jahr]->$index_spieler2id = $row->spieler2_id; $mitglieder[$row->jahr]->$index_spieler2 = $row->spieler2; if ($row->platz == 2 && (!empty($row->spieler1) || !empty($row->spieler2))) @@ -7908,15 +7928,19 @@ function adminEditHalloffameMitglied(): void } $halloffame = $rows[0]; - $query = "SELECT verein_id, vereinsname As verein" - . "\n FROM #__sportsmanager_verein" - . "\n ORDER BY vereinsname"; - $vereine = loadObjectList($db, $query); - - $query = "SELECT spieler_id, CONCAT(nachname, ', ', vorname, ' (', spielernr, ')') AS spieler" - . "\n FROM #__sportsmanager_spieler" - . "\n ORDER BY nachname, vorname, spielernr"; - $spieler = loadObjectList($db, $query); + $vereine = array(); + $spieler = array(); + if ($halloffame->spielform == 1) { + $query = "SELECT verein_id, vereinsname As verein, ausgetreten" + . "\n FROM #__sportsmanager_verein" + . "\n ORDER BY vereinsname"; + $vereine = loadObjectList($db, $query); + } else { + $query = "SELECT spieler_id, CONCAT(nachname, ', ', vorname, ' (', spielernr, ')') AS spieler" + . "\n FROM #__sportsmanager_spieler" + . "\n ORDER BY nachname, vorname, spielernr"; + $spieler = loadObjectList($db, $query); + } $query = "SELECT t2.*, t1.halloffame" . "\n FROM #__sportsmanager_halloffame t1" @@ -7932,9 +7956,13 @@ function adminEditHalloffameMitglied(): void foreach ($rows as $row) { $index_vereinid = "verein_id_" . $row->platz; $index_team = "teamname_" . $row->platz; + $index_teamspieler = "teamspieler_" . $row->platz; $mitglieder->jahr = $row->jahr; $mitglieder->$index_vereinid = $row->verein_id; $mitglieder->$index_team = $row->teamname; + $mitglieder->$index_teamspieler = $row->teamspieler; + if ($row->platz == 1) + $mitglieder->nicht_ausgespielt = $row->nicht_ausgespielt; } } if ($halloffame->spielform == 2 || $halloffame->spielform == 3){ @@ -7949,6 +7977,8 @@ function adminEditHalloffameMitglied(): void $mitglieder->$index_spieler1 = $row->spieler1; $mitglieder->$index_spieler2id = $row->spieler2_id; $mitglieder->$index_spieler2 = $row->spieler2; + if ($row->platz == 1) + $mitglieder->nicht_ausgespielt = $row->nicht_ausgespielt; } } } @@ -7992,14 +8022,41 @@ function adminEditHalloffameMitglied(): void $halloffame_id = $jInput->get('halloffame_id', 0, 'INT'); $spielform = $jInput->get('spielform', 0, 'INT'); $jahr = $jInput->get('jahr', 0, 'INT'); + $nicht_ausgespielt = $jInput->get('nicht_ausgespielt', false, 'BOOL'); if ($jInput->get('cancel', false, 'BOOL')) redirectSportsManagerURL('&task=admin_halloffame_mitglieder&id=' . $halloffame_id); + if ($nicht_ausgespielt) { + $query = "DELETE FROM #__sportsmanager_mitglied_von_halloffame" + . "\n WHERE halloffame_id = $halloffame_id" + . "\n AND jahr = $jahr" + . "\n AND platz > 1"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + + $query = "INSERT INTO #__sportsmanager_mitglied_von_halloffame" + . "\n (halloffame_id,jahr,platz,nicht_ausgespielt) VALUES" + . "\n ($halloffame_id,$jahr,1,1)" + . "\n ON DUPLICATE KEY UPDATE" + . "\n nicht_ausgespielt = 1," + . "\n verein_id = NULL, teamname = NULL, teamspieler = NULL," + . "\n spieler1_id = NULL, spieler1 = NULL, spieler2_id = NULL, spieler2 = NULL;"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + + redirectSportsManagerURL('&task=admin_halloffame_mitglieder&id=' . $halloffame_id); + } + if ($spielform == 1){ for ($p = 1; $p <= 3; $p++){ $verein_id[$p] = $jInput->get('verein_id_' . $p, 0, 'INT'); $teamname[$p] = $db->escape(trim($jInput->get('teamname_' . $p, '', 'RAW'))); + $teamspieler[$p] = $db->escape(trim($jInput->get('teamspieler_' . $p, '', 'RAW'))); if (empty($teamname[$p]) && !empty($verein_id[$p])){ $query = "SELECT vereinsname FROM #__sportsmanager_verein WHERE verein_id = '" . $verein_id[$p] . "';"; $verein = loadObjectList($db, $query); @@ -8007,10 +8064,12 @@ function adminEditHalloffameMitglied(): void } if (!empty($teamname[$p])){ $query = "INSERT INTO #__sportsmanager_mitglied_von_halloffame" - . "\n (halloffame_id,jahr,platz,verein_id,teamname) VALUES" - . "\n ($halloffame_id,$jahr,$p," . (($verein_id[$p] != 0) ? $verein_id[$p] : 'NULL') . ",'" . $teamname[$p] . "')" + . "\n (halloffame_id,jahr,platz,verein_id,teamname,teamspieler,nicht_ausgespielt) VALUES" + . "\n ($halloffame_id,$jahr,$p," . (($verein_id[$p] != 0) ? $verein_id[$p] : 'NULL') . ",'" . $teamname[$p] . "','" . $teamspieler[$p] . "',0)" . "\n ON DUPLICATE KEY UPDATE verein_id = " . (($verein_id[$p] != 0) ? $verein_id[$p] : 'NULL') . "," - . "\n teamname = '" . $teamname[$p] . "';"; + . "\n teamname = '" . $teamname[$p] . "'," + . "\n teamspieler = '" . $teamspieler[$p] . "'," + . "\n nicht_ausgespielt = 0;"; } else { $query = "DELETE FROM #__sportsmanager_mitglied_von_halloffame" @@ -8047,13 +8106,14 @@ function adminEditHalloffameMitglied(): void } if (!empty($spieler1[$p])){ $query = "INSERT INTO #__sportsmanager_mitglied_von_halloffame" - . "\n (halloffame_id,jahr,platz,spieler1_id,spieler1,spieler2_id,spieler2) VALUES" - . "\n ($halloffame_id,$jahr,$p," . (($spieler1_id[$p] != 0) ? $spieler1_id[$p] : 'NULL') . ",'" . $spieler1[$p] . "'," . (($spieler2_id[$p] != 0) ? $spieler2_id[$p] : 'NULL') . ",'" . $spieler2[$p] . "')" + . "\n (halloffame_id,jahr,platz,spieler1_id,spieler1,spieler2_id,spieler2,nicht_ausgespielt) VALUES" + . "\n ($halloffame_id,$jahr,$p," . (($spieler1_id[$p] != 0) ? $spieler1_id[$p] : 'NULL') . ",'" . $spieler1[$p] . "'," . (($spieler2_id[$p] != 0) ? $spieler2_id[$p] : 'NULL') . ",'" . $spieler2[$p] . "',0)" . "\n ON DUPLICATE KEY UPDATE" . "\n spieler1_id = " . (($spieler1_id[$p] != 0) ? $spieler1_id[$p] : 'NULL') . "," . "\n spieler1 = '" . $spieler1[$p] . "'," . "\n spieler2_id = " . (($spieler2_id[$p] != 0) ? $spieler2_id[$p] : 'NULL') . "," - . "\n spieler2 = '" . $spieler2[$p] . "';"; + . "\n spieler2 = '" . $spieler2[$p] . "'," + . "\n nicht_ausgespielt = 0;"; } else { $query = "DELETE FROM #__sportsmanager_mitglied_von_halloffame" . "\n WHERE halloffame_id = $halloffame_id" diff --git a/src/structure/components/com_sportsmanager/database/update.php b/src/structure/components/com_sportsmanager/database/update.php index bdde5d3..3696672 100644 --- a/src/structure/components/com_sportsmanager/database/update.php +++ b/src/structure/components/com_sportsmanager/database/update.php @@ -5741,6 +5741,52 @@ function updateDatabase(): void } } + if ($datenbank_version < 121) { + + $columns = $db->getTableColumns('#__sportsmanager_mitglied_von_halloffame'); + if (!array_key_exists('teamspieler', $columns)){ + $query = "ALTER TABLE `#__sportsmanager_mitglied_von_halloffame`" + . "\n ADD `teamspieler` TEXT NULL DEFAULT NULL AFTER `teamname`;"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + } + + if (!array_key_exists('nicht_ausgespielt', $columns)){ + $query = "ALTER TABLE `#__sportsmanager_mitglied_von_halloffame`" + . "\n ADD `nicht_ausgespielt` TINYINT(1) NOT NULL DEFAULT '0' AFTER `jahr`;"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + } + + $columns = $db->getTableColumns('#__sportsmanager_spielort'); + if (!array_key_exists('zusatzinfo', $columns)){ + $query = "ALTER TABLE `#__sportsmanager_spielort`" + . "\n ADD `zusatzinfo` TEXT NULL DEFAULT NULL AFTER `ruhetage`;"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + } + + $zielpfad = JPATH_ROOT . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . 'sportsmanager' . DIRECTORY_SEPARATOR . 'spieler' . DIRECTORY_SEPARATOR . 'n.png'; + if (!is_file($zielpfad)) { + $quellpfad = JPATH_SITE . DIRECTORY_SEPARATOR . 'components' . DIRECTORY_SEPARATOR . 'com_sportsmanager' . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . 'spieler-n.png'; + bildKopierenAngepasst($quellpfad, $zielpfad, 180, 240, 1); + } + + $query = "UPDATE #__sportsmanager_einstellungen" + . "\n SET wert = '121'" + . "\n WHERE name = 'datenbank_version'"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + } + if ($termin_aktionen_email_setzen) { $query = "SELECT aktion_user_id, termin_aktion_id" . "\n FROM #__sportsmanager_termin_aktion"; diff --git a/src/structure/components/com_sportsmanager/images/spieler-n.png b/src/structure/components/com_sportsmanager/images/spieler-n.png new file mode 100644 index 0000000..1fc3ed4 Binary files /dev/null and b/src/structure/components/com_sportsmanager/images/spieler-n.png differ diff --git a/src/structure/components/com_sportsmanager/sportsmanager.php b/src/structure/components/com_sportsmanager/sportsmanager.php index 56b6d51..9ca9fa5 100644 --- a/src/structure/components/com_sportsmanager/sportsmanager.php +++ b/src/structure/components/com_sportsmanager/sportsmanager.php @@ -93,6 +93,10 @@ if ($task == "spielerbild") { terminDokument(); } else if ($task == "spieler_details") { spielerDetails(); +} else if ($task == "team_details") { + mannschaftDetails($content == "teams_vereinigt", $content != "teams" && $content != "teams_vereinigt"); +} else if ($task == "verein_details") { + vereinDetails(); } else if ($task !== null && str_starts_with($task, "admin_")) { // in some cases there are no breaks needed due to no return from method switch ($task) { @@ -866,9 +870,6 @@ if ($task == "spielerbild") { case 'begegnung_spielplan': begegnungSpielplan(true); break; - case 'team_details': - mannschaftDetails($content == "teams_vereinigt"); - break; case 'team_spielplan_xml': teamSpielplanXML(); case 'team_begegnungen_ical': @@ -879,9 +880,6 @@ if ($task == "spielerbild") { } } else if ($content == "vereine") { switch ($task) { - case 'verein_details': - vereinDetails(); - break; case 'verein_begegnungen_ical': vereinBegegnungeniCal(); break; @@ -4469,11 +4467,34 @@ function halloffame(): void { $db = getDatabase(); global $params; + $jInput = Factory::getContainer()->get(SiteApplication::class)->input; + + $gruppierung = $jInput->get('gruppierung', '', 'STRING'); + if ($gruppierung !== 'jahr' && $gruppierung !== 'summe' && $gruppierung !== 'summedisziplin') + $gruppierung = ''; + + if ($gruppierung === 'jahr') { + halloffameNachJahrGruppiert(); + return; + } + + if ($gruppierung === 'summe') { + halloffameNachSummeGruppiert(); + return; + } + + if ($gruppierung === 'summedisziplin') { + halloffameNachSummeDisziplinGruppiert(); + return; + } $query = "SELECT t1.*, COUNT(DISTINCT t2.jahr) AS anzahl," . "\n IF (COUNT(DISTINCT t2.jahr) > 0, CONCAT(min(t2.jahr), ' - ', max(t2.jahr)), '" . Text::_('COM_SPORTSMANAGER_NO_ENTRY') . "') AS zeitspanne" . "\n FROM #__sportsmanager_halloffame t1" . "\n LEFT JOIN #__sportsmanager_mitglied_von_halloffame t2 ON t2.halloffame_id = t1.halloffame_id" + . "\n WHERE 1=1" + . halloffameIdFilter("AND t1.halloffame_id IN") + . halloffameJahrFilter("AND t2.jahr IN") . "\n GROUP BY t1.halloffame_id" . kategorieFilter("HAVING t1.kategorie IN") . "\n ORDER BY t1.reihenfolge;"; @@ -4485,11 +4506,363 @@ function halloffame(): void if (isJson()) { echo json_encode($halloffame); } else { - HTML_sportsmanager::halloffame($params->get('titel'), $params->get('beschreibung'), $halloffame); + HTML_sportsmanager::halloffame(halloffameTitel(), $params->get('beschreibung'), $halloffame); } } } +function halloffameNachJahrGruppiert(): void +{ + $db = getDatabase(); + global $params; + $jInput = Factory::getContainer()->get(SiteApplication::class)->input; + + $platzierung = $jInput->get('platzierung', '', 'STRING'); + if ($platzierung !== 'inspalten' && $platzierung !== 'inzeilen') + $platzierung = ''; + + $plaetzezeigen = $jInput->get('plaetzezeigen', 0, 'INT'); + + $sortierung = $jInput->get('sortierung', 'jahrabwaerts', 'STRING'); + if ($sortierung !== 'jahraufwaerts') + $sortierung = 'jahrabwaerts'; + $jahrSortierung = $sortierung === 'jahraufwaerts' ? 'ASC' : 'DESC'; + + $query = "SELECT t2.*, t1.halloffame, t1.spielform, t1.reihenfolge" + . "\n FROM #__sportsmanager_halloffame t1" + . "\n LEFT JOIN #__sportsmanager_mitglied_von_halloffame t2 ON t2.halloffame_id = t1.halloffame_id" + . "\n WHERE t2.jahr IS NOT NULL" + . kategorieFilter("AND t1.kategorie IN") + . halloffameIdFilter("AND t1.halloffame_id IN") + . halloffameJahrFilter("AND t2.jahr IN") + . "\n ORDER BY t2.jahr $jahrSortierung, t1.reihenfolge, t2.platz ASC;"; + $rows = loadObjectList($db, $query); + $alleTeams = halloffameAlleTeams($db); + $alleSpielerInfo = halloffameAlleSpielerInfo($db); + $alleVereineInfo = halloffameAlleVereineInfo($db); + + $disziplinen = []; + $jahresDaten = []; + + foreach ($rows as $row) { + if (!isset($disziplinen[$row->halloffame_id])) { + $disziplinen[$row->halloffame_id] = (object) [ + 'halloffame_id' => $row->halloffame_id, + 'halloffame' => $row->halloffame, + 'spielform' => $row->spielform, + 'reihenfolge' => $row->reihenfolge, + 'platz2_zeigen' => 0, + 'platz3_zeigen' => 0, + 'teamspieler_zeigen' => 0, + 'anzahl_m' => 0, + 'anzahl_w' => 0, + ]; + } + $disziplin = $disziplinen[$row->halloffame_id]; + + if (!empty($row->nicht_ausgespielt)) continue; + + if (!isset($jahresDaten[$row->jahr])) + $jahresDaten[$row->jahr] = []; + if (!isset($jahresDaten[$row->jahr][$row->halloffame_id])) + $jahresDaten[$row->jahr][$row->halloffame_id] = new stdClass(); + $ziel = $jahresDaten[$row->jahr][$row->halloffame_id]; + + if ($disziplin->spielform == 1) { + $index_vereinid = "verein_id_" . $row->platz; + $index_teamid = "team_id_" . $row->platz; + $index_team = "teamname_" . $row->platz; + $index_teamspieler = "teamspieler_" . $row->platz; + + $ziel->$index_vereinid = $row->verein_id; + $ziel->$index_team = $row->teamname; + $ziel->$index_teamspieler = $row->teamspieler; + if (empty($row->verein_id)) { + $ziel->$index_teamid = halloffameTeamIdFuerTeamname($alleTeams, $row->teamname); + } else { + $ziel->$index_teamid = ""; + } + if ($row->platz == 2 && !empty($row->teamname)) + $disziplin->platz2_zeigen = 1; + if ($row->platz == 3 && !empty($row->teamname)) + $disziplin->platz3_zeigen = 1; + if (mb_strlen(trim((string) $row->teamspieler)) >= 3) + $disziplin->teamspieler_zeigen = 1; + } else { + $index_spieler1id = "spieler1_id_" . $row->platz; + $index_spieler1 = "spieler1_" . $row->platz; + $index_spieler2id = "spieler2_id_" . $row->platz; + $index_spieler2 = "spieler2_" . $row->platz; + + $ziel->$index_spieler1id = $row->spieler1_id; + $ziel->$index_spieler1 = $row->spieler1; + $ziel->$index_spieler2id = $row->spieler2_id; + $ziel->$index_spieler2 = $row->spieler2; + if ($row->platz == 2 && (!empty($row->spieler1) || !empty($row->spieler2))) + $disziplin->platz2_zeigen = 1; + if ($row->platz == 3 && (!empty($row->spieler1) || !empty($row->spieler2))) + $disziplin->platz3_zeigen = 1; + halloffameGeschlechtZaehlen($disziplin, $alleSpielerInfo, $row->spieler1_id, $disziplin->spielform == 2 ? $row->spieler2_id : null); + } + } + + foreach ($disziplinen as $disziplin) + $disziplin->geschaetztes_geschlecht = halloffameGeschaetztesGeschlecht($disziplin->anzahl_m, $disziplin->anzahl_w); + + if ($plaetzezeigen > 0) { + foreach ($disziplinen as $disziplin) { + if ($plaetzezeigen < 2) + $disziplin->platz2_zeigen = 0; + if ($plaetzezeigen < 3) + $disziplin->platz3_zeigen = 0; + } + } + + usort($disziplinen, fn($a, $b) => $a->reihenfolge <=> $b->reihenfolge); + + if (isJson()) { + echo json_encode(['disziplinen' => $disziplinen, 'jahre' => $jahresDaten]); + } else { + HTML_sportsmanager::halloffameNachJahrGruppiert(halloffameTitel(), $params->get('beschreibung'), $disziplinen, $jahresDaten, $platzierung, $alleSpielerInfo, $alleVereineInfo); + } +} + +function halloffameSummeTitelHinzufuegen(object $traegerEintrag, object $row): void +{ + if (!isset($traegerEintrag->titel[$row->halloffame_id])) { + $traegerEintrag->titel[$row->halloffame_id] = (object) [ + 'halloffame' => $row->halloffame, + 'jahre' => [], + ]; + } + $traegerEintrag->titel[$row->halloffame_id]->jahre[] = $row->jahr; +} + +function halloffameNachSummeGruppiert(): void +{ + $db = getDatabase(); + global $params; + $jInput = Factory::getContainer()->get(SiteApplication::class)->input; + + $anzahltitel = $jInput->get('anzahltitel', 0, 'INT'); + + $sortierung = $jInput->get('sortierung', 'anzahl', 'STRING'); + if ($sortierung !== 'name') + $sortierung = 'anzahl'; + + $query = "SELECT t2.*, t1.halloffame, t1.spielform, t1.reihenfolge" + . "\n FROM #__sportsmanager_halloffame t1" + . "\n LEFT JOIN #__sportsmanager_mitglied_von_halloffame t2 ON t2.halloffame_id = t1.halloffame_id" + . "\n WHERE t2.jahr IS NOT NULL AND t2.platz = 1" + . kategorieFilter("AND t1.kategorie IN") + . halloffameIdFilter("AND t1.halloffame_id IN") + . halloffameJahrFilter("AND t2.jahr IN") + . "\n ORDER BY t1.reihenfolge, t2.jahr ASC;"; + $rows = loadObjectList($db, $query); + $alleTeams = halloffameAlleTeams($db); + $alleSpielerInfo = halloffameAlleSpielerInfo($db); + $alleVereineInfo = halloffameAlleVereineInfo($db); + + $traeger = []; + + foreach ($rows as $row) { + if (!empty($row->nicht_ausgespielt)) continue; + + if ($row->spielform == 1) { + $name = trim($row->teamname); + if ($name === '') continue; + + $key = 'team:' . $name; + if (!isset($traeger[$key])) { + if (empty($row->verein_id)) { + $bild_type = 'mannschaften'; + $bild_id = halloffameTeamIdFuerTeamname($alleTeams, $row->teamname); + } else { + $bild_type = 'vereine'; + $bild_id = $row->verein_id; + } + $traeger[$key] = (object) [ + 'name' => $name, + 'bild_type' => $bild_type, + 'bild_id' => $bild_id, + 'aktiv' => $bild_type === 'vereine' ? halloffameVereinAktiv($alleVereineInfo, $bild_id) : true, + 'geschlecht' => null, + 'titel' => [], + ]; + } + halloffameSummeTitelHinzufuegen($traeger[$key], $row); + } else { + if (!empty($row->spieler1_id)) { + $key = 'spieler:' . $row->spieler1_id; + if (!isset($traeger[$key])) { + $traeger[$key] = (object) [ + 'name' => $row->spieler1, + 'bild_type' => 'spieler', + 'bild_id' => $row->spieler1_id, + 'aktiv' => halloffameSpielerAktiv($alleSpielerInfo, $row->spieler1_id), + 'geschlecht' => $alleSpielerInfo[$row->spieler1_id]->geschlecht ?? null, + 'titel' => [], + ]; + } + halloffameSummeTitelHinzufuegen($traeger[$key], $row); + } + if ($row->spielform == 2 && !empty($row->spieler2_id)) { + $key = 'spieler:' . $row->spieler2_id; + if (!isset($traeger[$key])) { + $traeger[$key] = (object) [ + 'name' => $row->spieler2, + 'bild_type' => 'spieler', + 'bild_id' => $row->spieler2_id, + 'aktiv' => halloffameSpielerAktiv($alleSpielerInfo, $row->spieler2_id), + 'geschlecht' => $alleSpielerInfo[$row->spieler2_id]->geschlecht ?? null, + 'titel' => [], + ]; + } + halloffameSummeTitelHinzufuegen($traeger[$key], $row); + } + } + } + + foreach ($traeger as $t) { + $t->anzahl = 0; + foreach ($t->titel as $titel) + $t->anzahl += count($titel->jahre); + } + + if ($anzahltitel > 0) + $traeger = array_filter($traeger, fn($t) => $t->anzahl >= $anzahltitel); + + if ($sortierung === 'name') { + usort($traeger, fn($a, $b) => strcasecmp($a->name, $b->name)); + } else { + usort($traeger, fn($a, $b) => ($b->anzahl <=> $a->anzahl) ?: strcasecmp($a->name, $b->name)); + } + + if (isJson()) { + echo json_encode($traeger); + } else { + HTML_sportsmanager::halloffameNachSummeGruppiert(halloffameTitel(), $params->get('beschreibung'), $traeger); + } +} + +function halloffameNachSummeDisziplinGruppiert(): void +{ + $db = getDatabase(); + global $params; + $jInput = Factory::getContainer()->get(SiteApplication::class)->input; + + $anzahltitel = $jInput->get('anzahltitel', 0, 'INT'); + + $sortierung = $jInput->get('sortierung', 'anzahl', 'STRING'); + if ($sortierung !== 'name') + $sortierung = 'anzahl'; + + $query = "SELECT t2.*, t1.halloffame, t1.spielform, t1.reihenfolge" + . "\n FROM #__sportsmanager_halloffame t1" + . "\n LEFT JOIN #__sportsmanager_mitglied_von_halloffame t2 ON t2.halloffame_id = t1.halloffame_id" + . "\n WHERE t2.jahr IS NOT NULL AND t2.platz = 1" + . kategorieFilter("AND t1.kategorie IN") + . halloffameIdFilter("AND t1.halloffame_id IN") + . halloffameJahrFilter("AND t2.jahr IN") + . "\n ORDER BY t1.reihenfolge, t2.jahr ASC;"; + $rows = loadObjectList($db, $query); + $alleTeams = halloffameAlleTeams($db); + $alleSpielerInfo = halloffameAlleSpielerInfo($db); + $alleVereineInfo = halloffameAlleVereineInfo($db); + + $disziplinen = []; + + foreach ($rows as $row) { + if (!isset($disziplinen[$row->halloffame_id])) { + $disziplinen[$row->halloffame_id] = (object) [ + 'halloffame_id' => $row->halloffame_id, + 'halloffame' => $row->halloffame, + 'reihenfolge' => $row->reihenfolge, + 'traeger' => [], + ]; + } + $disziplin = $disziplinen[$row->halloffame_id]; + + if (!empty($row->nicht_ausgespielt)) continue; + + if ($row->spielform == 1) { + $name = trim($row->teamname); + if ($name === '') continue; + + $key = 'team:' . $name; + if (!isset($disziplin->traeger[$key])) { + if (empty($row->verein_id)) { + $bild_type = 'mannschaften'; + $bild_id = halloffameTeamIdFuerTeamname($alleTeams, $row->teamname); + } else { + $bild_type = 'vereine'; + $bild_id = $row->verein_id; + } + $disziplin->traeger[$key] = (object) [ + 'name' => $name, + 'bild_type' => $bild_type, + 'bild_id' => $bild_id, + 'aktiv' => $bild_type === 'vereine' ? halloffameVereinAktiv($alleVereineInfo, $bild_id) : true, + 'geschlecht' => null, + 'jahre' => [], + ]; + } + $disziplin->traeger[$key]->jahre[] = $row->jahr; + } else { + if (!empty($row->spieler1_id)) { + $key = 'spieler:' . $row->spieler1_id; + if (!isset($disziplin->traeger[$key])) { + $disziplin->traeger[$key] = (object) [ + 'name' => $row->spieler1, + 'bild_type' => 'spieler', + 'bild_id' => $row->spieler1_id, + 'aktiv' => halloffameSpielerAktiv($alleSpielerInfo, $row->spieler1_id), + 'geschlecht' => $alleSpielerInfo[$row->spieler1_id]->geschlecht ?? null, + 'jahre' => [], + ]; + } + $disziplin->traeger[$key]->jahre[] = $row->jahr; + } + if ($row->spielform == 2 && !empty($row->spieler2_id)) { + $key = 'spieler:' . $row->spieler2_id; + if (!isset($disziplin->traeger[$key])) { + $disziplin->traeger[$key] = (object) [ + 'name' => $row->spieler2, + 'bild_type' => 'spieler', + 'bild_id' => $row->spieler2_id, + 'aktiv' => halloffameSpielerAktiv($alleSpielerInfo, $row->spieler2_id), + 'geschlecht' => $alleSpielerInfo[$row->spieler2_id]->geschlecht ?? null, + 'jahre' => [], + ]; + } + $disziplin->traeger[$key]->jahre[] = $row->jahr; + } + } + } + + foreach ($disziplinen as $disziplin) { + foreach ($disziplin->traeger as $t) + $t->anzahl = count($t->jahre); + + if ($anzahltitel > 0) + $disziplin->traeger = array_filter($disziplin->traeger, fn($t) => $t->anzahl >= $anzahltitel); + + if ($sortierung === 'name') { + usort($disziplin->traeger, fn($a, $b) => strcasecmp($a->name, $b->name)); + } else { + usort($disziplin->traeger, fn($a, $b) => ($b->anzahl <=> $a->anzahl) ?: strcasecmp($a->name, $b->name)); + } + } + + usort($disziplinen, fn($a, $b) => $a->reihenfolge <=> $b->reihenfolge); + + if (isJson()) { + echo json_encode($disziplinen); + } else { + HTML_sportsmanager::halloffameNachSummeDisziplinGruppiert(halloffameTitel(), $params->get('beschreibung'), $disziplinen); + } +} + function halloffameDetails($uebergabe_id = 0): void { $db = getDatabase(); @@ -4503,9 +4876,21 @@ function halloffameDetails($uebergabe_id = 0): void else $id = $uebergabe_id; + $platzierung = $jInput->get('platzierung', '', 'STRING'); + if ($platzierung !== 'inspalten' && $platzierung !== 'inzeilen') + $platzierung = ''; + + $plaetzezeigen = $jInput->get('plaetzezeigen', 0, 'INT'); + + $sortierung = $jInput->get('sortierung', 'jahrabwaerts', 'STRING'); + if ($sortierung !== 'jahraufwaerts') + $sortierung = 'jahrabwaerts'; + $jahrSortierung = $sortierung === 'jahraufwaerts' ? 'ASC' : 'DESC'; + $mitglieder = null; - $query = "SELECT * FROM #__sportsmanager_halloffame WHERE halloffame_id = $id"; + $query = "SELECT * FROM #__sportsmanager_halloffame WHERE halloffame_id = $id" + . halloffameIdFilter("AND halloffame_id IN"); $rows = loadObjectList($db, $query); if (count($rows) < 1) { abortWithError("Wrong id!"); @@ -4513,36 +4898,46 @@ function halloffameDetails($uebergabe_id = 0): void $halloffame = $rows[0]; $halloffame->platz2_zeigen = 0; $halloffame->platz3_zeigen = 0; + $halloffame->teamspieler_zeigen = 0; + $halloffame->anzahl_m = 0; + $halloffame->anzahl_w = 0; $query = "SELECT t2.*, t1.halloffame" . "\n FROM #__sportsmanager_halloffame t1" . "\n LEFT JOIN #__sportsmanager_mitglied_von_halloffame t2 ON t2.halloffame_id = t1.halloffame_id" . "\n WHERE t2.halloffame_id = $id" - . "\n ORDER BY t2.jahr DESC, platz ASC;"; + . halloffameJahrFilter("AND t2.jahr IN") + . "\n ORDER BY t2.jahr $jahrSortierung, platz ASC;"; $rows = loadObjectList($db, $query); + $alleSpielerInfo = halloffameAlleSpielerInfo($db); + $alleVereineInfo = halloffameAlleVereineInfo($db); if (count($rows) > 0){ $mitglieder = []; if ($halloffame->spielform == 1){ + $alleTeams = halloffameAlleTeams($db); foreach ($rows as $row) { $index_vereinid = "verein_id_" . $row->platz; $index_teamid = "team_id_" . $row->platz; $index_team = "teamname_" . $row->platz; + $index_teamspieler = "teamspieler_" . $row->platz; if (!isset($mitglieder[$row->jahr])) { $mitglieder[$row->jahr] = new stdClass(); } $mitglieder[$row->jahr]->jahr = $row->jahr; $mitglieder[$row->jahr]->$index_vereinid = $row->verein_id; - $mitglieder[$row->jahr]->$index_team = $row->teamname; + $mitglieder[$row->jahr]->$index_team = !empty($row->nicht_ausgespielt) ? Text::_('COM_SPORTSMANAGER_HALL_OF_FAME_NOT_HELD') : $row->teamname; + $mitglieder[$row->jahr]->$index_teamspieler = $row->teamspieler; if ($row->platz == 2 && !empty($row->teamname)) $halloffame->platz2_zeigen = 1; if ($row->platz == 3 && !empty($row->teamname)) $halloffame->platz3_zeigen = 1; + if (mb_strlen(trim((string) $row->teamspieler)) >= 3) + $halloffame->teamspieler_zeigen = 1; //Suche team_id wenn keine verein_id vorhanden if (empty($row->verein_id)){ - $query = "SELECT team_id FROM #__sportsmanager_team WHERE teamname LIKE '$row->teamname%' ORDER BY team_id DESC LIMIT 1;"; - $mitglieder[$row->jahr]->$index_teamid = loadResult($db, $query); + $mitglieder[$row->jahr]->$index_teamid = halloffameTeamIdFuerTeamname($alleTeams, $row->teamname); } else { $mitglieder[$row->jahr]->$index_teamid = ""; } @@ -4560,21 +4955,31 @@ function halloffameDetails($uebergabe_id = 0): void } $mitglieder[$row->jahr]->jahr = $row->jahr; $mitglieder[$row->jahr]->$index_spieler1id = $row->spieler1_id; - $mitglieder[$row->jahr]->$index_spieler1 = $row->spieler1; + $mitglieder[$row->jahr]->$index_spieler1 = !empty($row->nicht_ausgespielt) ? Text::_('COM_SPORTSMANAGER_HALL_OF_FAME_NOT_HELD') : $row->spieler1; $mitglieder[$row->jahr]->$index_spieler2id = $row->spieler2_id; $mitglieder[$row->jahr]->$index_spieler2 = $row->spieler2; if ($row->platz == 2 && (!empty($row->spieler1) || !empty($row->spieler2))) $halloffame->platz2_zeigen = 1; if ($row->platz == 3 && (!empty($row->spieler1) || !empty($row->spieler2))) $halloffame->platz3_zeigen = 1; + halloffameGeschlechtZaehlen($halloffame, $alleSpielerInfo, $row->spieler1_id, $halloffame->spielform == 2 ? $row->spieler2_id : null); } } } + $halloffame->geschaetztes_geschlecht = halloffameGeschaetztesGeschlecht($halloffame->anzahl_m, $halloffame->anzahl_w); + + if ($plaetzezeigen > 0) { + if ($plaetzezeigen < 2) + $halloffame->platz2_zeigen = 0; + if ($plaetzezeigen < 3) + $halloffame->platz3_zeigen = 0; + } + if (isJson()) { echo json_encode($mitglieder); } else { - HTML_sportsmanager::halloffameDetails($params->get('titel'), $params->get('beschreibung'), $mitglieder, $halloffame); + HTML_sportsmanager::halloffameDetails(halloffameTitel(), $params->get('beschreibung'), $mitglieder, $halloffame, $platzierung, $alleSpielerInfo, $alleVereineInfo); } } diff --git a/src/structure/components/com_sportsmanager/tools.php b/src/structure/components/com_sportsmanager/tools.php index e80fbc4..015fb66 100644 --- a/src/structure/components/com_sportsmanager/tools.php +++ b/src/structure/components/com_sportsmanager/tools.php @@ -232,6 +232,217 @@ function kategorieFilter($prefix, $suffix = ""): string return " $prefix (" . implode(", ", $filter) . ") $suffix"; } +function idListeParameterFilter(string $parameterName, string $prefix, string $suffix = ""): string +{ + $jInput = Factory::getContainer()->get(SiteApplication::class)->input; + $werte = $jInput->get($parameterName, '', 'STRING'); + + $result = []; + foreach (explode(",", $werte) as $item) { + $item = trim($item); + if ($item === '') continue; + + $num = intval($item); + if ($num > 0) { + $result[$num] = true; // Duplikate vermeiden + } + } + + if (empty($result)) { + return ""; + } + + $filter = array_keys($result); + sort($filter, SORT_NUMERIC); + + return " $prefix (" . implode(", ", $filter) . ") $suffix"; +} + +function halloffameIdFilter($prefix): string +{ + // Keine Bereichssuche bei der Halloffame-Id, nur einzelne Werte + return idListeParameterFilter('halloffame_id', $prefix); +} + +function halloffameJahrFilter($prefix): string +{ + $minJahr = 1900; + $maxJahr = (int) date('Y') + 5; + + $jInput = Factory::getContainer()->get(SiteApplication::class)->input; + $werte = $jInput->get('jahr', '', 'STRING'); + + $result = []; + foreach (explode(",", $werte) as $item) { + $item = trim($item); + if ($item === '') continue; + + // Prüfen, ob es ein Bereich ist + if (strpos($item, '-') !== false) { + $rangeParts = explode('-', $item); + + // genau 2 Teile für einen gültigen Bereich + if (count($rangeParts) !== 2) continue; + + $start = intval(trim($rangeParts[0])); + $end = intval(trim($rangeParts[1])); + + if ($start <= 0 || $end <= 0) continue; + + // Werte vertauschen, falls der 2. Wert kleiner als der 1. ist + if ($end < $start) { + [$start, $end] = [$end, $start]; + } + + // Bereich auf 1900 .. aktuelles Jahr+5 begrenzen + $start = max($start, $minJahr); + $end = min($end, $maxJahr); + + if ($start > $end) continue; + + for ($i = $start; $i <= $end; $i++) { + $result[$i] = true; // Duplikate vermeiden + } + } else { + $num = intval($item); + if ($num <= 0) continue; + + // Einzelwert auf 1900 .. aktuelles Jahr+5 begrenzen + $num = max($minJahr, min($maxJahr, $num)); + $result[$num] = true; + } + } + + if (empty($result)) { + return ""; + } + + $filter = array_keys($result); + sort($filter, SORT_NUMERIC); + + return " $prefix (" . implode(", ", $filter) . ")"; +} + +function halloffameAlleTeams($db): array +{ + return loadObjectList($db, "SELECT team_id, teamname FROM #__sportsmanager_team ORDER BY team_id DESC"); +} + +function halloffameTeamIdFuerTeamname(array $alleTeams, ?string $teamname) +{ + if (empty($teamname)) + return null; + foreach ($alleTeams as $team) { + if (str_starts_with($team->teamname, $teamname)) + return $team->team_id; + } + return null; +} + +function halloffameAlleSpielerInfo($db): array +{ + // "Aktiv" = hat einen aktuellen Verein; ohne aktuellen Verein liefert spieler_details ohnehin keine Daten + $rows = loadObjectList($db, "SELECT spieler_id, geschlecht, aktueller_verein_id FROM #__sportsmanager_spieler"); + $result = []; + foreach ($rows as $row) { + $result[$row->spieler_id] = (object) [ + 'geschlecht' => $row->geschlecht, + 'aktiv' => !empty($row->aktueller_verein_id), + ]; + } + return $result; +} + +function halloffameSpielerAktiv(array $alleSpielerInfo, $spieler_id): bool +{ + return empty($spieler_id) || !isset($alleSpielerInfo[$spieler_id]) || $alleSpielerInfo[$spieler_id]->aktiv; +} + +function halloffameSpielerBildId(array $alleSpielerInfo, $spieler_id) +{ + return halloffameSpielerAktiv($alleSpielerInfo, $spieler_id) ? $spieler_id : ''; +} + +function halloffameSpielerBildAlternativ(array $alleSpielerInfo, $spieler_id, string $geschaetztesGeschlecht = ''): string +{ + if (!empty($spieler_id) && isset($alleSpielerInfo[$spieler_id])) + return $alleSpielerInfo[$spieler_id]->geschlecht == 'M' ? 'm' : 'w'; + if ($geschaetztesGeschlecht === 'M') + return 'm'; + if ($geschaetztesGeschlecht === 'W') + return 'w'; + return 'n'; +} + +function halloffameGeschlechtZaehlen(object $ziel, array $alleSpielerInfo, $spieler1_id, $spieler2_id): void +{ + foreach ([$spieler1_id, $spieler2_id] as $id) { + if (empty($id) || !isset($alleSpielerInfo[$id])) + continue; + if ($alleSpielerInfo[$id]->geschlecht == 'M') + $ziel->anzahl_m++; + else + $ziel->anzahl_w++; + } +} + +function halloffameGeschaetztesGeschlecht($anzahl_m, $anzahl_w): string +{ + if ($anzahl_m > $anzahl_w) + return 'M'; + if ($anzahl_w > $anzahl_m) + return 'W'; + return ''; +} + +function halloffameAlleVereineInfo($db): array +{ + $rows = loadObjectList($db, "SELECT verein_id, ausgetreten FROM #__sportsmanager_verein"); + $result = []; + foreach ($rows as $row) { + $result[$row->verein_id] = (object) [ + 'aktiv' => empty($row->ausgetreten), + ]; + } + return $result; +} + +function halloffameVereinAktiv(array $alleVereineInfo, $verein_id): bool +{ + return empty($verein_id) || !isset($alleVereineInfo[$verein_id]) || $alleVereineInfo[$verein_id]->aktiv; +} + +function halloffameNameLink(string $bild_type, $id, array $alleSpielerInfo, array $alleVereineInfo, string $nameHtml): string +{ + if (empty($id)) + return $nameHtml; + if ($bild_type === 'spieler' && !halloffameSpielerAktiv($alleSpielerInfo, $id)) + return $nameHtml; + if ($bild_type === 'vereine' && !halloffameVereinAktiv($alleVereineInfo, $id)) + return $nameHtml; + + $tasks = ['spieler' => 'spieler_details', 'vereine' => 'verein_details', 'mannschaften' => 'team_details']; + if (!isset($tasks[$bild_type])) + return $nameHtml; + + return '' . $nameHtml . ''; +} + +function halloffameTitel(): string +{ + global $params; + + $titel = trim((string) $params->get('titel', '')); + if ($titel !== '') + return $titel; + + $menu = Factory::getContainer()->get(SiteApplication::class)->getMenu()->getActive(); + if ($menu !== null && trim((string) $menu->title) !== '') + return $menu->title; + + return ''; +} + function turnierFilter($prefix): string { $user_id = isExternalDatabase() ? 0 : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->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 5cd9718..d1dd6b9 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php @@ -4166,8 +4166,8 @@ static function halloffame($titel, $beschreibung, $rows): void global $params; if (!empty($titel)) { ?> -
get('pageclass_sfx'); ?>" style="font-size: inherit; margin: 0;">
@@ -4217,13 +4217,490 @@ static function halloffame($titel, $beschreibung, $rows): void -
get('pageclass_sfx'); ?>" style="font-size: inherit; margin: 0;"> +
+ + + + +
") ? $beschreibung : htmlentities_utf8($beschreibung); ?>
+
+ 0 && count($jahresDaten) > 0) { + ?> + + platz3_zeigen) $maxPlatz = 3; + else if ($disziplin->platz2_zeigen && $maxPlatz < 2) $maxPlatz = 2; + } + $nurPlatz1 = $maxPlatz == 1; + $disziplinBreite = $nurPlatz1 ? 400 : 280; + + $breite = 2; + foreach ($disziplinen as $disziplin) { + if ($disziplin->spielform == 2) $breite = 4; + } + + $teamspielerZeigen = false; + if ($platzierung === 'inzeilen' || $nurPlatz1) { + foreach ($disziplinen as $disziplin) { + if ($disziplin->spielform == 1 && $disziplin->teamspieler_zeigen) { + $teamspielerZeigen = true; + break; + } + } + } + + foreach ($jahresDaten as $jahr => $disziplinenDesJahres) { + ?> +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + halloffame_id])) continue; + $row = $disziplinenDesJahres[$disziplin->halloffame_id]; + $rowclass = "sectiontableentry" . ($k + 1) . $params->get('pageclass_sfx'); + $k = ($k + 1) % 2; + + $plaetzeVorhanden = []; + for ($i = 1; $i <= 3; $i++) { + if ($i == 2 && !$disziplin->platz2_zeigen) continue; + if ($i == 3 && !$disziplin->platz3_zeigen) continue; + if ($disziplin->spielform == 2) { + $spieler1 = "spieler1_" . $i; + $spieler2 = "spieler2_" . $i; + if (empty($row->$spieler1) && empty($row->$spieler2)) continue; + } else { + $txt = ($disziplin->spielform == 1 ? "teamname_" : "spieler1_") . $i; + if (empty($row->$txt)) continue; + } + $plaetzeVorhanden[] = $i; + } + if (empty($plaetzeVorhanden)) $plaetzeVorhanden = [1]; + + $anzahlPlatzZeilen = count($plaetzeVorhanden); + $ersteZeile = true; + + foreach ($plaetzeVorhanden as $i) { + ?> + + + + + + + + spielform == 2) { + $spieler1_id = "spieler1_id_" . $i; + $spieler1 = "spieler1_" . $i; + $spieler2_id = "spieler2_id_" . $i; + $spieler2 = "spieler2_" . $i; + ?> + + + + + spielform == 1) { + $id = "verein_id_" . $i; + $txt = "teamname_" . $i; + $type = "vereine"; + if ($row->$id == "") { + $id = "team_id_" . $i; + $type = "mannschaften"; + } + } else { + $id = "spieler1_id_" . $i; + $txt = "spieler1_" . $i; + $type = "spieler"; + } + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + halloffame_id])) continue; + $row = $disziplinenDesJahres[$disziplin->halloffame_id]; + $rowclass = "sectiontableentry" . ($k + 1) . $params->get('pageclass_sfx'); + $k = ($k + 1) % 2; + ?> + + + platz2_zeigen) || ($i == 3 && $disziplin->platz3_zeigen); + if (!$vorhanden) { ?> + + + + spielform == 2) { + $spieler1_id = "spieler1_id_" . $i; + $spieler1 = "spieler1_" . $i; + $spieler2_id = "spieler2_id_" . $i; + $spieler2 = "spieler2_" . $i; + ?> + + + + + spielform == 1) { + $id = "verein_id_" . $i; + $txt = "teamname_" . $i; + $type = "vereine"; + if ($row->$id == "") { + $id = "team_id_" . $i; + $type = "mannschaften"; + } + } else { + $id = "spieler1_id_" . $i; + $txt = "spieler1_" . $i; + $type = "spieler"; + } + ?> + + + + + + + + + + + + + + +
+ + halloffame)); ?> + + + + + $spieler1_id), 45, 60, 0, 0, 'border="0"', halloffameSpielerBildAlternativ($alleSpielerInfo, $row->$spieler1_id, $disziplin->geschaetztes_geschlecht)); ?> + + $spieler1_id, $alleSpielerInfo, $alleVereineInfo, htmlentities_utf8($row->$spieler1)); ?> + + $spieler2_id), 45, 60, 0, 0, 'border="0"', halloffameSpielerBildAlternativ($alleSpielerInfo, $row->$spieler2_id, $disziplin->geschaetztes_geschlecht)); ?> + + $spieler2_id, $alleSpielerInfo, $alleVereineInfo, htmlentities_utf8($row->$spieler2)); ?> + + $id) : $row->$id, 45, 60, 0, 0, 'border="0"', $type === 'spieler' ? halloffameSpielerBildAlternativ($alleSpielerInfo, $row->$id, $disziplin->geschaetztes_geschlecht) : ''); ?> + + $id, $alleSpielerInfo, $alleVereineInfo, htmlentities_utf8($row->$txt)); ?> + + spielform == 1 ? nl2br(htmlentities_utf8($row->$index_teamspieler)) : ''; ?> +
+ + + +
+ + halloffame)); ?> + + + $spieler1)) echo bildHTML("spieler", halloffameSpielerBildId($alleSpielerInfo, $row->$spieler1_id), 45, 60, 0, 0, 'border="0"', halloffameSpielerBildAlternativ($alleSpielerInfo, $row->$spieler1_id, $disziplin->geschaetztes_geschlecht)); ?> + + $spieler1_id, $alleSpielerInfo, $alleVereineInfo, htmlentities_utf8($row->$spieler1)); ?> + + $spieler2)) echo bildHTML("spieler", halloffameSpielerBildId($alleSpielerInfo, $row->$spieler2_id), 45, 60, 0, 0, 'border="0"', halloffameSpielerBildAlternativ($alleSpielerInfo, $row->$spieler2_id, $disziplin->geschaetztes_geschlecht)); ?> + + $spieler2_id, $alleSpielerInfo, $alleVereineInfo, htmlentities_utf8($row->$spieler2)); ?> + + $txt)) echo bildHTML($type, $type === 'spieler' ? halloffameSpielerBildId($alleSpielerInfo, $row->$id) : $row->$id, 45, 60, 0, 0, 'border="0"', $type === 'spieler' ? halloffameSpielerBildAlternativ($alleSpielerInfo, $row->$id, $disziplin->geschaetztes_geschlecht) : ''); ?> + + $id, $alleSpielerInfo, $alleVereineInfo, htmlentities_utf8($row->$txt)); ?> + + spielform == 1 ? nl2br(htmlentities_utf8($row->$index_teamspieler)) : ''; ?> +
+
+ +   + + +

+
+ + + + +
") ? $beschreibung : htmlentities_utf8($beschreibung); ?>
+
+ 0) { + ?> +
+ + + + + + + + + + + + + + + + get('pageclass_sfx'); + $k = ($k + 1) % 2; + + $titelTexte = []; + foreach ($t->titel as $titel) { + $titelTexte[] = htmlentities_utf8(NichtLeererString($titel->halloffame)) . " (" . count($titel->jahre) . ") (" . implode(", ", $titel->jahre) . ")"; + } + ?> + + + + + + + +
+ bild_type === 'spieler' && !$t->aktiv ? '' : $t->bild_id; + $traegerBildAlt = $t->bild_type === 'spieler' ? ($t->geschlecht == 'M' ? 'm' : 'w') : ''; + echo bildHTML($t->bild_type, $traegerBildId, 45, 60, 0, 0, 'border="0"', $traegerBildAlt); + ?> + + 'spieler_details', 'vereine' => 'verein_details', 'mannschaften' => 'team_details'][$t->bild_type] ?? ''; + if ($traegerDetailsTask !== '' && !empty($t->bild_id) && $t->aktiv) { + echo '' . htmlentities_utf8($t->name) . ''; + } else { + echo htmlentities_utf8($t->name); + } + ?> + + anzahl; ?> + + ", $titelTexte); ?> +
+
+ +   + + +

+
+ + + + +
") ? $beschreibung : htmlentities_utf8($beschreibung); ?>
+
+ + + traeger) == 0) continue; + ?> +

+ + halloffame)); ?> + +

+
+ + + + + + + + + + + + + + + + traeger as $t) { + $rowclass = "sectiontableentry" . ($k + 1) . $params->get('pageclass_sfx'); + $k = ($k + 1) % 2; + ?> + + + + + + + +
+ bild_type === 'spieler' && !$t->aktiv ? '' : $t->bild_id; + $traegerBildAlt = $t->bild_type === 'spieler' ? ($t->geschlecht == 'M' ? 'm' : 'w') : ''; + echo bildHTML($t->bild_type, $traegerBildId, 45, 60, 0, 0, 'border="0"', $traegerBildAlt); + ?> + + 'spieler_details', 'vereine' => 'verein_details', 'mannschaften' => 'team_details'][$t->bild_type] ?? ''; + if ($traegerDetailsTask !== '' && !empty($t->bild_id) && $t->aktiv) { + echo '' . htmlentities_utf8($t->name) . ''; + } else { + echo htmlentities_utf8($t->name); + } + ?> + + anzahl; ?> + + jahre); ?> +
+
+ +   + + +

@@ -4239,24 +4716,26 @@ static function halloffameDetails($titel, $beschreibung, $rows, $halloffame): vo echo "

" . htmlentities_utf8($halloffame->halloffame) . "

"; if ($rows != null) { + $nurPlatz1 = !$halloffame->platz2_zeigen && !$halloffame->platz3_zeigen; + $teamspielerZeigen = $halloffame->spielform == 1 && $halloffame->teamspieler_zeigen && ($platzierung === 'inzeilen' || $nurPlatz1); ?>
+ - - platz2_zeigen) continue; - if ($i == 3 && !$halloffame->platz3_zeigen) continue; - ?> - + + + + + + @@ -4267,10 +4746,148 @@ static function halloffameDetails($titel, $beschreibung, $rows, $halloffame): vo $rowclass = "sectiontableentry" . ($k + 1) . $params->get('pageclass_sfx'); $k = ($k + 1) % 2; - if ($halloffame->spielform == 2) { + $plaetzeVorhanden = []; + for ($i = 1; $i <= 3; $i++) { + if ($i == 2 && !$halloffame->platz2_zeigen) continue; + if ($i == 3 && !$halloffame->platz3_zeigen) continue; + if ($halloffame->spielform == 2) { + $spieler1 = "spieler1_" . $i; + $spieler2 = "spieler2_" . $i; + if (empty($row->$spieler1) && empty($row->$spieler2)) continue; + } else { + $txt = ($halloffame->spielform == 1 ? "teamname_" : "spieler1_") . $i; + if (empty($row->$txt)) continue; + } + $plaetzeVorhanden[] = $i; + } + if (empty($plaetzeVorhanden)) $plaetzeVorhanden = [1]; + + $anzahlPlatzZeilen = count($plaetzeVorhanden); + $ersteZeile = true; + + foreach ($plaetzeVorhanden as $i) { + ?> + > + + + + + + + spielform == 2) { + $spieler1_id = "spieler1_id_" . $i; + $spieler1 = "spieler1_" . $i; + $spieler2_id = "spieler2_id_" . $i; + $spieler2 = "spieler2_" . $i; + ?> + + + + + spielform == 1) { + $id = "verein_id_" . $i; + $txt = "teamname_" . $i; + $type = "vereine"; + if ($row->$id == ""){ + $id = "team_id_" . $i; + $type = "mannschaften"; + } + } else { + $id = "spieler1_id_" . $i; + $txt = "spieler1_" . $i; + $type = "spieler"; + } + ?> + + + + + + + + + spielform == 2 && !$halloffame->platz2_zeigen && !$halloffame->platz3_zeigen); + ?> + + + + platz2_zeigen) continue; + if ($i == 3 && !$halloffame->platz3_zeigen) continue; + ?> + + + + + + + + get('pageclass_sfx'); + $k = ($k + 1) % 2; + + if ($halloffame->spielform == 2 && $einspaltigesDoppel) { + ?> + + + + + + + + + + spielform == 2) { ?> - + @@ -4299,17 +4916,17 @@ static function halloffameDetails($titel, $beschreibung, $rows, $halloffame): vo $spieler2 = "spieler2_" . $i; ?> - + @@ -4331,17 +4948,24 @@ static function halloffameDetails($titel, $beschreibung, $rows, $halloffame): vo } ?> + + + + } ?>
- - + +
+ jahr; ?> + + + + $spieler1_id), 45, 60, 0, 0, 'border="0"', halloffameSpielerBildAlternativ($alleSpielerInfo, $row->$spieler1_id, $halloffame->geschaetztes_geschlecht)); ?> + + $spieler1_id, $alleSpielerInfo, $alleVereineInfo, htmlentities_utf8($row->$spieler1)); ?> + + $spieler2_id), 45, 60, 0, 0, 'border="0"', halloffameSpielerBildAlternativ($alleSpielerInfo, $row->$spieler2_id, $halloffame->geschaetztes_geschlecht)); ?> + + $spieler2_id, $alleSpielerInfo, $alleVereineInfo, htmlentities_utf8($row->$spieler2)); ?> + + $id) : $row->$id, 45, 60, 0, 0, 'border="0"', $type === 'spieler' ? halloffameSpielerBildAlternativ($alleSpielerInfo, $row->$id, $halloffame->geschaetztes_geschlecht) : ''); ?> + + $id, $alleSpielerInfo, $alleVereineInfo, htmlentities_utf8($row->$txt)); ?> + + $index_teamspieler)); ?> +
+ + + + + +
+ jahr; ?> + + spieler1_1)) echo bildHTML("spieler", halloffameSpielerBildId($alleSpielerInfo, $row->spieler1_id_1), 45, 60, 0, 0, 'border="0"', halloffameSpielerBildAlternativ($alleSpielerInfo, $row->spieler1_id_1, $halloffame->geschaetztes_geschlecht)); ?> + + spieler1_id_1, $alleSpielerInfo, $alleVereineInfo, htmlentities_utf8($row->spieler1_1)); ?> + + spieler2_1)) echo bildHTML("spieler", halloffameSpielerBildId($alleSpielerInfo, $row->spieler2_id_1), 45, 60, 0, 0, 'border="0"', halloffameSpielerBildAlternativ($alleSpielerInfo, $row->spieler2_id_1, $halloffame->geschaetztes_geschlecht)); ?> + + spieler2_id_1, $alleSpielerInfo, $alleVereineInfo, htmlentities_utf8($row->spieler2_1)); ?> +
jahr; ?> @@ -4283,10 +4900,10 @@ static function halloffameDetails($titel, $beschreibung, $rows, $halloffame): vo $spieler1 = "spieler1_" . $i; ?> - $spieler1_id, 45, 60, 0, 0, 'border="0"'); ?> + $spieler1)) echo bildHTML("spieler", halloffameSpielerBildId($alleSpielerInfo, $row->$spieler1_id), 45, 60, 0, 0, 'border="0"', halloffameSpielerBildAlternativ($alleSpielerInfo, $row->$spieler1_id, $halloffame->geschaetztes_geschlecht)); ?> - $spieler1); ?> + $spieler1_id, $alleSpielerInfo, $alleVereineInfo, htmlentities_utf8($row->$spieler1)); ?>
- $spieler2_id, 45, 60, 0, 0, 'border="0"'); ?> + $spieler2)) echo bildHTML("spieler", halloffameSpielerBildId($alleSpielerInfo, $row->$spieler2_id), 45, 60, 0, 0, 'border="0"', halloffameSpielerBildAlternativ($alleSpielerInfo, $row->$spieler2_id, $halloffame->geschaetztes_geschlecht)); ?> - $spieler2); ?> + $spieler2_id, $alleSpielerInfo, $alleVereineInfo, htmlentities_utf8($row->$spieler2)); ?>
jahr; ?> - $id, 45, 60, 0, 0, 'border="0"'); ?> + $txt)) echo bildHTML($type, $type === 'spieler' ? halloffameSpielerBildId($alleSpielerInfo, $row->$id) : $row->$id, 45, 60, 0, 0, 'border="0"', $type === 'spieler' ? halloffameSpielerBildAlternativ($alleSpielerInfo, $row->$id, $halloffame->geschaetztes_geschlecht) : ''); ?> - $txt); ?> + $id, $alleSpielerInfo, $alleVereineInfo, htmlentities_utf8($row->$txt)); ?> + $index_teamspieler)); ?> +
spielform == 2 && !$halloffame->platz2_zeigen && !$halloffame->platz3_zeigen); ?>
platz2_zeigen) continue; if ($i == 3 && !$halloffame->platz3_zeigen) continue; ?> - @@ -8198,7 +8199,42 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void $rowclass = "sectiontableentry" . ($k + 1) . $params->get('pageclass_sfx'); $k = ($k + 1) % 2; - if ($halloffame->spielform == 2) { + if ($halloffame->spielform == 2 && $einspaltigesDoppel) { + ?> + + + + + + + + + + + + + spielform == 2) { ?> @@ -8310,11 +8346,58 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void static function adminEditHalloffameMitglied($row,$halloffame,$vereine,$spieler,$jahre): void { global $params; + + // Options nur einmal aufbauen (statt bis zu 6x je Formular) - bei grossen Spieler-/Vereinslisten deutlich schneller + $vereineOptionsHtml = ''; + $spielerOptionsHtml = ''; + if ($halloffame->spielform == 1) { + $vereineAktiv = array(); + $vereineInaktiv = array(); + foreach ($vereine as $v) { + if (empty($v->ausgetreten)) + $vereineAktiv[] = $v; + else + $vereineInaktiv[] = $v; + } + $ausgetretenSuffix = " (" . Text::_('COM_SPORTSMANAGER_BEATEN') . ")"; + + $vereineOptionsHtml = ''; + $vereineOptionsHtml .= ''; + foreach ($vereineAktiv as $v) + $vereineOptionsHtml .= ''; + $vereineOptionsHtml .= ''; + $vereineOptionsHtml .= ''; + foreach ($vereineInaktiv as $v) + $vereineOptionsHtml .= ''; + $vereineOptionsHtml .= ''; + } else { + $spielerOptionsHtml = ''; + foreach ($spieler as $s) + $spielerOptionsHtml .= ''; + } ?>
halloffame); ?> :
+ + + + +
@@ -8333,6 +8416,13 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void } ?> +    + spielform == 1){ $index_vereinid = "verein_id_" . $p; $index_team = "teamname_" . $p; + $index_teamspieler = "teamspieler_" . $p; ?> -
+ + + + + - +
+
+ + jahr; ?> + + + spieler1_id_1, 45, 60, 0, 0, 'border="0"'); ?> + + spieler1_1); ?> + + spieler2_id_1, 45, 60, 0, 0, 'border="0"'); ?> + + spieler2_1); ?> + + + + X + + +
+ id="verein_id_" size="1" style="width: 370px;"> +
+ + + +
+ id="player1_id_" size="1" style="width: 370px;"> + spielform == 2){ ?>
+ id="player2_id_" size="1" style="width: 370px;"> + @@ -8418,6 +8511,9 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void + Fehler: Bild spieler-n.png konnte nicht nach /images/sportsmanager/spieler/n.png verschoben werden

'; + return false; + } + } $adapter->getParent()->setRedirectURL('index.php?option=com_sportsmanager'); return true; @@ -674,6 +680,7 @@ return new class () implements InstallerScriptInterface . "\n `telefon` varchar(64) DEFAULT NULL," . "\n `email` varchar(64) DEFAULT NULL," . "\n `ruhetage` varchar(64) DEFAULT NULL," + . "\n `zusatzinfo` text DEFAULT NULL," . "\n `beschreibung` varchar(500) DEFAULT NULL," . "\n `status` tinyint(1) NOT NULL DEFAULT '0'," . "\n PRIMARY KEY (`spielort_id`)" @@ -1251,9 +1258,11 @@ return new class () implements InstallerScriptInterface . "\n `mitglied_halloffame_id` int(11) NOT NULL AUTO_INCREMENT," . "\n `halloffame_id` int(11) NOT NULL," . "\n `jahr` int(4) DEFAULT NULL," + . "\n `nicht_ausgespielt` tinyint(1) NOT NULL DEFAULT '0'," . "\n `platz` int(11) DEFAULT NULL," . "\n `verein_id` int(11) DEFAULT NULL," . "\n `teamname` varchar(64) DEFAULT NULL," + . "\n `teamspieler` text DEFAULT NULL," . "\n `spieler1_id` int(11) DEFAULT NULL," . "\n `spieler1` varchar(64) DEFAULT NULL," . "\n `spieler2_id` int(11) DEFAULT NULL," @@ -1274,7 +1283,7 @@ return new class () implements InstallerScriptInterface $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } - $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'datenbank_version', wert = '120';"; + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'datenbank_version', wert = '121';"; $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); }