Compare commits

..

292 Commits

Author SHA1 Message Date
MarvinF 8764b0a337 Merge pull request #171 from Deutscher-Tischfussballbund/sportsmanager2-stage
stage to prod
2025-09-04 21:13:28 +02:00
MarvinF 07611a0087 Merge pull request #170 from Deutscher-Tischfussballbund/sportsmanager2-dev
dev to stage
2025-09-04 21:11:56 +02:00
MarvinF bc57da1eff Merge pull request #169 from Deutscher-Tischfussballbund/sportsmanager2-issue165
issue #165 gefixt. Tabelle wird falsch gespeichert bei Direkter Vergl…
2025-09-04 21:08:11 +02:00
MarvinF 1c380928f0 Merge branch 'sportsmanager2-dev' into sportsmanager2-issue165 2025-09-04 21:07:37 +02:00
Jürgen Meyer 1ddcfd87db issue #165 gefixt. Tabelle wird falsch gespeichert bei Direkter Vergleich. 2025-09-03 02:51:40 +02:00
Marvin Flock cb1493954f chore: update release date in manifest file on release build 2025-09-02 23:36:20 +02:00
MarvinF 9637f2a92a Merge pull request #168 from Deutscher-Tischfussballbund/sportsmanager2-issue166
issue #166 gefixt (Filter Land in Termine)
2025-09-02 23:21:33 +02:00
MarvinF a977343544 Merge branch 'sportsmanager2-dev' into sportsmanager2-issue166 2025-09-02 23:19:17 +02:00
MarvinF 1f5593d3e8 Merge pull request #167 from Deutscher-Tischfussballbund/sportsmanager2-issue164
Issue #164 - Fehler Export Spielberichte
2025-09-02 23:15:54 +02:00
Jürgen Meyer fff5f97971 issue #166 gefixt (Filter Land in Termine) 2025-09-02 16:01:09 +02:00
Jürgen Meyer 546b9c3af9 Issue #164 - Fehler Export Spielberichte 2025-09-02 13:23:54 +02:00
MarvinF 4ad93a8cf6 Merge pull request #162 from Deutscher-Tischfussballbund/sportsmanager2-stage
stage 2 prod pr
2025-09-02 01:48:44 +02:00
MarvinF 1b5e070026 Merge pull request #161 from Deutscher-Tischfussballbund/sportsmanager2-dev
dev 2 stage pr
2025-09-02 01:47:42 +02:00
MarvinF 114eba3a9c Merge pull request #160 from Deutscher-Tischfussballbund/temp_releasenotes
resize parameters of images are not working
2025-09-02 01:45:51 +02:00
Marvin Flock 9fb592ccbc chore: dummy commit for release notes 2025-09-02 01:44:07 +02:00
MarvinF f76ab18d4b Merge pull request #159 from Deutscher-Tischfussballbund/temp_releasenotes
optimize club details page for mobile
2025-09-02 01:43:08 +02:00
Marvin Flock 02e27d7747 chore: dummy commit for release notes 2025-09-02 01:41:00 +02:00
MarvinF 5375950049 Merge pull request #158 from Deutscher-Tischfussballbund/temp_releasenotes
locations can be reused for event creation
2025-09-02 01:39:52 +02:00
Marvin Flock 050b246fef chore: dummy commit for release notes 2025-09-02 01:38:18 +02:00
MarvinF 55b8cc52c7 Merge pull request #157 from Deutscher-Tischfussballbund/temp_releasenotes
improved the list of clubs with sorting and more configuration options
2025-09-02 01:37:19 +02:00
Marvin Flock aad70e5ab2 chore: dummy commit for release notes 2025-09-02 01:32:45 +02:00
MarvinF 37a98edbad Merge pull request #156 from Deutscher-Tischfussballbund/temp_releasenotes
while generating group games, the second encounter for two teams was ordered the same (home/guest) as the first encounter
2025-09-02 01:28:06 +02:00
Marvin Flock 228f68f90c chore: dummy commit for release notes 2025-09-02 01:22:03 +02:00
MarvinF 4f9df2ce89 Merge pull request #155 from Deutscher-Tischfussballbund/temp_releasenotes
team dropdown while generating group games shows a team twice
2025-09-02 01:20:56 +02:00
Marvin Flock 1a364a4e30 chore: dummy commit for release notes 2025-09-02 01:16:26 +02:00
MarvinF f3bf69c9ca Merge pull request #154 from Deutscher-Tischfussballbund/temp_releasenotes
When using direct comparison, if there are no encounters yet, an error is thrown
2025-09-02 01:13:58 +02:00
Marvin Flock cc81b97569 chore: dummy commit for release notes 2025-09-02 01:09:54 +02:00
MarvinF aaa5aaac1d Merge pull request #153 from Deutscher-Tischfussballbund/temp_releasenotes
Import options improvement: calendar week, matchday title, match number
2025-09-02 01:08:09 +02:00
Marvin Flock f9f9e58881 chore: dummy commit for release notes 2025-09-02 01:04:53 +02:00
MarvinF 671dfb7e8d Merge pull request #145 from Deutscher-Tischfussballbund/sportsmanager2-issue052
Änderungen für issue #52, issue #131 und issue #143
2025-09-02 00:23:13 +02:00
Marvin Flock 3ae15e2e70 Merge branch 'sportsmanager2-dev' into sportsmanager2-issue052
# Conflicts:
#	src/structure/components/com_sportsmanager/admin.php
#	src/structure/components/com_sportsmanager/database/update.php
#	src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php
#	src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php
#	src/structure/language/de-DE/de-DE.com_sportsmanager.ini
#	src/structure/language/en-GB/en-GB.com_sportsmanager.ini
#	src/structure/script.php
2025-09-02 00:21:11 +02:00
MarvinF ee0c19efe3 Merge pull request #147 from Deutscher-Tischfussballbund/sportsmanager2-issue125
Änderungen für issue #125, issue #116 und issue #117
2025-09-02 00:06:41 +02:00
MarvinF 87c9ec82fd Merge branch 'sportsmanager2-dev' into sportsmanager2-issue125 2025-09-02 00:06:05 +02:00
Jürgen Meyer 71d8460cd6 Entscheidung ob Verband angezeigt wird liegt allein bei Web Admin. 2025-09-01 20:56:57 +02:00
Jürgen Meyer d97713e73d Fehler bei Erstellung Spieleplen mit 4 Mannschaften mit Setzliste behoben. 2025-09-01 20:34:14 +02:00
Marvin Flock b16638ed47 fix: code review changes 2025-09-01 18:02:20 +02:00
MarvinF b511badad2 Merge pull request #144 from Deutscher-Tischfussballbund/fix/bayern-missing-argument
missing parameter in player details with ELO runs into error
2025-08-30 13:18:19 +02:00
Jürgen Meyer 42ff1155f3 Probleme mit Sonderzeichen in Turnierbaum gefixt. 2025-08-29 16:28:06 +02:00
Jürgen Meyer 17a9bfdd2e issue #151 2025-08-29 12:00:08 +02:00
Jürgen Meyer 3aa20036dc Issue #152 Heimrechtwechsel in Rückrunde 2025-08-29 11:22:13 +02:00
Jürgen Meyer fc1ce3bdd6 Alle offenen Mängel beseitigt. 2025-08-29 10:34:31 +02:00
Marvin Flock cf52c718e8 chore: some review fixes 2025-08-28 22:24:13 +02:00
Marvin Flock 8b29c8eba6 chore: some review fixes 2025-08-28 22:19:11 +02:00
Marvin Flock e9460ef8cc Merge branch 'sportsmanager2-dev' into sportsmanager2-issue052
# Conflicts:
#	src/structure/components/com_sportsmanager/admin.php
#	src/structure/components/com_sportsmanager/sportsmanager.php
#	src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php
2025-08-28 21:58:43 +02:00
Marvin Flock 3ac38abb92 chore: some review fixes 2025-08-28 21:42:52 +02:00
Marvin Flock 19ff8ebd08 chore: some review fixes 2025-08-28 21:20:20 +02:00
Marvin Flock 3ab2ae9206 chore: some review fixes 2025-08-28 21:18:23 +02:00
Marvin Flock 4820f82253 chore: some review fixes 2025-08-28 21:16:34 +02:00
Marvin Flock 0a06321a72 chore: remove unused style tag 2025-08-28 20:31:42 +02:00
Marvin Flock 60232d95b3 chore: remove empty class attributes, fix label for input 2025-08-28 20:18:52 +02:00
Marvin Flock f27b87a0d8 chore: add return types to methods 2025-08-28 20:01:58 +02:00
Jürgen Meyer bc6c44e82a Eingeschränkte Spieler erscheinen jetzt auch in Vereinsdetails. 2025-08-27 06:41:25 +02:00
Jürgen Meyer 01ac642de5 Passive Vereinsmitglieder werden in Vereinsdetails nicht mehr angezeigt. 2025-08-26 06:27:43 +02:00
Jürgen Meyer 825a072ace Änderungen zu issue #149 (Resize in yoothemeBild) 2025-08-19 10:07:12 +02:00
Jürgen Meyer 1aa9b924d7 Noch ein paar kleine Änderungen 2025-08-17 18:11:46 +02:00
Jürgen Meyer 4a96d9f0a9 Fehler in script.php und update.php behoben 2025-08-16 18:05:35 +02:00
Jürgen Meyer 7a59020e64 Änderungen für issue #125, issue #116 und issue #117 2025-08-16 17:48:14 +02:00
Jürgen Meyer 3f816235c8 Änderungen für issue #52, issue #131 und issue #143 2025-08-15 13:54:04 +02:00
Marvin Flock 4f264ed72d fix: add previously deleted parameter back into sprintf again with reference to $spieler 2025-08-14 22:34:33 +02:00
MarvinF a6f302cb63 Merge pull request #142 from Deutscher-Tischfussballbund/chore/automatic-version-update-in-manifest-xml
chore: update manifest xml sportsmanager version with pipeline
2025-08-12 20:44:48 +02:00
Marvin Flock 22c50e688a chore: update manifest xml sportsmanager version with pipeline 2025-08-12 01:44:13 +02:00
MarvinF fbd7e05abb Merge pull request #141 from Deutscher-Tischfussballbund/chore/add-release-process-to-readme
chore: update readme with more details to release process
2025-08-12 01:18:15 +02:00
MarvinF a36edeedca Merge branch 'sportsmanager2-dev' into chore/add-release-process-to-readme 2025-08-12 01:17:56 +02:00
Marvin Flock ea9fd038f3 chore: update readme with more details to release process 2025-08-12 01:17:00 +02:00
MarvinF e55d925034 Merge pull request #140 from Deutscher-Tischfussballbund/chore/add-release-process-to-readme
chore: add release process to readme
2025-08-12 01:14:05 +02:00
Marvin Flock 48d0bca1c6 chore: add release process to readme 2025-08-12 01:12:57 +02:00
MarvinF ba9c84dfe7 Merge pull request #139 from Deutscher-Tischfussballbund/sportsmanager2-stage
stage to prod merge
2025-08-12 00:31:56 +02:00
MarvinF f424dfe024 Merge pull request #138 from Deutscher-Tischfussballbund/sportsmanager2-dev
dev to stage merge
2025-08-12 00:31:06 +02:00
MarvinF f382c3a208 Merge pull request #137 from Deutscher-Tischfussballbund/chore/version
chore: read correct tag version
2025-08-12 00:30:13 +02:00
Marvin Flock 2d7fb27ee1 chore: read correct tag version 2025-08-12 00:03:51 +02:00
MarvinF 93769df3ac Merge pull request #136 from Deutscher-Tischfussballbund/sportsmanager2-stage
Sportsmanager2 stage
2025-08-11 23:55:48 +02:00
MarvinF ee6d559a7f Merge pull request #135 from Deutscher-Tischfussballbund/sportsmanager2-dev
dev to stage merge
2025-08-11 23:54:51 +02:00
MarvinF 6e9b2c4f5e Merge pull request #134 from Deutscher-Tischfussballbund/chore/version
chore: debug tag versions
2025-08-11 23:53:51 +02:00
Marvin Flock f713362c3e chore: debug tag versions 2025-08-11 23:51:45 +02:00
MarvinF 71dd59c3d8 Merge pull request #133 from Deutscher-Tischfussballbund/sportsmanager2-stage
stage to prod merge
2025-08-11 23:23:53 +02:00
MarvinF 9594ec84e2 Merge pull request #132 from Deutscher-Tischfussballbund/sportsmanager2-dev
dev to stage merge
2025-08-11 23:22:20 +02:00
MarvinF 79adb9efd2 Merge pull request #123 from Deutscher-Tischfussballbund/sportsmanager2-issue121
Sportsmanager2 issue121
2025-08-11 23:16:22 +02:00
MarvinF 7d7f162dde Merge branch 'sportsmanager2-dev' into sportsmanager2-issue121 2025-08-11 23:14:29 +02:00
MarvinF 1538738722 Merge pull request #124 from Deutscher-Tischfussballbund/feature/issue-85-query-performance-improv
Refactor: remove execute() on reading queries
2025-08-11 23:11:44 +02:00
Jürgen Meyer eb4bcf38d9 Änderungen nach review 2025-08-11 18:31:07 +02:00
Marvin Flock 0d8e61b3ca Merge branch 'sportsmanager2-dev' into feature/issue-85-query-performance-improv
# Conflicts:
#	src/structure/components/com_sportsmanager/admin.php
#	src/structure/components/com_sportsmanager/sportsmanager.php
2025-08-11 18:30:06 +02:00
MarvinF 3f26a340dc Merge pull request #112 from Deutscher-Tischfussballbund/fix/issue-6-sql-syntax-error
Issue 6: fix sql syntax error
2025-08-11 17:59:14 +02:00
MarvinF 87d9449417 Merge branch 'sportsmanager2-dev' into fix/issue-6-sql-syntax-error 2025-08-11 17:58:53 +02:00
MarvinF e0575dc125 Merge pull request #113 from Deutscher-Tischfussballbund/sportsmanager2-issue059
Sportsmanager2 issue059
2025-08-11 17:58:26 +02:00
MarvinF b1f67d1d13 Merge pull request #127 from Deutscher-Tischfussballbund/chore/version-from-tags
chore: create version in sportsmanager from git tag
2025-08-11 17:43:27 +02:00
Marvin Flock f119cae584 chore: restore breaks in switch statement 2025-08-11 00:19:43 +02:00
jmeyer26 18d346a4e9 Merge pull request #115 from Deutscher-Tischfussballbund/sportsmanager2-issue068
Sportsmanager2 issue068
2025-08-05 21:39:20 +02:00
Marvin Flock e81600dd86 Merge branch 'sportsmanager2-dev' into sportsmanager2-issue068 2025-08-05 21:30:57 +02:00
Marvin Flock ff7314cf3f chore: create version in sportsmanager from git tag 2025-08-05 21:21:11 +02:00
Jürgen Meyer 1fe9d4bc5f Änderung nach Review durchgeführt. 2025-08-05 20:45:33 +02:00
Marvin Flock 5e3996dd5e fix: add missing line breaks 2025-08-04 18:21:47 +02:00
Marvin Flock 9861f59662 refactor: remove execute() on reading queries 2025-08-04 00:00:42 +02:00
Jürgen Meyer 9f6c026b2b Verschachtelte Tabelle entfernt. Redundante if-Anweisungen entfernt. 2025-08-01 19:34:53 +02:00
Jürgen Meyer 850fd2c079 Einige Optimierungen durchgeführt. 2025-08-01 16:02:32 +02:00
MarvinF 762bf50f62 Merge pull request #111 from Deutscher-Tischfussballbund/fix/issue45-duplicate-license-on-ranking-duplication
Fix: duplicate Ranglisten should also duplicate license checkbox values of the duplicate source rangliste
2025-08-01 01:31:39 +02:00
MarvinF 19fc2c8800 Merge branch 'sportsmanager2-dev' into fix/issue45-duplicate-license-on-ranking-duplication 2025-08-01 01:30:28 +02:00
MarvinF be1b66eb8e Merge pull request #122 from Deutscher-Tischfussballbund/fix/explode-lizenzen
Fix: refresh rankings even when there are no licenses set
2025-07-31 17:05:32 +02:00
Marvin Flock cf14997acb fix: explode of licenses only if licenses are given 2025-07-31 16:59:12 +02:00
Jürgen Meyer 0d3e54a544 Mannschaftsdetails und Spielerdetails für Mobil angepasst 2025-07-31 12:01:52 +02:00
MarvinF 7b1cc50943 Merge pull request #120 from Deutscher-Tischfussballbund/sportsmanager2-stage
Stage -> Prod merge
2025-07-29 18:30:28 +02:00
MarvinF 133a983685 Merge pull request #119 from Deutscher-Tischfussballbund/sportsmanager2-dev
Dev -> Stage merge
2025-07-29 18:28:39 +02:00
MarvinF 20b956b239 Merge pull request #118 from Deutscher-Tischfussballbund/feature/refactor-readme
refactor: remove test from readme
2025-07-29 18:21:05 +02:00
Marvin Flock fedb300d8f refactor: remove test from readme 2025-07-29 18:19:01 +02:00
MarvinF 07121c2233 Merge pull request #114 from Deutscher-Tischfussballbund/fix/issue-108-yootheme-path-fix
fix: add base url to yootheme images
2025-07-29 18:01:16 +02:00
MarvinF 8dab7fa74f Merge branch 'sportsmanager2-dev' into fix/issue-108-yootheme-path-fix 2025-07-29 17:59:55 +02:00
Jürgen Meyer 3e577f6be1 Kein Aufruf Korrekturschleife, wenn kein Array Korrektur vorhanden. 2025-07-24 16:29:13 +02:00
Jürgen Meyer 2b6563dae0 Möglichkeit Direkter Vergleich in Teamsport (issue #68) 2025-07-23 09:40:05 +02:00
jmeyer26 1bd53893a8 Merge pull request #83 from Deutscher-Tischfussballbund/sportsmanager2-juergen
Fix: #74 Player picture improvements & remove 'Ranglisten' YooTheme Lazyloading optimizations
2025-07-22 05:49:22 +02:00
Jürgen Meyer acfcbb1010 Funktion yoothemeBild in rangliste wird wieder aufgerufen. 2025-07-22 05:46:23 +02:00
Marvin Flock a6aee26211 fix: add base url to yootheme images 2025-07-21 20:17:20 +02:00
MarvinF b24203ccb9 Merge pull request #109 from Deutscher-Tischfussballbund/sportsmanager2-issue108
Mannschaftsbilder in Teamsport zu klein gefixt (issue #108)
2025-07-21 19:43:44 +02:00
Jürgen Meyer 2ff39cf086 Fehler Versatz Header Tabelle wenn Bilder fehlen gefixt. 2025-07-16 10:34:40 +02:00
Jürgen Meyer 8479691824 Optimierung Ablöschung temporärer Import-Daten 2025-07-14 17:01:21 +02:00
Jürgen Meyer ca4ce6060e Überprüfung Format Spielernummer bei Import (issue #59) 2025-07-14 08:23:34 +02:00
Jürgen Meyer 0729291afc Fehler Anführungszeichen korrigiert. 2025-07-13 23:34:51 +02:00
Marvin Flock b57c7c148d fix: abort when id is null 2025-07-13 23:17:00 +02:00
Marvin Flock b17fcffdd5 fix: replace http:// with https:// 2025-07-13 22:06:50 +02:00
Marvin Flock 97c6d9ee03 fix: duplicate licence fields when duplicating ranking 2025-07-13 21:37:28 +02:00
Jürgen Meyer f3c2040632 Mannschaftsbilder in Teamsport zu klein gefixt (issue #108) 2025-07-02 08:19:44 +02:00
Jürgen Meyer 1235edde82 Letzte Änderung wegen Konflikten rückgängig gemacht. 2025-07-01 12:37:41 +02:00
Jürgen Meyer 763fd7d386 Tabellenformatierung angepasst (issue #108) 2025-07-01 12:31:03 +02:00
MarvinF 77e2c6e910 Merge pull request #77 from Deutscher-Tischfussballbund/issues/43
fix: #43 - remove css3.js reference
2025-06-30 18:57:43 +02:00
MarvinF a2aee3b135 Merge pull request #82 from Deutscher-Tischfussballbund/issues/73_missing-dropdown-in-league
fix: add season dropdown to events, even if there is just one event
2025-06-30 18:57:10 +02:00
MarvinF 9a7f8acc3b Merge pull request #107 from Deutscher-Tischfussballbund/fix/64_division_by_zero
Fix: add division by zero check, return zero instead of exception
2025-06-30 18:55:47 +02:00
Jürgen Meyer 9091b22859 Konfilkt mit README.md 2025-06-30 00:52:54 +02:00
Jürgen Meyer 839b27756a Konflikt mit README.md 2025-06-30 00:50:03 +02:00
Jürgen Meyer 0d0ee08199 Weitere Optimierungen der Tabellen Rangliste, Turnierergebnisse und Spielerstatistik 2025-06-30 00:16:05 +02:00
Jürgen Meyer 6609a4ca78 Änderungen nach Kommentaren in PR83 überarbeitet. 2025-06-29 19:00:59 +02:00
Marvin Flock 4ecf48d02e fix: add division by zero check, return zero instead of exception 2025-06-29 16:44:18 +02:00
MarvinF 40633f864a Merge pull request #106 from Deutscher-Tischfussballbund/sportsmanager2-stage
stage to prod pr
2025-06-25 17:23:09 +02:00
MarvinF 8e6aa127c6 Merge pull request #105 from Deutscher-Tischfussballbund/sportsmanager2-dev
dev to stage pr
2025-06-25 17:21:52 +02:00
MarvinF 9289843cb1 Update README.md 2025-06-25 17:19:33 +02:00
MarvinF 7a70500175 Merge pull request #76 from Deutscher-Tischfussballbund/php-debugging
feat: add debugging for php in docker
2025-06-25 17:14:02 +02:00
MarvinF 31b8e5251e Update release-drafter_extension.yml 2025-06-25 01:22:57 +02:00
MarvinF 455f845ab0 Update build_release.yml 2025-06-25 01:21:52 +02:00
MarvinF f55d89827a Merge pull request #103 from Deutscher-Tischfussballbund/sportsmanager2-stage
stage to prod pr
2025-06-25 01:00:10 +02:00
MarvinF 874e06e061 Merge pull request #102 from Deutscher-Tischfussballbund/sportsmanager2-dev
dev to stage pr
2025-06-25 00:59:11 +02:00
MarvinF 83b8e1c25f Create release-drafter_github.yml 2025-06-25 00:52:06 +02:00
MarvinF 3c9fac7e1a Rename release-drafter.yml to release-drafter_extension.yml 2025-06-25 00:50:45 +02:00
MarvinF 4ec02e5f02 Update build_release.yml 2025-06-25 00:49:57 +02:00
MarvinF 4d1573729d Merge pull request #101 from Deutscher-Tischfussballbund/sportsmanager2-stage
stage to prod PR
2025-06-25 00:36:39 +02:00
MarvinF 6da371569a Merge pull request #100 from Deutscher-Tischfussballbund/sportsmanager2-dev
Dev to Stage PR
2025-06-25 00:35:48 +02:00
MarvinF fdede4a4a7 Delete .github/release-drafter_github.yml 2025-06-25 00:31:36 +02:00
MarvinF 7ced30cf5b Rename release-drafter_extension.yml to release-drafter.yml 2025-06-25 00:31:08 +02:00
MarvinF 934b5b4971 Update build_release.yml 2025-06-25 00:30:35 +02:00
MarvinF 085e5a8aeb Merge pull request #99 from Deutscher-Tischfussballbund/sportsmanager2-stage
Stage to Prod PR
2025-06-24 23:29:31 +02:00
MarvinF 53ada7c6b0 Merge pull request #98 from Deutscher-Tischfussballbund/sportsmanager2-dev
Dev to Stage PR
2025-06-24 23:28:19 +02:00
MarvinF 29dbfaeea4 Update build_release.yml 2025-06-24 23:25:58 +02:00
MarvinF 95e02435fd Merge pull request #97 from Deutscher-Tischfussballbund/sportsmanager2-stage
Stage to Prod PR
2025-06-24 23:06:32 +02:00
MarvinF 32eacde07d Merge pull request #96 from Deutscher-Tischfussballbund/sportsmanager2-dev
Dev to Stage PR
2025-06-24 23:05:43 +02:00
MarvinF 2b19aee00f Update release-drafter_extension.yml 2025-06-24 23:04:06 +02:00
MarvinF 8b6ad5103c Update release-drafter_github.yml 2025-06-24 23:03:51 +02:00
MarvinF 743f2b4013 Update release-drafter_github.yml 2025-06-24 22:53:45 +02:00
MarvinF 2d2a124239 Update release-drafter_extension.yml 2025-06-24 22:53:23 +02:00
MarvinF d1e0dec74a Update autolabel.yaml 2025-06-24 22:52:56 +02:00
MarvinF c4c3ea88fc Merge pull request #95 from Deutscher-Tischfussballbund/sportsmanager2-stage
Stage to Prod PR
2025-06-24 22:42:28 +02:00
MarvinF 761e04b6f2 Merge pull request #94 from Deutscher-Tischfussballbund/sportsmanager2-dev
Dev to Stage PR
2025-06-24 22:41:27 +02:00
MarvinF 089796d201 Create autolabel.yaml 2025-06-24 22:37:05 +02:00
MarvinF e2b6f48498 Update release-drafter_github.yml 2025-06-24 22:33:49 +02:00
MarvinF 3422813152 Update release-drafter_github.yml 2025-06-24 22:32:31 +02:00
MarvinF 67b46f121a Update release-drafter_extension.yml 2025-06-24 22:31:47 +02:00
MarvinF 6c3c9badfd Create release-drafter_github.yml 2025-06-24 22:06:27 +02:00
MarvinF e05d107af3 Rename release-drafter.yml to release-drafter_extension.yml 2025-06-24 22:05:51 +02:00
MarvinF 2f94c29c7e Update build_release.yml 2025-06-24 22:05:24 +02:00
MarvinF b656cb5df3 Merge pull request #93 from Deutscher-Tischfussballbund/sportsmanager2-stage
Stage to prod PR
2025-06-24 21:49:28 +02:00
MarvinF af97c59960 Merge pull request #92 from Deutscher-Tischfussballbund/sportsmanager2-dev
Dev to Stage PR
2025-06-24 21:48:48 +02:00
MarvinF ebb3580fad Update build_release.yml 2025-06-24 21:47:56 +02:00
MarvinF 4a313d5914 Merge pull request #91 from Deutscher-Tischfussballbund/sportsmanager2-stage
Stage to prod PR
2025-06-24 21:23:42 +02:00
MarvinF 771856b842 Merge pull request #90 from Deutscher-Tischfussballbund/sportsmanager2-dev
Dev to Stage PR
2025-06-24 21:22:59 +02:00
MarvinF 0c4d0820d1 Update build_release.yml 2025-06-24 21:22:00 +02:00
MarvinF 8a0ad8d8e9 Merge pull request #89 from Deutscher-Tischfussballbund/sportsmanager2-stage
Stage 2 Prod PR
2025-06-24 21:06:54 +02:00
MarvinF 03a448f4cc Merge pull request #88 from Deutscher-Tischfussballbund/sportsmanager2-dev
stage PR
2025-06-24 21:05:39 +02:00
MarvinF 9d75619c2c Update release-drafter.yml 2025-06-24 20:28:20 +02:00
MarvinF a1890c51c0 feat: add release notes to extension installation 2025-06-24 20:20:28 +02:00
Marvin Flock 51ee656f66 feat: add release notes to extension installation 2025-06-24 20:16:51 +02:00
MarvinF 6d9df0e769 Create release-drafter.yml 2025-06-24 20:11:53 +02:00
MarvinF a74bcb0ee8 Update build_release.yml 2025-06-24 20:10:53 +02:00
MarvinF 6399eab0af Update build_release.yml 2025-06-24 19:33:06 +02:00
MarvinF 9cde84a1d0 Update build_snapshot.yml 2025-06-24 19:32:50 +02:00
MarvinF 76738ec307 Update build_snapshot.yml 2025-06-24 19:30:36 +02:00
MarvinF 59e1a4571b Create prod release pipeline 2025-06-24 19:29:17 +02:00
Tim 7952c95217 Merge branch 'sportsmanager2-dev' into php-debugging 2025-06-24 18:58:07 +02:00
Jürgen Meyer 56d8be9a55 Hilfskommentare in Programm zu issue #74 rausgelöscht. 2025-06-24 13:52:32 +02:00
Jürgen Meyer 29f0e6842b issue #74 Player image size (Details siehe issue #74) 2025-06-24 13:29:20 +02:00
Marvin Flock 22e96bf49d fix: add season dropdown to events, even if there is just one event 2025-06-23 21:12:43 +02:00
MarvinF 1e4e34ef71 Merge pull request #65 from Deutscher-Tischfussballbund/tfvb_league_admin_infos
Tfvb league admin infos
2025-06-22 21:27:50 +02:00
DTFB-PaulF d98f7da7b9 Merge pull request #78 from Deutscher-Tischfussballbund/feature-test-paul-jürgen
Test2
2025-06-19 19:24:28 +02:00
Jürgen Meyer 94e768ef51 Test2 2025-06-19 19:19:21 +02:00
Marvin Flock 36dbfdb7c4 fix: check for null since str_starts_with is typed 2025-06-17 22:01:07 +02:00
Marvin Flock 5cfd8f3c1a fix: remove non existent css reference 2025-06-17 22:00:08 +02:00
Marvin Flock 1d7369e456 Merge branch 'sportsmanager2-stage' into sportsmanager2-dev 2025-06-17 21:36:16 +02:00
Marvin Flock de467c0d4a feat: add debugging for php in docker 2025-06-17 21:29:15 +02:00
Tim 0225e49beb Updated/added envs in README.md
Updated/added environments
2025-06-17 00:08:32 +02:00
Jürgen Meyer e1ecec502b Überarbeitung Startseite: 2025-06-15 16:22:58 +02:00
Jürgen Meyer 000731a289 In Kategorieliste Verbandsorgane hinzugefügt. 2025-06-13 11:40:01 +02:00
Wieland Hagen 385bef0752 Admin League Team View: add tooltip 2025-06-12 17:55:05 +02:00
Jürgen Meyer 902ae55a9a Formular Veranstaltung übersichtlicher gestaltet 2025-06-12 17:04:20 +02:00
Jürgen Meyer feb08ff903 Falsche Versionsnr in script.php. Style von Formular Export Spielberichte optimiert. 2025-06-12 10:50:57 +02:00
Jürgen Meyer a922b11b6d Korrektur der Farben in Formular Gruppenspiele erzeugen (issue #71) 2025-06-11 14:52:22 +02:00
Marvin Flock 254d556899 Merge branch 'dev' into sportsmanager2-dev 2025-06-10 17:41:28 +02:00
MarvinF 6793c53002 Update build_snapshot.yml 2025-06-09 16:58:45 +02:00
MarvinF 984156ca95 Update build_snapshot.yml 2025-06-09 16:48:13 +02:00
MarvinF 8b671fd005 Update build_snapshot.yml 2025-06-09 16:44:51 +02:00
MarvinF 37ad8dd24c Create build_snapshot.yml 2025-06-09 16:44:50 +02:00
MarvinF 6ae7388a44 Update build_snapshot.yml 2025-06-09 16:40:49 +02:00
MarvinF 4f78e31277 Create build_snapshot.yml 2025-06-09 16:40:12 +02:00
Marvin Flock 35f128d949 change: update Readme for deployment trigger 2025-06-04 17:38:46 +02:00
Marvin Flock 825e643959 change: update Readme for deployment trigger 2025-06-02 23:36:49 +02:00
Helmut Poppen eb6b81b3dd Changed DisplayController from UTF8-BOM to UTF8 2025-05-20 10:34:30 +02:00
Marvin Flock 8638311065 fix: send mails only when at least one email address is given 2025-05-13 22:55:45 +02:00
Marvin Flock 67c91c65ab chore: deployment hook test 2025-05-13 20:04:26 +02:00
Marvin Flock 365e7f00fd fix: put namespaces as first line after php opening tag 2025-05-13 19:50:01 +02:00
Marvin Flock d54e248d02 fix: put namespaces as first line after php opening tag 2025-05-13 19:45:38 +02:00
Helmut Poppen ec54893106 Deployment Hook Test 2025-05-13 11:14:51 +02:00
Helmut Poppen fe7c45a635 Deployment Hook Test 2025-05-13 11:12:27 +02:00
Wieland Hagen 2dddfa473a Admin League Games View: display "+0d" for 0 day shifts, fix SQL query 2025-05-11 21:26:22 +02:00
DTFB-PaulF c59728c5a8 Merge pull request #67 from Deutscher-Tischfussballbund/bug/propose_date_not_working
fix: change reading of value fields by using brackets
2025-05-07 09:40:02 +02:00
Marvin Flock 8f3c1bcef9 fix: change reading of value fields by using brackets 2025-05-06 22:02:44 +02:00
MarvinF 45558f3228 Merge pull request #66 from Deutscher-Tischfussballbund/bug/mail_duplication
mail duplication
2025-05-05 22:47:19 +02:00
Marvin Flock a1ae678f6d fix: replace sendMail loop with bcc loop in order to send one mail instead of way too many 2025-05-04 22:38:33 +02:00
Wieland Hagen 82c0f3a58b Admin League Games View: show various additional information
- mark teams which have requested a game shift
- display amount of time that a game has been shifted
- display time that has passed between game and result proposal, and result proposal and result validation
- mark games with incomplete player data
2025-05-04 21:04:36 +02:00
Wieland Hagen a6fe497cad Admin League Team View: show number of shifts that each team is responsible for 2025-05-04 20:59:06 +02:00
Marvin Flock e3283af13f fix: change line order for <br> to only appear when actual url is filled 2025-05-03 17:09:19 +02:00
Jürgen Meyer e205382f52 Eingabeformular Spielbericht optimiert 2025-04-30 16:49:31 +02:00
Jürgen Meyer a235ee9abc Bugfixes: Groesse Passbild Spieler 2, Kategorien ueber 30 2025-04-29 15:41:40 +02:00
Jürgen Meyer 6a4748e4d6 Dropdownliste Liga erweitert und Bugs bei Export gefixt. 2025-04-29 08:42:32 +02:00
Marvin Flock a32cbdcb35 chore: change bind mounts to named volumes to increase performance significantly 2025-04-25 00:48:18 +02:00
Marvin Flock 5c026641c7 fix: use UserFactoryInterface and align input 2025-04-24 20:15:31 +02:00
Marvin Flock 43ebed6b39 fix: use correct dependency injection for json to work 2025-04-23 20:31:09 +02:00
Marvin Flock c7e9f664e2 fix: remove ignore flag from adding licence fields, implement proper check for fields 2025-04-23 17:48:42 +02:00
Marvin Flock 10032fd6a9 fix: add ignore to license db fields, if already existing ignore errors 2025-04-23 16:38:43 +02:00
Marvin Flock ddec58e302 fix: resolve merge conflicts 2025-04-23 12:32:31 +02:00
Marvin Flock 047e6c46af fix: remove duplicated styling 2025-04-22 20:21:40 +02:00
Marvin Flock 9f215b9dfa fix: use correct mailer interface for sending mails 2025-04-22 19:50:34 +02:00
Marvin Flock cc2a411480 chore: remove unused imports 2025-04-22 19:24:09 +02:00
Marvin Flock c246328540 fix: revert removal of distribution methods 2025-04-22 19:16:56 +02:00
Marvin Flock 021283fe7e fix: folder and file handling by using native php methods 2025-04-22 17:39:15 +02:00
Marvin Flock bf25471571 fix: start image url with slash 2025-04-22 17:04:44 +02:00
Marvin Flock 8d50de12d7 chore: update copyright text 2025-04-22 16:46:55 +02:00
Marvin Flock dbdf7be51a fix: resolve merge conflicts of joomla_6 branch 2025-04-21 22:07:45 +02:00
MarvinF d5eee17e8f Merge pull request #55 from Deutscher-Tischfussballbund/mimetypes
fix: add more mimetypes
2025-04-21 18:05:53 +02:00
MarvinF 82a7bbe63c Merge pull request #60 from Deutscher-Tischfussballbund/birthdate_validation
Birthdate validation
2025-04-21 18:05:07 +02:00
MarvinF 7435db170c Merge pull request #63 from Deutscher-Tischfussballbund/bug/login-error
Fix Login Error
2025-04-21 17:56:57 +02:00
Jürgen Meyer fe453a8454 Export Funktion für Spielberichte, Spieler in Teams und Spielplan 2025-04-19 12:30:40 +02:00
arnef fc37696779 fix query limit method to use setLimit() 2025-04-17 21:53:27 +02:00
Marvin Flock d0ada72b68 fix: remove birthday from player, replace with birthyear where necessary 2025-04-17 20:02:02 +02:00
Jürgen Meyer e3167e7175 Termine kopieren.
Fehler beim Logging Termin löschen gefixt.
2025-04-17 10:34:02 +02:00
Jürgen Meyer 541a20c694 Termine Relative Links auch in E-Mail Versand Änderung 2025-04-16 17:52:07 +02:00
Jürgen Meyer 5d3f26dfee In Termine Ergebnisse auch als relativer Link möglich 2025-04-16 13:04:49 +02:00
Marvin Flock c59a0be5ec feat: enable logging into own log file com_sportsmanager.php 2025-04-09 15:59:16 +02:00
Marvin Flock fea9f4089c fix: remove tick 2025-04-09 15:48:31 +02:00
Marvin Flock cac8f33aa7 fix: add more specific error message to no access method 2025-04-09 15:38:21 +02:00
Marvin Flock 543aceaeab fix: remove initial validation
feat:  remove birthday and birthmonth
2025-04-02 19:22:27 +02:00
Marvin Flock 1d2e3bb52f feat: add required to firstname and lastname player fields 2025-04-02 19:21:18 +02:00
Helmut Poppen 98f8b5904c Webhook Test 2025-03-31 20:31:13 +02:00
Helmut Poppen cfdbeb7ecb Webhook Test 2025-03-31 19:50:31 +02:00
Helmut Poppen 57fcd04ff7 Webhook Test 2025-03-31 19:42:56 +02:00
Helmut Poppen 993490e4bf Webhook Test 2025-03-31 19:39:58 +02:00
Helmut Poppen 448fbfd19a Webhook Test 2025-03-31 19:36:34 +02:00
Jürgen Meyer 9e1df7c03d Merge branch 'sportsmanager-2-stfv' of github.com:Deutscher-Tischfussballbund/com_sportsmanager into sportsmanager-2-stfv 2025-03-31 18:12:30 +02:00
Helmut Poppen d06a4b433a Test Webhook 2 2025-03-31 17:15:38 +02:00
Helmut Poppen 16bc0d3188 Test Webhook 2025-03-31 17:12:51 +02:00
Jürgen Meyer 65152e51d3 Doppel 7 und 8 für Dropdown Mannschaftsspielpläne hinzugefügt. 2025-03-31 09:58:53 +02:00
Marvin Flock a589ca8337 fix: remove duplicate language keys, change some of the language keys 2025-03-28 20:55:41 +01:00
Marvin Flock 067e67e08b chore: outsource more image methods into own file 2025-03-28 14:32:53 +01:00
Marvin Flock 0f4a3242b1 fix: add labels, init variables, replace deprecated joomla 3 classes, add return types, removed commented code, removed unused parameters 2025-03-28 14:31:33 +01:00
Marvin Flock 1af673df17 chore: update readme 2025-03-28 14:24:29 +01:00
Marvin Flock 31a3eeef12 chore: replace database.php by splitting into init and update 2025-03-28 14:24:02 +01:00
Marvin Flock 4ca16747af chore: update project structure with basic mvc approach 2025-03-28 14:23:12 +01:00
Marvin Flock 563e0e6294 chore: Update copyright 2025-03-18 20:35:00 +01:00
Marvin Flock 5d85be8937 fix: implement some minor fixes 2025-03-18 20:34:09 +01:00
Marvin Flock 1eed53ae9c fix: add missing php ini to docker compose 2025-03-18 20:29:33 +01:00
Marvin Flock fcc6c7e538 feat: add birthday validation 2025-03-18 20:29:05 +01:00
Marvin Flock eeb423fcbc chore: remove variable assignment in if statements 2025-03-18 20:27:40 +01:00
MarvinF 0c9a94a07f Merge pull request #56 from Deutscher-Tischfussballbund/license_fixes
fix: minor fixes regarding licenses including database fields for license
2025-03-18 12:57:08 +01:00
Helmut Poppen 9e730ad179 First version of match import 2025-03-17 22:14:37 +01:00
Marvin Flock 4ba20a793d Merge branch 'sportsmanager2' into license_fixes
# Conflicts:
#	src/structure/script.php
2025-03-12 17:37:29 +01:00
Marvin Flock e725f0fcea fix: add missing license fields to install.php, change order of fields 2025-03-12 17:29:22 +01:00
MarvinF e8af5349e6 Merge pull request #57 from Deutscher-Tischfussballbund/testsetup_fixes
test setup fixes
2025-03-12 14:08:47 +01:00
Marvin Flock 870b15d947 chore: update meta data 2025-03-12 13:24:56 +01:00
Marvin Flock eb751f28fc chore: add test setup to readme 2025-03-11 21:16:07 +01:00
Marvin Flock 0d59ed7003 fix: change pathes of kickboilerplate to sportsmanager to allow builds again 2025-03-11 21:15:44 +01:00
Marvin Flock 57048d3a3f chore: update sportsmanager.xml 2025-03-11 21:14:49 +01:00
Marvin Flock 6645678ed2 fix: outsource bildKopierenAngepasst method to be reused from within script.php
chore: move and rename install.php to root path and rename to script.php
2025-03-11 21:11:22 +01:00
Marvin Flock 621f7d3d64 fix: update docker-compose.yml for joomla 5.2.4 2025-03-11 21:07:18 +01:00
Marvin Flock b9a7a6f222 chore: remove unused files 2025-03-11 21:06:15 +01:00
Marvin Flock e5f3d15ac1 fix: add missing license fields to database update 2025-03-10 19:38:42 +01:00
Marvin Flock b776cea826 fix: cut bytestring into numeric part 2025-03-10 19:38:10 +01:00
Marvin Flock d4c7bbc183 fix: replace is_array check with actual array 2025-03-10 19:37:10 +01:00
StefanE ee4799c287 Remove wrong comma in query build 2025-03-04 00:00:40 +01:00
Paul Fleischanderl fbdcfacb21 sportsmanager 2.0 changes merge result 2025-02-28 17:13:35 +01:00
Marvin Flock f0e7a20e6b fix: add more mimetypes 2025-02-11 11:47:13 +01:00
57 changed files with 52928 additions and 57819 deletions
+25
View File
@@ -0,0 +1,25 @@
name-template: "Release $COMPLETE"
tag-template: "v$COMPLETE"
draft: false
exclude:
pulls: true
exclude-labels:
- changelog-ignore
categories:
- title: "Features"
labels: ["feature", "enhancement"]
- title: "Fixes"
labels: ["bug"]
- title: "Maintenance"
labels: ["chore", "refactor"]
change-template: "- $TITLE [#$NUMBER]"
template: |
# Release $RESOLVED_VERSION
## Changes
$CHANGES
+23
View File
@@ -0,0 +1,23 @@
name-template: "Release $COMPLETE"
tag-template: "v$COMPLETE"
draft: false
exclude:
pulls: true
exclude-labels:
- changelog-ignore
categories:
- title: "Features"
labels: ["feature", "enhancement"]
- title: "Fixes"
labels: ["bug"]
- title: "Maintenance"
labels: ["chore", "refactor"]
change-template: "- $TITLE [#$NUMBER]"
template: |
## Changes
$CHANGES
+25
View File
@@ -0,0 +1,25 @@
name: Auto-label PRs
on:
pull_request:
types: [opened, reopened, synchronize, edited]
jobs:
label-changelog-ignore:
runs-on: ubuntu-latest
steps:
- name: Label PRs
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const base = context.payload.pull_request.base.ref;
const head = context.payload.pull_request.head.ref;
if ((base === 'sportsmanager2-prod' && head === 'sportsmanager2-stage') || (base === 'sportsmanager2-stage' && head === 'sportsmanager2-dev')) {
await github.rest.issues.addLabels({
...context.repo,
issue_number: context.payload.pull_request.number,
labels: ['changelog-ignore']
});
}
+100
View File
@@ -0,0 +1,100 @@
# This workflow will run release using node and then publish a package to GitHub Packages when a release is created
# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages
name: Sportsmanager Release
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+' # run only on version tags like v1.0.0
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: sportsmanager2-prod
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install npm dependencies
run: npm ci
- name: Get version from git tag
run: echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
- name: Set DATE
run: echo "DATE=$(date +'%Y-%m-%d')" >> $GITHUB_ENV
- name: Update version.php
run: |
echo "<?php" > src/structure/components/com_sportsmanager/util/version.php
echo "defined('_JEXEC') or die;" >> src/structure/components/com_sportsmanager/util/version.php
echo "return [" >> src/structure/components/com_sportsmanager/util/version.php
echo " 'version' => '${{ env.VERSION }}'," >> src/structure/components/com_sportsmanager/util/version.php
echo " 'date' => '$(date +%F)'," >> src/structure/components/com_sportsmanager/util/version.php
echo "];" >> src/structure/components/com_sportsmanager/util/version.php
echo "Updating version to $VERSION in sportsmanager.xml"
sed -i "s#<version>.*</version>#<version>$VERSION</version>#" src/structure/sportsmanager.xml
echo "Updating Date to $DATE in sportsmanager.xml"
sed -i "s#<creationDate>.*</creationDate>#<creationDate>$DATE</creationDate>#" src/structure/sportsmanager.xml
- name: Generate release notes
id: release_notes_extension
uses: release-drafter/release-drafter@v6
with:
config-name: release-drafter_extension.yml
version: ${{ github.ref_name }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Save release notes to file
run: |
echo "${{ steps.release_notes_extension.outputs.body }}" > RELEASE_NOTES.md
- name: Run build script
run: npm run release
- name: Generate release notes
id: release_notes_github
uses: release-drafter/release-drafter@v6
with:
config-name: release-drafter_github.yml
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Save release notes to file
run: |
echo "${{ steps.release_notes_github.outputs.body }}" > RELEASE_NOTES.md
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: "${{ github.ref_name }}"
name: "Release ${{ github.ref_name }}"
files: package/packages/com_sportsmanager.zip
body_path: "RELEASE_NOTES.md"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Delete draft release via API # workaround: remove leftover draft by release-drafter
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
REPO: ${{ github.repository }}
run: |
drafts=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$REPO/releases | jq '.[] | select(.draft == true)')
if [ -n "$drafts" ]; then
id=$(echo "$drafts" | jq -r '.id')
curl -s -X DELETE -H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$REPO/releases/$id
echo "Deleted draft release with ID: $id"
else
echo "No draft releases found"
fi
+39
View File
@@ -0,0 +1,39 @@
# This workflow will run release using node and then publish a package to GitHub Packages when a release is created
# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages
name: Snapshot Release
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+-snapshot' # run only on version tags like v1.0.0-snapshot
# - 'v*' # Run only on version tags like v1.0.0
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: sportsmanager2-stage
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install npm dependencies
run: npm ci
- name: Run build script
run: npm run release
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
prerelease: true
name: "Snapshot ${{ github.ref_name }}"
files: package/packages/com_sportsmanager.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+1 -1
View File
@@ -1,6 +1,6 @@
### WebStorm/IntelliJ ### ### WebStorm/IntelliJ ###
/.idea /.idea
.DS_Store
# Dependency directories # Dependency directories
/node_modules /node_modules
+101 -7
View File
@@ -1,13 +1,107 @@
# SportsManager # SportsManager
## Deploy status ## DEV/STAGE environments
### DEV environment | LV | HOSTER | DOMAIN | BRANCH |
[![buddy pipeline](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/173/badge.svg?token=de39e4e4c47351d592b59a5d1e26a41cf5196861f67d4499bbab990600468001 "buddy pipeline")](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/173) [Preview: sportsmanager.s10.kicktemp.dev](https://sportsmanager.s10.kicktemp.dev) | ------ | -------- | ------------------------------------------------------------ | -------------------- |
| DTFB | Kicktemp | [stage.dtfb.de](https://stage.dtfb.de) | dev |
| TFVHH | Kicktemp | [stage.kickern-hamburg.de](https://stage.kickern-hamburg.de) | dev |
| STFVH | DTFB | [stage.stfv.de](https://stage.stfv.de/) | sportsmanager2-stage |
| MTFV | DTFB | [stage.mtfv.de](https://stage.mtfv.de/) | ? |
| TFVSH | DTFB | [relaunch.tfvsh.de](https://relaunch.tfvsh.de) | ? |
[![buddy pipeline](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/204/badge.svg?token=de39e4e4c47351d592b59a5d1e26a41cf5196861f67d4499bbab990600468001 "buddy pipeline")](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/204) [Preview: stage.kickern-hamburg.de](https://stage.kickern-hamburg.de)
### PROD environment ## PROD environments
[![buddy pipeline](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/218/badge.svg?token=de39e4e4c47351d592b59a5d1e26a41cf5196861f67d4499bbab990600468001 "buddy pipeline")](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/218) [Preview: dtfb.de](https://dtfb.de)
[![buddy pipeline](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/219/badge.svg?token=de39e4e4c47351d592b59a5d1e26a41cf5196861f67d4499bbab990600468001 "buddy pipeline")](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/219) [Preview: kickern-hamburg.de](https://kickern-hamburg.de) | LV | HOSTER | DOMAIN | BRANCH |
| ------ | -------- | ------------------------------------------------ | ------------------- |
| DTFB | Kicktemp | [dtfb.de](https://dtfb.de) | production |
| TFVHH | Kicktemp | [kickern-hamburg.de](https://kickern-hamburg.de) | production |
| MTFV | DTFB | [mtfv.de](https://mtfv.de/) | sportsmanager2-prod |
| TFVSH | DTFB | [tfvsh.de](https://tfvsh.de/) | sportsmanager2-prod |
| STFVH | DTFB | [stfv.de](https://stfv.de/) | sportsmanager2-prod |
## Test setup
### Installation
To start joomla and the database, run
```shell
docker-compose up -d
```
### Release creation
To create a release execute
```shell
npm run release
```
### Deployment
Deployment can only be done manually right now (sad)
To do this go to
[Testserver Extension Installer Site](http://localhost:8080/administrator/index.php?option=com_installer&view=install)
and upload the zip file found in `./package/packages`
### Development Tools
If you are using Intellij, there is a plugin named Joomla! which helps with resolving
joomla specific database prefixes like #__
To set it up, insert into the configuration popup which follows after you enable the framework support:
Joomla install path: `./data/joomla_data`
JConfig: `./data/joomla_data/configuration.php`
> This works only with mounted volumes. However, mounted volumes will slow down the joomla instance significantly.
> The current setup does not use mounted volumes.
> An alternative would be to download joomla and use that installation
### Debugging (with Docker/Intellij)
1. Start Docker Container (see above)
2. Create a terminal for that container
```shell
docker exec -it <container_name> bash
```
3. install xdebug within the container since joomla does not come with xdebug preinstalled
```shell
pecl install xdebug
```
4. restart the container
5. In Intellij Go to [File | Settings | Languages & Frameworks | PHP | Servers](jetbrains://idea/settings?name=Languages+%26+Frameworks--PHP--Servers) and setup your server
| | |
|----------|-----------|
| name | anything |
| host | localhost |
| port | 8080 |
| debugger | xdebug |
use the path mapping and map the repo structure to the container content
| File/Directory | path on server |
|------------------------------------------------------------------|----------------------------------------|
| \<path>/com_sportsmanager/src/structure/administrator/components | /var/www/html/administrator/components |
| \<path>/com_sportsmanager/src/structure/components | /var/www/html/components |
7. Click on "Start Listening for PHP Debug Connections" in the top row of intellij
8. (Not sure if optional) Install a browser extension by Jetbrains
https://chromewebstore.google.com/detail/xdebug-helper-by-jetbrain/aoelhdemabeimdhedkidlnbkfhnhgnhm
### How to release
Hint: for technical details regarding the release process have a look into .github/...
To create a release these steps need to be followed
1. make sure all needed code changes are merged from dev -> stage -> prod, since releases may only be build on prod branch
2. give pull requests meaningful names and label them enhancement/bug/chore since labels and names are used for release note generation
Hint: if a specific pull request should be ignored, add the label changelog-ignore
3. tag a commit (recommended is the latest merge on prod). The pipeline is listening for any tag fitting `v[0-9]+.[0-9]+.[0-9]+`
```shell
git tag -a v1.2.3 1a2b3c4 -m "Release version 1.2.3"
```
4. push the tag
```shell
git push origin --tags
```
5. the tag push will trigger the pipeline, and it will create the release and store in GitHub
A release can be created again anytime by deleting the release from GitHub, deleting the tag (from GitHub and additionally from git)
and repeating step 3 and 4
Further: merges from dev to stage and from stage to prod can only be done by creating pull requests. These pull requests will be automatically labeled as changelog-ignore
+2
View File
@@ -0,0 +1,2 @@
This is no official release!
The Release and the release notes will be generated by github actions
+38 -25
View File
@@ -1,30 +1,43 @@
version: '2'
services: services:
mariadb: joomla:
image: docker.io/bitnami/mariadb:10.3 image: joomla:5.2.4
restart: always
ports:
- '8080:80'
environment:
JOOMLA_DB_HOST: db
JOOMLA_DB_USER: joomla
JOOMLA_DB_PASSWORD: examplepass
JOOMLA_DB_NAME: joomla_db
JOOMLA_SITE_NAME: Sportsmanager Testserver
JOOMLA_ADMIN_USER: Joomla Hero
JOOMLA_ADMIN_USERNAME: joomla
JOOMLA_ADMIN_PASSWORD: joomla@secured
JOOMLA_ADMIN_EMAIL: joomla@example.com
volumes:
- joomla_data:/var/www/html
- './docker/php.ini:/usr/local/etc/php/php.ini'
networks:
- joomla_network
db:
image: mysql:8.0
restart: always
ports: ports:
- '3306:3306' - '3306:3306'
environment: environment:
# ALLOW_EMPTY_PASSWORD is recommended only for development. MYSQL_DATABASE: joomla_db
- ALLOW_EMPTY_PASSWORD=yes MYSQL_USER: joomla
- MARIADB_USER=bn_joomla MYSQL_PASSWORD: examplepass
- MARIADB_DATABASE=bitnami_joomla MYSQL_RANDOM_ROOT_PASSWORD: '1'
TZ: Europe/Berlin
volumes: volumes:
- './data/mariadb_data:/bitnami/mariadb' - joomla_database:/var/lib/mysql
joomla: networks:
image: docker.io/bitnami/joomla:3 - joomla_network
ports:
- '80:8080' networks:
- '443:8443' joomla_network:
environment: volumes:
- JOOMLA_DATABASE_HOST=mariadb joomla_data:
- JOOMLA_DATABASE_PORT_NUMBER=3306 joomla_database:
- JOOMLA_DATABASE_USER=bn_joomla
- JOOMLA_DATABASE_NAME=bitnami_joomla
# ALLOW_EMPTY_PASSWORD is recommended only for development.
- ALLOW_EMPTY_PASSWORD=yes
volumes:
- './data/joomla_data:/bitnami/joomla'
- './docker/php.ini:/opt/bitnami/php/etc/php.ini:ro'
depends_on:
- mariadb
+77 -130
View File
@@ -9,15 +9,15 @@
; PHP attempts to find and load this configuration from a number of locations. ; PHP attempts to find and load this configuration from a number of locations.
; The following is a summary of its search order: ; The following is a summary of its search order:
; 1. SAPI module specific location. ; 1. SAPI module specific location.
; 2. The PHPRC environment variable. (As of PHP 5.2.0) ; 2. The PHPRC environment variable.
; 3. A number of predefined registry keys on Windows (As of PHP 5.2.0) ; 3. A number of predefined registry keys on Windows
; 4. Current working directory (except CLI) ; 4. Current working directory (except CLI)
; 5. The web server's directory (for SAPI modules), or directory of PHP ; 5. The web server's directory (for SAPI modules), or directory of PHP
; (otherwise in Windows) ; (otherwise in Windows)
; 6. The directory from the --with-config-file-path compile time option, or the ; 6. The directory from the --with-config-file-path compile time option, or the
; Windows directory (usually C:\windows) ; Windows directory (usually C:\windows)
; See the PHP docs for more specific information. ; See the PHP docs for more specific information.
; http://php.net/configuration.file ; https://php.net/configuration.file
; The syntax of the file is extremely simple. Whitespace and lines ; The syntax of the file is extremely simple. Whitespace and lines
; beginning with a semicolon are silently ignored (as you probably guessed). ; beginning with a semicolon are silently ignored (as you probably guessed).
@@ -31,7 +31,7 @@
; special sections cannot be overridden by user-defined INI files or ; special sections cannot be overridden by user-defined INI files or
; at runtime. Currently, [PATH=] and [HOST=] sections only work under ; at runtime. Currently, [PATH=] and [HOST=] sections only work under
; CGI/FastCGI. ; CGI/FastCGI.
; http://php.net/ini.sections ; https://php.net/ini.sections
; Directives are specified using the following syntax: ; Directives are specified using the following syntax:
; directive = value ; directive = value
@@ -75,7 +75,7 @@
; php.ini-production contains settings which hold security, performance and ; php.ini-production contains settings which hold security, performance and
; best practices at its core. But please be aware, these settings may break ; best practices at its core. But please be aware, these settings may break
; compatibility with older or less security conscience applications. We ; compatibility with older or less security-conscious applications. We
; recommending using the production ini in production and testing environments. ; recommending using the production ini in production and testing environments.
; php.ini-development is very similar to its production variant, except it is ; php.ini-development is very similar to its production variant, except it is
@@ -756,7 +756,7 @@ user_dir =
; Directory in which the loadable extensions (modules) reside. ; Directory in which the loadable extensions (modules) reside.
; http://php.net/extension-dir ; http://php.net/extension-dir
extension_dir = /opt/bitnami/php/lib/php/extensions ;extension_dir = /usr/local/lib/php/extensions
; On windows: ; On windows:
;extension_dir = "ext" ;extension_dir = "ext"
@@ -839,7 +839,7 @@ file_uploads = On
; Temporary directory for HTTP uploaded files (will use system default if not ; Temporary directory for HTTP uploaded files (will use system default if not
; specified). ; specified).
; http://php.net/upload-tmp-dir ; http://php.net/upload-tmp-dir
upload_tmp_dir = /opt/bitnami/php/tmp upload_tmp_dir = /tmp
; Maximum allowed size for uploaded files. ; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize ; http://php.net/upload-max-filesize
@@ -1318,7 +1318,7 @@ session.save_handler = files
; ;
; The path can be defined as: ; The path can be defined as:
; ;
session.save_path = /opt/bitnami/php/var/run/session session.save_path = /tmp/session
; ;
; where N is an integer. Instead of storing all the session files in ; where N is an integer. Instead of storing all the session files in
; /path, what this will do is use subdirectories N-levels deep, and ; /path, what this will do is use subdirectories N-levels deep, and
@@ -1334,12 +1334,10 @@ session.save_path = /opt/bitnami/php/var/run/session
; The file storage module creates files using mode 600 by default. ; The file storage module creates files using mode 600 by default.
; You can change that by using ; You can change that by using
; ;
session.save_path = /opt/bitnami/php/var/run/session
; ;
; where MODE is the octal representation of the mode. Note that this ; where MODE is the octal representation of the mode. Note that this
; does not overwrite the process's umask. ; does not overwrite the process's umask.
; http://php.net/session.save-path ; http://php.net/session.save-path
session.save_path = /opt/bitnami/php/var/run/session
; Whether to use strict session mode. ; Whether to use strict session mode.
; Strict session mode does not accept an uninitialized session ID, and ; Strict session mode does not accept an uninitialized session ID, and
@@ -1539,18 +1537,18 @@ session.sid_bits_per_character = 5
; Default Value: "1%" ; Default Value: "1%"
; Development Value: "1%" ; Development Value: "1%"
; Production Value: "1%" ; Production Value: "1%"
; http://php.net/session.upload-progress.freq ; https://php.net/session.upload-progress.freq
;session.upload_progress.freq = "1%" ;session.upload_progress.freq = "1%"
; The minimum delay between updates, in seconds ; The minimum delay between updates, in seconds
; Default Value: 1 ; Default Value: 1
; Development Value: 1 ; Development Value: 1
; Production Value: 1 ; Production Value: 1
; http://php.net/session.upload-progress.min-freq ; https://php.net/session.upload-progress.min-freq
;session.upload_progress.min_freq = "1" ;session.upload_progress.min_freq = "1"
; Only write session data when session data is changed. Enabled by default. ; Only write session data when session data is changed. Enabled by default.
; http://php.net/session.lazy-write ; https://php.net/session.lazy-write
;session.lazy_write = On ;session.lazy_write = On
[Assertion] [Assertion]
@@ -1558,67 +1556,47 @@ session.sid_bits_per_character = 5
; -1: Do not compile at all ; -1: Do not compile at all
; 0: Jump over assertion at run-time ; 0: Jump over assertion at run-time
; 1: Execute assertions ; 1: Execute assertions
; Changing from or to a negative value is only possible in php.ini! (For turning assertions on and off at run-time, see assert.active, when zend.assertions = 1) ; Changing from or to a negative value is only possible in php.ini!
; (For turning assertions on and off at run-time, toggle zend.assertions between the values 1 and 0)
; Default Value: 1 ; Default Value: 1
; Development Value: 1 ; Development Value: 1
; Production Value: -1 ; Production Value: -1
; http://php.net/zend.assertions ; https://php.net/zend.assertions
zend.assertions = -1 zend.assertions = -1
; Assert(expr); active by default.
; http://php.net/assert.active
;assert.active = On
; Throw an AssertionError on failed assertions
; http://php.net/assert.exception
;assert.exception = On
; Issue a PHP warning for each failed assertion. (Overridden by assert.exception if active)
; http://php.net/assert.warning
;assert.warning = On
; Don't bail out by default.
; http://php.net/assert.bail
;assert.bail = Off
; User-function to be called if an assertion fails.
; http://php.net/assert.callback
;assert.callback = 0
; Eval the expression with current error_reporting(). Set to true if you want
; error_reporting(0) around the eval().
; http://php.net/assert.quiet-eval
;assert.quiet_eval = 0
[COM] [COM]
; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs ; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs
; http://php.net/com.typelib-file ; https://php.net/com.typelib-file
;com.typelib_file = ;com.typelib_file =
; allow Distributed-COM calls ; allow Distributed-COM calls
; http://php.net/com.allow-dcom ; https://php.net/com.allow-dcom
;com.allow_dcom = true ;com.allow_dcom = true
; autoregister constants of a component's typlib on com_load() ; autoregister constants of a component's typelib on com_load()
; http://php.net/com.autoregister-typelib ; https://php.net/com.autoregister-typelib
;com.autoregister_typelib = true ;com.autoregister_typelib = true
; register constants casesensitive ; register constants casesensitive
; http://php.net/com.autoregister-casesensitive ; https://php.net/com.autoregister-casesensitive
;com.autoregister_casesensitive = false ;com.autoregister_casesensitive = false
; show warnings on duplicate constant registrations ; show warnings on duplicate constant registrations
; http://php.net/com.autoregister-verbose ; https://php.net/com.autoregister-verbose
;com.autoregister_verbose = true ;com.autoregister_verbose = true
; The default character set code-page to use when passing strings to and from COM objects. ; The default character set code-page to use when passing strings to and from COM objects.
; Default: system ANSI code page ; Default: system ANSI code page
;com.code_page= ;com.code_page=
; The version of the .NET framework to use. The value of the setting are the first three parts
; of the framework's version number, separated by dots, and prefixed with "v", e.g. "v4.0.30319".
;com.dotnet_version=
[mbstring] [mbstring]
; language for internal character representation. ; language for internal character representation.
; This affects mb_send_mail() and mbstring.detect_order. ; This affects mb_send_mail() and mbstring.detect_order.
; http://php.net/mbstring.language ; https://php.net/mbstring.language
;mbstring.language = Japanese ;mbstring.language = Japanese
; Use of this INI entry is deprecated, use global internal_encoding instead. ; Use of this INI entry is deprecated, use global internal_encoding instead.
@@ -1633,7 +1611,7 @@ zend.assertions = -1
; mbstring.encoding_translation = On is needed to use this setting. ; mbstring.encoding_translation = On is needed to use this setting.
; If empty, default_charset or input_encoding or mbstring.input is used. ; If empty, default_charset or input_encoding or mbstring.input is used.
; The precedence is: default_charset < input_encoding < mbstring.http_input ; The precedence is: default_charset < input_encoding < mbstring.http_input
; http://php.net/mbstring.http-input ; https://php.net/mbstring.http-input
;mbstring.http_input = ;mbstring.http_input =
; Use of this INI entry is deprecated, use global output_encoding instead. ; Use of this INI entry is deprecated, use global output_encoding instead.
@@ -1643,7 +1621,7 @@ zend.assertions = -1
; The precedence is: default_charset < output_encoding < mbstring.http_output ; The precedence is: default_charset < output_encoding < mbstring.http_output
; To use an output encoding conversion, mbstring's output handler must be set ; To use an output encoding conversion, mbstring's output handler must be set
; otherwise output encoding conversion cannot be performed. ; otherwise output encoding conversion cannot be performed.
; http://php.net/mbstring.http-output ; https://php.net/mbstring.http-output
;mbstring.http_output = ;mbstring.http_output =
; enable automatic encoding translation according to ; enable automatic encoding translation according to
@@ -1651,54 +1629,40 @@ zend.assertions = -1
; converted to internal encoding by setting this to On. ; converted to internal encoding by setting this to On.
; Note: Do _not_ use automatic encoding translation for ; Note: Do _not_ use automatic encoding translation for
; portable libs/applications. ; portable libs/applications.
; http://php.net/mbstring.encoding-translation ; https://php.net/mbstring.encoding-translation
;mbstring.encoding_translation = Off ;mbstring.encoding_translation = Off
; automatic encoding detection order. ; automatic encoding detection order.
; "auto" detect order is changed according to mbstring.language ; "auto" detect order is changed according to mbstring.language
; http://php.net/mbstring.detect-order ; https://php.net/mbstring.detect-order
;mbstring.detect_order = auto ;mbstring.detect_order = auto
; substitute_character used when character cannot be converted ; substitute_character used when character cannot be converted
; one from another ; one from another
; http://php.net/mbstring.substitute-character ; https://php.net/mbstring.substitute-character
;mbstring.substitute_character = none ;mbstring.substitute_character = none
; overload(replace) single byte functions by mbstring functions. ; Enable strict encoding detection.
; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(), ;mbstring.strict_detection = Off
; etc. Possible values are 0,1,2,4 or combination of them.
; For example, 7 for overload everything.
; 0: No overload
; 1: Overload mail() function
; 2: Overload str*() functions
; 4: Overload ereg*() functions
; http://php.net/mbstring.func-overload
;mbstring.func_overload = 0
; enable strict encoding detection.
; Default: Off
;mbstring.strict_detection = On
; This directive specifies the regex pattern of content types for which mb_output_handler() ; This directive specifies the regex pattern of content types for which mb_output_handler()
; is activated. ; is activated.
; Default: mbstring.http_output_conv_mimetype=^(text/|application/xhtml\+xml) ; Default: mbstring.http_output_conv_mimetypes=^(text/|application/xhtml\+xml)
;mbstring.http_output_conv_mimetype= ;mbstring.http_output_conv_mimetypes=
; This directive specifies maximum stack depth for mbstring regular expressions. It is similar ; This directive specifies maximum stack depth for mbstring regular expressions. It is similar
; to the pcre.recursion_limit for PCRE. ; to the pcre.recursion_limit for PCRE.
; Default: 100000
;mbstring.regex_stack_limit=100000 ;mbstring.regex_stack_limit=100000
; This directive specifies maximum retry count for mbstring regular expressions. It is similar ; This directive specifies maximum retry count for mbstring regular expressions. It is similar
; to the pcre.backtrack_limit for PCRE. ; to the pcre.backtrack_limit for PCRE.
; Default: 1000000
;mbstring.regex_retry_limit=1000000 ;mbstring.regex_retry_limit=1000000
[gd] [gd]
; Tell the jpeg decode to ignore warnings and try to create ; Tell the jpeg decode to ignore warnings and try to create
; a gd image. The warning will then be displayed as notices ; a gd image. The warning will then be displayed as notices
; disabled by default ; disabled by default
; http://php.net/gd.jpeg-ignore-warning ; https://php.net/gd.jpeg-ignore-warning
;gd.jpeg_ignore_warning = 1 ;gd.jpeg_ignore_warning = 1
[exif] [exif]
@@ -1706,48 +1670,48 @@ zend.assertions = -1
; With mbstring support this will automatically be converted into the encoding ; With mbstring support this will automatically be converted into the encoding
; given by corresponding encode setting. When empty mbstring.internal_encoding ; given by corresponding encode setting. When empty mbstring.internal_encoding
; is used. For the decode settings you can distinguish between motorola and ; is used. For the decode settings you can distinguish between motorola and
; intel byte order. A decode setting cannot be empty. ; intel byte order. A decode setting must not be empty.
; http://php.net/exif.encode-unicode ; https://php.net/exif.encode-unicode
;exif.encode_unicode = ISO-8859-15 ;exif.encode_unicode = ISO-8859-15
; http://php.net/exif.decode-unicode-motorola ; https://php.net/exif.decode-unicode-motorola
;exif.decode_unicode_motorola = UCS-2BE ;exif.decode_unicode_motorola = UCS-2BE
; http://php.net/exif.decode-unicode-intel ; https://php.net/exif.decode-unicode-intel
;exif.decode_unicode_intel = UCS-2LE ;exif.decode_unicode_intel = UCS-2LE
; http://php.net/exif.encode-jis ; https://php.net/exif.encode-jis
;exif.encode_jis = ;exif.encode_jis =
; http://php.net/exif.decode-jis-motorola ; https://php.net/exif.decode-jis-motorola
;exif.decode_jis_motorola = JIS ;exif.decode_jis_motorola = JIS
; http://php.net/exif.decode-jis-intel ; https://php.net/exif.decode-jis-intel
;exif.decode_jis_intel = JIS ;exif.decode_jis_intel = JIS
[Tidy] [Tidy]
; The path to a default tidy configuration file to use when using tidy ; The path to a default tidy configuration file to use when using tidy
; http://php.net/tidy.default-config ; https://php.net/tidy.default-config
;tidy.default_config = /usr/local/lib/php/default.tcfg ;tidy.default_config = /usr/local/lib/php/default.tcfg
; Should tidy clean and repair output automatically? ; Should tidy clean and repair output automatically?
; WARNING: Do not use this option if you are generating non-html content ; WARNING: Do not use this option if you are generating non-html content
; such as dynamic images ; such as dynamic images
; http://php.net/tidy.clean-output ; https://php.net/tidy.clean-output
tidy.clean_output = Off tidy.clean_output = Off
[soap] [soap]
; Enables or disables WSDL caching feature. ; Enables or disables WSDL caching feature.
; http://php.net/soap.wsdl-cache-enabled ; https://php.net/soap.wsdl-cache-enabled
soap.wsdl_cache_enabled=1 soap.wsdl_cache_enabled=1
; Sets the directory name where SOAP extension will put cache files. ; Sets the directory name where SOAP extension will put cache files.
; http://php.net/soap.wsdl-cache-dir ; https://php.net/soap.wsdl-cache-dir
soap.wsdl_cache_dir="/tmp" soap.wsdl_cache_dir="/tmp"
; (time to live) Sets the number of second while cached file will be used ; (time to live) Sets the number of second while cached file will be used
; instead of original one. ; instead of original one.
; http://php.net/soap.wsdl-cache-ttl ; https://php.net/soap.wsdl-cache-ttl
soap.wsdl_cache_ttl=86400 soap.wsdl_cache_ttl=86400
; Sets the size of the cache limit. (Max. number of WSDL files to cache) ; Sets the size of the cache limit. (Max. number of WSDL files to cache)
@@ -1806,6 +1770,11 @@ opcache.revalidate_freq = 60
; size of the optimized code. ; size of the optimized code.
;opcache.save_comments=1 ;opcache.save_comments=1
; If enabled, compilation warnings (including notices and deprecations) will
; be recorded and replayed each time a file is included. Otherwise, compilation
; warnings will only be emitted when the file is first cached.
;opcache.record_warnings=0
; Allow file existence override (file_exists, etc.) performance feature. ; Allow file existence override (file_exists, etc.) performance feature.
;opcache.enable_file_override=0 ;opcache.enable_file_override=0
@@ -1827,10 +1796,6 @@ opcache.revalidate_freq = 60
; are cached. ; are cached.
;opcache.max_file_size=0 ;opcache.max_file_size=0
; Check the cache checksum each N requests.
; The default value of "0" means that the checks are disabled.
;opcache.consistency_checks=0
; How long to wait (in seconds) for a scheduled restart to begin if the cache ; How long to wait (in seconds) for a scheduled restart to begin if the cache
; is not being accessed. ; is not being accessed.
;opcache.force_restart_timeout=180 ;opcache.force_restart_timeout=180
@@ -1868,7 +1833,16 @@ opcache.revalidate_freq = 60
; Enables and sets the second level cache directory. ; Enables and sets the second level cache directory.
; It should improve performance when SHM memory is full, at server restart or ; It should improve performance when SHM memory is full, at server restart or
; SHM reset. The default "" disables file based caching. ; SHM reset. The default "" disables file based caching.
opcache.file_cache = /opt/bitnami/php/var/run/opcache_file opcache.file_cache = /tmp/opcache_file
; Enables or disables read-only mode for the second level cache directory.
; It should improve performance for read-only containers,
; when the cache is pre-warmed and packaged alongside the application.
; Best used with `opcache.validate_timestamps=0`, `opcache.enable_file_override=1`
; and `opcache.file_cache_consistency_checks=0`.
; Note: A cache generated with a different build of PHP, a different file path,
; or different settings (including which extensions are loaded), may be ignored.
;opcache.file_cache_read_only=0
; Enables or disables opcode caching in shared memory. ; Enables or disables opcode caching in shared memory.
;opcache.file_cache_only=0 ;opcache.file_cache_only=0
@@ -1882,8 +1856,13 @@ opcache.file_cache = /opt/bitnami/php/var/run/opcache_file
;opcache.file_cache_fallback=1 ;opcache.file_cache_fallback=1
; Enables or disables copying of PHP code (text segment) into HUGE PAGES. ; Enables or disables copying of PHP code (text segment) into HUGE PAGES.
; This should improve performance, but requires appropriate OS configuration. ; Under certain circumstances (if only a single global PHP process is
;opcache.huge_code_pages=1 ; started from which all others fork), this can increase performance
; by a tiny amount because TLB misses are reduced. On the other hand, this
; delays PHP startup, increases memory usage and degrades performance
; under memory pressure - use with care.
; Requires appropriate OS configuration.
;opcache.huge_code_pages=0
; Validate cached file permissions. ; Validate cached file permissions.
;opcache.validate_permission=0 ;opcache.validate_permission=0
@@ -1897,12 +1876,12 @@ opcache.file_cache = /opt/bitnami/php/var/run/opcache_file
; Specifies a PHP script that is going to be compiled and executed at server ; Specifies a PHP script that is going to be compiled and executed at server
; start-up. ; start-up.
; http://php.net/opcache.preload ; https://php.net/opcache.preload
;opcache.preload= ;opcache.preload=
; Preloading code as root is not allowed for security reasons. This directive ; Preloading code as root is not allowed for security reasons. This directive
; facilitates to let the preloading to be run as another user. ; facilitates to let the preloading to be run as another user.
; http://php.net/opcache.preload_user ; https://php.net/opcache.preload_user
;opcache.preload_user= ;opcache.preload_user=
; Prevents caching files that are less than this number of seconds old. It ; Prevents caching files that are less than this number of seconds old. It
@@ -1945,44 +1924,12 @@ opcache.file_cache = /opt/bitnami/php/var/run/opcache_file
; List of headers files to preload, wildcard patterns allowed. ; List of headers files to preload, wildcard patterns allowed.
;ffi.preload= ;ffi.preload=
zend_extension = opcache
opcache.fast_shutdown = 1
;extension = pdo_dblib
;extension = apcu
;extension = mcrypt
;extension = imagick
;extension = memcached
;extension = maxminddb
;extension = mongodb
;[XDebug] zend_extension=xdebug.so
zend_extension = xdebug
xdebug.mode = debug
;xdebug.client_host = 127.0.0.1
;xdebug.client_port = 9000
;xdebug.output_dir = /tmp
;xdebug.remote_handler = dbgp
;xdebug.remote_port=9000
;xdebug.remote_host=10.254.254.254
;xdebug.remote_autostart=1
;xdebug.remote_enable=1
;xdebug.default_enable=0
;xdebug.remote_host=host.docker.internal
;xdebug.remote_port=9000
;xdebug.remote_connect_back=0
;xdebug.profiler_enable=0
;xdebug.remote_log="/tmp/xdebug.log"
xdebug.mode=debug xdebug.mode=debug
xdebug.client_port=9000
xdebug.client_host=host.docker.internal
xdebug.remote_handler=dbgp
;xdebug.remote_host=host.docker.internal
;xdebug.remote_port=9000
xdebug.start_with_request=yes xdebug.start_with_request=yes
xdebug.discover_client_host=0 xdebug.client_host=host.docker.internal
xdebug.idekey=PHPSTORM xdebug.client_port=9003
xdebug.show_error_trace = 1 xdebug.log=/tmp/xdebug.log
xdebug.max_nesting_level=250 xdebug.discover_client_host=false
xdebug.var_display_max_depth=10 xdebug.log_level=7
;xdebug.log=/tmp/xdebug.log
+33 -17
View File
@@ -43,7 +43,7 @@ export const config = {
watch: ['src/structure/**/*.{php,html,xml,ini,less,json,js,css}'], watch: ['src/structure/**/*.{php,html,xml,ini,less,json,js,css}'],
}, },
copyrelease: { copyrelease: {
src: ['src/structure/**/**', 'src/structure/**/.*', '!src/structure/**/*.{php,html,xml,ini,less,json,js,css}', '!src/structure/**/.*.{php,html,xml,ini,less,json,js,css}'], src: ['RELEASE_NOTES.md','src/structure/**/**', 'src/structure/**/.*', '!src/structure/**/*.{php,html,xml,ini,less,json,js,css}', '!src/structure/**/.*.{php,html,xml,ini,less,json,js,css}'],
replacesrc: ['src/structure/**/**.{php,html,xml,ini,less,json,js,css}', 'src/structure/**/.*.{php,html,xml,ini,less,json,js,css}'], replacesrc: ['src/structure/**/**.{php,html,xml,ini,less,json,js,css}', 'src/structure/**/.*.{php,html,xml,ini,less,json,js,css}'],
dest: 'releasefiles/' dest: 'releasefiles/'
}, },
@@ -56,28 +56,44 @@ export const config = {
}, },
packagefiles: [ packagefiles: [
{ {
src: './releasefiles/components/com_kickboilerplate/**/**', src: './releasefiles/components/com_sportsmanager/**/**',
dest: 'sourcefiles/com_kickboilerplate/site' dest: 'sourcefiles/com_sportsmanager/site'
}, },
{ {
src: './releasefiles/administrator/components/com_kickboilerplate/**/**', src: './releasefiles/language/**/**',
dest: 'sourcefiles/com_kickboilerplate/admin' dest: 'sourcefiles/com_sportsmanager/site/language'
}, },
{ {
src: './releasefiles/administrator/components/com_kickboilerplate/kickboilerplate.xml', src: './releasefiles/administrator/components/com_sportsmanager/**/**',
dest: 'sourcefiles/com_kickboilerplate/' dest: 'sourcefiles/com_sportsmanager/admin'
}, },
{ {
src: './releasefiles/administrator/components/com_kickboilerplate/script.php', src: './releasefiles/administrator/language/**/**',
dest: 'sourcefiles/com_kickboilerplate/' dest: 'sourcefiles/com_sportsmanager/admin/language'
}, },
{ {
src: './releasefiles/media/com_kickboilerplate/**/**', src: './releasefiles/administrator/services/**/**',
dest: 'sourcefiles/com_kickboilerplate/media' dest: 'sourcefiles/com_sportsmanager/admin/services'
}, },
{ {
src: './releasefiles/plugins/system/kickboilerplate/**/**', src: './releasefiles/sportsmanager.xml',
dest: 'sourcefiles/plg_system_kickboilerplate' dest: 'sourcefiles/com_sportsmanager/'
},
{
src: './releasefiles/script.php',
dest: 'sourcefiles/com_sportsmanager/'
},
{
src: './releasefiles/media/com_sportsmanager/**/**',
dest: 'sourcefiles/com_sportsmanager/media'
},
{
src: './releasefiles/plugins/system/kickyootheme/**/**',
dest: 'sourcefiles/plg_system_kickyootheme'
},
{
src: './releasefiles/RELEASE_NOTES.md',
dest: 'sourcefiles/com_sportsmanager/admin/'
} }
], ],
package: [ package: [
@@ -100,7 +116,7 @@ export const config = {
archiver: [ archiver: [
{ {
destination : 'package/packages/', destination : 'package/packages/',
name: 'plg_system_kickboilerplate', name: 'plg_system_kickyootheme',
suffixversion: false, suffixversion: false,
types: [ types: [
{ {
@@ -112,14 +128,14 @@ export const config = {
} }
], ],
folders: [ folders: [
'sourcefiles/plg_system_kickboilerplate' 'sourcefiles/plg_system_kickyootheme'
], ],
files: [ files: [
] ]
}, },
{ {
destination : 'package/packages/', destination : 'package/packages/',
name: 'com_kickboilerplate', name: 'com_sportsmanager',
suffixversion: false, suffixversion: false,
types: [ types: [
{ {
@@ -131,7 +147,7 @@ export const config = {
} }
], ],
folders: [ folders: [
'sourcefiles/com_kickboilerplate' 'sourcefiles/com_sportsmanager'
], ],
files: [ files: [
] ]
+2 -2
View File
@@ -1,7 +1,7 @@
{ {
"name": "sportsmanager", "name": "sportsmanager",
"description": "", "description": "",
"version": "0.0.1", "version": "2.0.0",
"scripts": { "scripts": {
"boilerplate": "cross-env NODE_ENV=development gulp boilerplate", "boilerplate": "cross-env NODE_ENV=development gulp boilerplate",
"build": "cross-env NODE_ENV=production gulp build", "build": "cross-env NODE_ENV=production gulp build",
@@ -16,7 +16,7 @@
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git+https://github.com/nielsnuebel/com_sportsmanager.git" "url": "https://github.com/Deutscher-Tischfussballbund/com_sportsmanager.git"
}, },
"keywords": [], "keywords": [],
"author": { "author": {
@@ -1,23 +0,0 @@
<?php
// no direct access
defined('_JEXEC') or die('Restricted access');
// Require the base controller
require_once (JPATH_COMPONENT.DS.'controller.php');
// Require specific controller if requested
//if($controller = JRequest::getVar('controller')) {
// require_once (JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php');
//}
// Create the controller
//$classname = 'AutosController'.$controller;
//$controller = new $classname( );
// Perform the Request task
//$controller->execute( JRequest::getVar('task'));
// Redirect if set by the controller
//$controller->redirect();
?>
@@ -1,31 +0,0 @@
<?php
/*
* Sports Manager (C) 2006-2020, Sven Nickel
*/
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import Joomla controller library
jimport('joomla.application.component.controller');
/**
* General Controller of SportsManager component
*/
class SportsManagerController extends JControllerLegacy
{
/**
* display task
*
* @return void
*/
function display($cachable = false, $urlparams = false)
{
// set default view if not set
$input = JFactory::getApplication()->input;
$input->set('view', $input->getCmd('view', 'SportsManager'));
// call parent behavior
parent::display($cachable);
}
}
@@ -0,0 +1,61 @@
<?php
/**
* @package Joomla.Administrator
* @subpackage com_inlinecontact
*
* @copyright (C) Alexander Niklaus. All rights reserved.
* @license GNU General Public License version 2 or later
* @link https://an-software.net
*/
defined('_JEXEC') or die;
use Dtfb\Component\com_sportsmanager\Administrator\Extension\SportsmanagerComponent;
use Joomla\CMS\Dispatcher\ComponentDispatcherFactoryInterface;
use Joomla\CMS\Extension\ComponentInterface;
use Joomla\CMS\Extension\Service\Provider\ComponentDispatcherFactory;
use Joomla\CMS\Extension\Service\Provider\MVCFactory;
use Joomla\CMS\Log\Log;
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
/**
* The contact service provider.
*
* @since 1.0.0
*/
return new class implements ServiceProviderInterface {
/**
* Registers the service provider with a DI container.
*
* @param Container $container The DI container.
*
* @return void
*
* @since 1.0.0
*/
public function register(Container $container): void
{
Log::addLogger(
[
'text_file' => 'com_sportsmanager.php',
],
Log::ALL,
['com_sportsmanager']
);
$container->registerServiceProvider(new MVCFactory('\\Dtfb\\Component\\com_sportsmanager'));
$container->registerServiceProvider(new ComponentDispatcherFactory('\\Dtfb\\Component\\com_sportsmanager'));
$container->set(
ComponentInterface::class,
function (Container $container) {
$component = new SportsmanagerComponent($container->get(ComponentDispatcherFactoryInterface::class));
$component->setMVCFactory($container->get(MVCFactoryInterface::class));
return $component;
}
);
}
};
@@ -1,19 +0,0 @@
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import joomla controller library
jimport('joomla.application.component.controller');
// Get an instance of the controller prefixed by HelloWorld
$controller = JControllerLegacy::getInstance('SportsManager');
// Get the task
$jinput = JFactory::getApplication()->input;
$task = $jinput->get('task', "", 'STR' );
// Perform the Request task
$controller->execute($task);
// Redirect if set by the controller
$controller->redirect();
@@ -0,0 +1,19 @@
<?php
namespace Dtfb\Component\com_sportsmanager\Administrator\Controller;
/*
* Sports Manager (C) 2006-2020, Sven Nickel
*/
// No direct access to this file
use Joomla\CMS\MVC\Controller\BaseController;
defined('_JEXEC') or die('Restricted access');
/**
* General Controller of SportsManager component
* @since 1.0.0
*/
class DisplayController extends BaseController
{
protected $default_view = 'sportsmanager';
}
@@ -0,0 +1,14 @@
<?php
namespace Dtfb\Component\com_sportsmanager\Administrator\Extension;
defined('JPATH_PLATFORM') or die;
use Joomla\CMS\Extension\MVCComponent;
use function defined;
/**
* Component class for com_sportsmanager
*
* @since 2.0.0
*/
class SportsmanagerComponent extends MVCComponent {}
@@ -0,0 +1,40 @@
<?php
namespace Dtfb\Component\com_sportsmanager\Administrator\View\Sportsmanager;
/*
* Sports Manager (C) 2006-2020, Sven Nickel
*/
// No direct access to this file
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
use Joomla\CMS\Toolbar\ToolbarHelper;
defined('_JEXEC') or die('Restricted access');
/**
* SportsManager View
* @since 1.0.0
*/
class HtmlView extends BaseHtmlView
{
function display($tpl = null): void
{
ToolbarHelper::title(Text::_('COM_SPORTSMANAGER'));
?>
<h3><?php echo Text::_('COM_SPORTSMANAGER'); ?> &#8211; Created by Sven Nickel | Maintained by DTFB</h3>
<?php
$notesPath = JPATH_COMPONENT_ADMINISTRATOR . '/RELEASE_NOTES.md';
if (file_exists($notesPath)) {
$notes = file_get_contents($notesPath);
echo '<div style="padding:1em;"><h3>Release Notes</h3><pre>' .
htmlspecialchars($notes) . '</pre></div>';
}
// Display the template
parent::display($tpl);
}
}
@@ -1,8 +1,8 @@
<?php <?php
/* /*
* Sports Manager (C) 2006-2020, Sven Nickel * Sports Manager (C) 2006-2020, Sven Nickel
*/ */
// No direct access to this file // No direct access to this file
defined('_JEXEC') or die('Restricted access'); defined('_JEXEC') or die('Restricted access');
@@ -1,5 +0,0 @@
[.ShellClassInfo]
InfoTip=Dieser Ordner wird online freigegeben.
IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe
IconIndex=16
@@ -1,5 +0,0 @@
[.ShellClassInfo]
InfoTip=Dieser Ordner wird online freigegeben.
IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe
IconIndex=16
@@ -1 +0,0 @@
<html><body bgcolor="#FFFFFF"></body></html>
@@ -1,5 +0,0 @@
[.ShellClassInfo]
InfoTip=Dieser Ordner wird online freigegeben.
IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe
IconIndex=16
@@ -1 +0,0 @@
<html><body bgcolor="#FFFFFF"></body></html>
@@ -1,49 +0,0 @@
<?php
/*
* Sports Manager (C) 2006-2020, Sven Nickel
*/
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import Joomla view library
jimport('joomla.application.component.view');
/**
* SportsManager View
*/
class SportsManagerViewSportsManager extends JViewLegacy
{
/**
* SportsManager view display method
* @return void
*/
function display($tpl = null)
{
JToolbarHelper::title(JText::_('COM_SPORTSMANAGER'));
?>
<h2><?php echo JText::_('COM_SPORTSMANAGER'); ?> Copyright &copy; 2006 &#8211; 2014 Sven Nickel</h2>
<?php
/*
// Get data from the model
$items = $this->get('Items');
$pagination = $this->get('Pagination');
// Check for errors.
if (count($errors = $this->get('Errors')))
{
JError::raiseError(500, implode('<br />', $errors));
return false;
}
// Assign data to the view
$this->items = $items;
$this->pagination = $pagination;
*/
// Display the template
parent::display($tpl);
}
}
File diff suppressed because it is too large Load Diff
+214 -180
View File
@@ -2,79 +2,96 @@
/* /*
* Sports Manager API Extension * Sports Manager API Extension
*/ */
defined('_JEXEC') or die();
$secret = JFactory::$config['secret']; use JetBrains\PhpStorm\NoReturn;
use Joomla\CMS\Application\SiteApplication;
use Joomla\CMS\Factory;
use Joomla\CMS\User\UserFactoryInterface;
use Joomla\Registry\Registry;
function abortWithError($error) { defined("_JEXEC") or die();
if (isJson()) {
header('content-type: application/json'); require_once JPATH_SITE . '/components/com_sportsmanager/database/init.php';
die(json_encode(['error' => $error]));
} else { Factory::getContainer()->set(Registry::class, function () {
die($error); return new Registry();
} });
$secret = Factory::getContainer()->get(Registry::class)->get("secret");
#[NoReturn] function abortWithError($error): void
{
if (isJson()) {
header("content-type: application/json");
die(json_encode(["error" => $error]));
} else {
die($error);
}
} }
function isJson() { function isJson(): bool
$jinput = JFactory::getApplication()->input; {
$jInput = Factory::getContainer()->get(SiteApplication::class)->input;
return $jinput->get('format') === 'json'; return $jInput->get('format') === 'json';
} }
function notifyChange($data) { function notifyChange($data): void
{
try { try {
$db = &getDatabase(); $db = getDatabase();
$query = "SELECT wert from #__sportsmanager_einstellungen WHERE name='api_push_key'"; $query = "SELECT wert from #__sportsmanager_einstellungen WHERE name='api_push_key'";
$db->setQuery($query); $push_key = loadResult($db, $query);
$push_key = $db->loadResult(); $push_server = !empty($push_key) && isset(_payload($push_key)->aud) ? _payload($push_key)->aud : '';
$push_server = !empty($push_key) && isset(_payload($push_key)->aud) ? _payload($push_key)->aud : ''; if ($push_server != '' && $push_key != '') {
if ($push_server != '' && $push_key != '') { $url = $push_server . (str_ends_with($push_server, '/') ? '' : '/') . 'v1/notifications/send';
$url = $push_server . (substr($push_server, -1) == '/' ? '' : '/') . 'v1/notifications/send'; $key = 'key=' . $push_key;
$key = 'key=' . $push_key;
$ch = curl_init($url); $ch = curl_init($url);
curl_setopt_array($ch, array( curl_setopt_array($ch, array(
CURLOPT_POST => TRUE, CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_HEADER => TRUE, CURLOPT_HEADER => TRUE,
CURLOPT_HTTPHEADER => array( CURLOPT_HTTPHEADER => array(
'Authorization: ' . $key, 'Authorization: ' . $key,
'Content-Type: application/json', 'Content-Type: application/json',
), ),
CURLOPT_TIMEOUT => 2, CURLOPT_TIMEOUT => 2,
CURLOPT_POSTFIELDS => json_encode($data), CURLOPT_POSTFIELDS => json_encode($data),
)); ));
$resp = curl_exec($ch); $resp = curl_exec($ch);
if ($resp == FALSE) { if (!$resp) {
error_log("failed to send notification"); error_log("failed to send notification");
}
} }
} } catch (Exception $ex) {
} catch (Exception $ex) { error_log($ex);
error_log($ex); }
}
} }
function begegnungChanged($begegnung, $begegnung_vorher, $modus, $heim_team, $gast_team, $spiele) { function begegnungChanged($begegnung, $begegnung_vorher, $modus, $heim_team, $gast_team, $spiele): void
notifyChange(['payload' => [ {
'begegnung' => $begegnung, notifyChange(['payload' => [
'begegnung_vorher' => $begegnung_vorher, 'begegnung' => $begegnung,
'$modus' => $modus, 'begegnung_vorher' => $begegnung_vorher,
'heim_team' => $heim_team, '$modus' => $modus,
'gast_team' => $gast_team, 'heim_team' => $heim_team,
'spiele' => $spiele, 'gast_team' => $gast_team,
], 'type' => 'FIXTURE_RESULT_CHANGED']); 'spiele' => $spiele,
], 'type' => 'FIXTURE_RESULT_CHANGED']);
} }
function begegnungTischChanged($begegnung, $heim_team, $gast_team) { function begegnungTischChanged($begegnung, $heim_team, $gast_team): void
notifyChange(['payload' => [ {
'begegnung' => $begegnung, notifyChange(['payload' => [
'heim_team' => $heim_team, 'begegnung' => $begegnung,
'gast_team' => $gast_team, 'heim_team' => $heim_team,
], 'type' => 'TABLE_CHANGED']); 'gast_team' => $gast_team,
], 'type' => 'TABLE_CHANGED']);
} }
function begegnungVerlegenNotify($begegnung, $users, $vorschlagendes_team_id, $heim_team, $gast_team) { function begegnungVerlegenNotify($begegnung, $users, $vorschlagendes_team_id, $heim_team, $gast_team): void
{
notifyChange([ notifyChange([
'payload' => [ 'payload' => [
'begegnung' => $begegnung, 'begegnung' => $begegnung,
@@ -92,41 +109,47 @@ function begegnungVerlegenNotify($begegnung, $users, $vorschlagendes_team_id, $h
* @reponse body * @reponse body
* { data: { token: "reqest_token", access_for_team: ["team_id_1", "team_id_2"]}, expires: 1520013747000} * { data: { token: "reqest_token", access_for_team: ["team_id_1", "team_id_2"]}, expires: 1520013747000}
*/ */
function userToken() { #[NoReturn] function userToken(): void
{
global $secret; global $secret;
if (!isJson()) { if (!isJson()) {
abortWithError("JSON Request only"); abortWithError("JSON Request only");
}
if (isExternalDatabase()) {
abortWithError("Local Database only");
} }
$jinput = JFactory::getApplication()->input->json; if (isExternalDatabase()) {
$access_key = $jinput->getString('access_key'); abortWithError("Local Database only");
$user_id = _payload($access_key)->sub;
$user = JFactory::getUser($user_id);
if (!jwt_validate($access_key, $secret.$user->password)) {
abortWithError('Access Key is invalid');
}
$expires = new DateTime();
$expires->modify('+16 hours');
$db = &getDatabase();
$query = "SELECT berechtigt_team_id from #__sportsmanager_berechtigt_fuer_team where berechtigt_user_id = $user_id";
$db->setQuery($query);
if (!$db->execute()) {
abortWithError($db->stderr(true));
} }
$team_id = $db->loadObjectList(); $container = Factory::getContainer();
JSON_sportsmanager::JSON([ $jInput = $container->get(SiteApplication::class)->input->json;
'token' => jwt_token([ $access_key = $jInput->getString('access_key');
'sub' => $user_id,
'exp' => $expires->getTimestamp(), $user_id = _payload($access_key)->sub;
], $secret), $user = $container->get(UserFactoryInterface::class)->loadUserById($user_id);
'access_for_teams' => array_map(function($item) { return $item->berechtigt_team_id; }, $team_id),
'expires' => $expires->getTimestamp() * 1000, // if (!jwt_validate($access_key, $secret . $user->password)) {
]); abortWithError('Access Key is invalid');
}
try {
$expires = new DateTime();
$expires->modify('+16 hours');
$db = getDatabase();
$query = "SELECT berechtigt_team_id from #__sportsmanager_berechtigt_fuer_team where berechtigt_user_id = $user_id";
$team_id = loadObjectList($db, $query);
JSON_sportsmanager::JSON([
'token' => jwt_token([
'sub' => $user_id,
'exp' => $expires->getTimestamp(),
], $secret),
'access_for_teams' => array_map(function ($item) {
return $item->berechtigt_team_id;
}, $team_id),
'expires' => $expires->getTimestamp() * 1000, //
]);
} catch (Exception $ex) {
error_log($ex);
}
} }
/* /*
@@ -134,124 +157,133 @@ function userToken() {
* @response body * @response body
* { data: { token: "api_acccess_token" }} * { data: { token: "api_acccess_token" }}
*/ */
function userAuth() { #[NoReturn] function userAuth(): void
{
global $secret; global $secret;
if (!isJson()) { if (!isJson()) {
die(); die();
}
if (isExternalDatabase()) {
abortWithError("Local Database only");
} }
$jinput = JFactory::getApplication()->input->json; if (isExternalDatabase()) {
$username = $jinput->getString('username'); abortWithError("Local Database only");
$password = $jinput->getString('password'); }
$container = Factory::getContainer();
$jInput = $container->get(SiteApplication::class)->input->json;
$username = $jInput->getString('username');
$password = $jInput->getString('password');
$db = &getDatabase(); $db = getDatabase();
$query = $db->getQuery(true); $query = $db->getQuery(true);
$query->select('id')->from('#__users')->where('username = "' . $username . '"')->limit(1); $query->select('id')->from('#__users')->where('username = "' . $username . '"')->setLimit(1);
$db->setQuery($query); $user_id = loadResult($db, $query);
$user_id = $db->loadResult(); $user = $container->get(UserFactoryInterface::class)->loadUserById($user_id);
$user = JFactory::getUser($user_id);
if (JUserHelper::verifyPassword($password, $user->password, $user->id)) { //TODO: pw verification modernising: use php native methods, however this also needs new pw hashing. maybe force a pw reset on all accounts
if (password_verify($password, $user->password)) {
JSON_sportsmanager::JSON([ JSON_sportsmanager::JSON([
'token' => jwt_token([ 'token' => jwt_token([
'sub' => $user_id, 'sub' => $user_id,
'iat' => (new DateTime())->getTimestamp(), 'iat' => (new DateTime())->getTimestamp(),
], $secret.$user->password) ], $secret . $user->password)
]); ]);
return; }
} abortWithError('Wrong credentials');
abortWithError('Wrong credentials');
} }
function getUserID() { function getUserID(): int
{
global $secret; global $secret;
$token = JFactory::getApplication()->input->server->getString('HTTP_SECRET', NULL); $container = Factory::getContainer();
$input = $container->get(SiteApplication::class)->input;
$token = $input->server->getString('HTTP_SECRET', NULL);
return $token != NULL && jwt_validate($token, $secret) && isset(_payload($token)->sub) return $token != NULL && jwt_validate($token, $secret) && isset(_payload($token)->sub)
? (int) _payload($token)->sub ? (int)_payload($token)->sub
: 0; : 0;
} }
function getColorOfImage($image) { function getColorOfImage($image)
if ($image != NULL) { {
if ($image != NULL) {
if (strpos($image, '.png') !== false) { if (str_contains($image, '.png')) {
$img = imagecreatefrompng($image); $img = imagecreatefrompng($image);
} else { } else {
$img = imagecreatefromjpeg($image); $img = imagecreatefromjpeg($image);
} }
$width = imagesx($img); $width = imagesx($img);
$height = imagesx($img); $height = imagesx($img);
$colorMap = []; $colorMap = [];
$colors = []; $colors = [];
for ($x = 0; $x < $width; $x++) { for ($x = 0; $x < $width; $x++) {
for ($y = 0; $y < $height; $y++) { for ($y = 0; $y < $height; $y++) {
$color = imagecolorsforindex($img, imagecolorat($img, $x, $y)); $color = imagecolorsforindex($img, imagecolorat($img, $x, $y));
if ($color['alpha'] < 20) { if ($color['alpha'] < 20) {
$c = colorKey($color); $c = colorKey($color);
$hex = hex($color); $hex = hex($color);
if ($hex != NULL) { if ($hex != NULL) {
if (!isset($colors[$c])) { if (!isset($colors[$c])) {
$colors[$c] = 0; $colors[$c] = 0;
$colorMap[$c] = $hex; $colorMap[$c] = $hex;
} }
$colors[$c] += 1; $colors[$c] += 1;
} }
} }
} }
} }
arsort($colors); arsort($colors);
$result = array_keys($colors); $result = array_keys($colors);
return sizeof($result) > 1 && $result[0] === '0-0-0' ? $colorMap[$result[1]] : $colorMap[$result[0]]; return sizeof($result) > 1 && $result[0] === '0-0-0' ? $colorMap[$result[1]] : $colorMap[$result[0]];
} }
return NULL; return NULL;
} }
function colorKey($rgb) { function colorKey($rgb): string
{
$r = (int)($rgb['red'] / 100); $r = (int)($rgb['red'] / 100);
$g = (int)($rgb['green'] / 100); $g = (int)($rgb['green'] / 100);
$b = (int)($rgb['blue'] / 100); $b = (int)($rgb['blue'] / 100);
return $r . '-' . $g . '-' . $b; return $r . '-' . $g . '-' . $b;
} }
function hex($rgb) { function hex($rgb): ?string
$r = $rgb['red']; {
$g = $rgb['green']; $r = $rgb['red'];
$b = $rgb['blue']; $g = $rgb['green'];
if (($r + $g + $b) / 3 > 125) { $b = $rgb['blue'];
return NULL; if (($r + $g + $b) / 3 > 125) {
} return NULL;
$r = dechex($r); }
if (strlen($r) < 2) { $r = dechex($r);
$r = '0' . $r; if (strlen($r) < 2) {
} $r = '0' . $r;
$g = dechex($g); }
if (strlen($g) < 2) { $g = dechex($g);
$g = '0' . $g; if (strlen($g) < 2) {
} $g = '0' . $g;
$b = dechex($b); }
if (strlen($b) < 2) { $b = dechex($b);
$b = '0' . $b; if (strlen($b) < 2) {
} $b = '0' . $b;
return '#' . $r . $g . $b; }
return '#' . $r . $g . $b;
} }
/* /*
* sign string with secret * sign string with secret
*/ */
function _sign($data, $secret, $algo = 'sha256') { function _sign($data, $secret): string
{
return base64_encode(hash_hmac('sha256', $data, $secret)); return base64_encode(hash_hmac('sha256', $data, $secret));
} }
/* /*
* get payload from jwt token * get payload from jwt token
*/ */
function _payload($token) { function _payload($token)
{
$jwt = explode('.', $token); $jwt = explode('.', $token);
return json_decode(base64_decode($jwt[0])); return json_decode(base64_decode($jwt[0]));
} }
@@ -259,7 +291,8 @@ function _payload($token) {
/* /*
* headless signed jwt token * headless signed jwt token
*/ */
function jwt_token($payload, $secret) { function jwt_token($payload, $secret): string
{
$data = base64_encode(json_encode($payload)); $data = base64_encode(json_encode($payload));
return $data . '.' . _sign($data, $secret); return $data . '.' . _sign($data, $secret);
@@ -268,7 +301,8 @@ function jwt_token($payload, $secret) {
/* /*
* validate token * validate token
*/ */
function jwt_validate($token, $secret) { function jwt_validate($token, $secret): bool
{
$jwt = explode('.', $token); $jwt = explode('.', $token);
if (sizeof($jwt) == 2 && $jwt[1] == _sign($jwt[0], $secret)) { if (sizeof($jwt) == 2 && $jwt[1] == _sign($jwt[0], $secret)) {
if (isset(_payload($token)->exp)) { if (isset(_payload($token)->exp)) {
@@ -1,24 +0,0 @@
<?php
/*
* Sports Manager (C) 2006-2020, Sven Nickel
*/
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die();
jimport('joomla.application.component.controller');
/**
* Auto Component Controller
*/
class SportsManagerController extends JControllerLegacy
{
function display()
{
// Setzt einen Standard view
if ( ! JRequest::getCmd( 'view' ) ) {
JRequest::setVar('view', 'categories' );
}
parent::display();
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,117 @@
<?php
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Uri\Uri;
use Joomla\Database\DatabaseInterface;
use Joomla\Database\Mysql\MysqlDriver;
use Joomla\Database\Mysqli\MysqliDriver;
require_once JPATH_SITE . '/components/com_sportsmanager/database/util.php';
function initDatabase(): void
{
global $sportsmanager_database_local;
global $sportsmanager_database_external;
global $sportsmanager_joomla_path;
global $sportsmanager_joomla_url;
$sportsmanager_database_local = NULL;
$sportsmanager_database_external = NULL;
$sportsmanager_joomla_path = JPATH_ROOT;
$sportsmanager_joomla_url = Uri::base();
$sportsmanager_database_local = Factory::getContainer()->get(DatabaseInterface::class);
$query = "SELECT * FROM #__sportsmanager_einstellungen";
$rows = loadObjectList($sportsmanager_database_local, $query);
$database_driver = "mysql";
$database_host = "";
$database_user = "";
$database_password = "";
$database_database = "";
$database_prefix = "jos_";
$joomla_path = "";
$joomla_url = "";
foreach ($rows as $row) {
$name = mb_strtolower($row->name);
if ($name == "database_driver")
$database_driver = $row->wert;
else if ($name == "database_host")
$database_host = $row->wert;
else if ($name == "database_user")
$database_user = $row->wert;
else if ($name == "database_password")
$database_password = $row->wert;
else if ($name == "database_database")
$database_database = $row->wert;
else if ($name == "database_prefix")
$database_prefix = $row->wert;
else if ($name == "joomla_path")
$joomla_path = $row->wert;
else if ($name == "joomla_url")
$joomla_url = $row->wert;
}
if (!empty($database_driver) && !empty($database_host) && !empty($database_user) && !empty($database_database) && !empty($database_prefix) && !empty($joomla_path) && !empty($joomla_url)) {
$option = array(); //prevent problems
$option['driver'] = $database_driver; // Database driver name
$option['host'] = $database_host; // Database host name
$option['user'] = $database_user; // User for database authentication
$option['password'] = $database_password; // Password for database authentication
$option['database'] = $database_database; // Database name
$option['prefix'] = $database_prefix; // Database prefix (may be empty)
$sportsmanager_database_external = match ($option['driver']) {
'mysql' => new MysqlDriver($option),
'mysqli' => new MysqliDriver($option),
default => NULL,
};
if ($sportsmanager_database_external === NULL) {
echo "<strong>" . Text::_('COM_SPORTSMANAGER_CONNECTION_EXTERNAL_DB_FAILURE') . "</strong><br><br>";
} else {
try {
if (!$sportsmanager_database_external->execute()) {
echo "<strong>" . Text::_('COM_SPORTSMANAGER_EXTERNAL_DB_NO_SM_TABLES') . "</strong><br><br>";
$sportsmanager_database_external = NULL;
} else {
$query = "SELECT wert FROM #__sportsmanager_einstellungen WHERE name = 'datenbank_version'";
$db_version = loadResult($sportsmanager_database_external, $query);
if ($db_version < 38) {
echo "<strong>" . Text::_('COM_SPORTSMANAGER_EXTERNAL_DB_NO_SM_VERSION') . "</strong><br><br>";
$sportsmanager_database_external = NULL;
} else if (!is_dir($joomla_path . DIRECTORY_SEPARATOR . "images" . DIRECTORY_SEPARATOR . "sportsmanager")) {
echo "<strong>" . Text::_('COM_SPORTSMANAGER_EXTERNAL_NO_IMAGES_FOLDER') . " '/images/sportsmanager'!</strong><br><br>";
$sportsmanager_database_external = NULL;
} else {
$sportsmanager_joomla_path = $joomla_path;
$sportsmanager_joomla_url = $joomla_url;
}
}
} catch (Exception $e) {
error_log($e->getMessage());
}
}
}
}
function isExternalDatabase(): bool
{
global $sportsmanager_database_external;
return $sportsmanager_database_external != NULL;
}
function getDatabase($forceLocalDB = FALSE)
{
global $sportsmanager_database_local;
global $sportsmanager_database_external;
if ($forceLocalDB || $sportsmanager_database_external == NULL)
$db = $sportsmanager_database_local;
else
$db = $sportsmanager_database_external;
return $db;
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,47 @@
<?php
use Joomla\CMS\Log\Log;
/**
* @param $db
* @param $query
* @return mixed
* @since 2.0.5
*/
function loadObjectList($db, $query): mixed
{
try {
$db->setQuery($query);
$objList = $db->loadObjectList();
} catch (RuntimeException $e) {
Log::add("Database error: " . $e->getMessage(), Log::ERROR, "com_sportsmanager");
if(isJson()) {
abortWithError($e->getMessage());
} else {
throw $e;
}
}
return $objList;
}
/**
* @param $db
* @param $query
* @return mixed
* @since 2.0.5
*/
function loadResult($db, $query): mixed
{
try {
$db->setQuery($query);
$result = $db->loadResult();
} catch (RuntimeException $e) {
Log::add("Database error: " . $e->getMessage(), Log::ERROR, "com_sportsmanager");
if(isJson()) {
abortWithError($e->getMessage());
} else {
throw $e;
}
}
return $result;
}
@@ -1,5 +0,0 @@
[.ShellClassInfo]
InfoTip=Dieser Ordner wird online freigegeben.
IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe
IconIndex=16
File diff suppressed because it is too large Load Diff
@@ -1,5 +0,0 @@
[.ShellClassInfo]
InfoTip=Dieser Ordner wird online freigegeben.
IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe
IconIndex=16
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,45 @@
<?php
namespace Dtfb\Component\com_sportsmanager\Site\Controller;
/*
* Sports Manager (C) 2006-2020, Sven Nickel
*/
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die();
use Joomla\CMS\Factory;
use Joomla\CMS\MVC\Controller\BaseController;
/**
* @package SportsManager.Site
* @subpackage com_sportsmanager
*
* @copyright Copyright (C) 2020 John Smith. All rights reserved.
* @license GNU General Public License version 3; see LICENSE
*/
/**
* Class DisplayController
* @since 2.0.0
* The DisplayController class handles the display of views in the application.
* It extends the BaseController class.
*/
class DisplayController extends BaseController {
/**
* Displays the view for the given URL parameters.
*
* @param bool $cachable Whether the view can be cached or not. Default is false.
* @param array $urlparams The URL parameters to be passed to the view. Default is an empty array.
* @param array|null $safeurlparams An associative array of 'safe' URL parameters and their variable types.
*
* @return void
* @throws Exception
* @since 2.0.0
*/
public function display($cachable = false, $urlparams = array(), array $safeurlparams = null): void
{
require_once JPATH_SITE . '/components/com_sportsmanager/sportsmanager.php';
}
}
@@ -4,390 +4,416 @@
*/ */
// kein direkter Zugriff // kein direkter Zugriff
use JetBrains\PhpStorm\NoReturn;
use Joomla\CMS\Application\SiteApplication;
use Joomla\CMS\Factory;
use Joomla\CMS\Log\Log;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\Version;
defined('_JEXEC') or die('Restricted access'); defined('_JEXEC') or die('Restricted access');
require_once (JPATH_COMPONENT.DIRECTORY_SEPARATOR.'mathparser.php'); require_once JPATH_SITE . '/components/com_sportsmanager/mathparser.php';
require_once JPATH_SITE . '/components/com_sportsmanager/database/init.php';
/** @noinspection PhpUnused */
function mathParserVerteilung($rohpunkte, $platz, $teilnehmer, $multiplikator) { function mathParserVerteilung($rohpunkte, $platz, $teilnehmer, $multiplikator) {
return max(round($multiplikator * round(((($rohpunkte - 1) * (-log($platz / $teilnehmer) * (1 - ($platz / $teilnehmer)))) / (-log(1 / $teilnehmer) * (1 - (1 / $teilnehmer)))) + 1)), 1); return max(round($multiplikator * round(((($rohpunkte - 1) * (-log($platz / $teilnehmer) * (1 - ($platz / $teilnehmer)))) / (-log(1 / $teilnehmer) * (1 - (1 / $teilnehmer)))) + 1)), 1);
} }
/** @noinspection PhpUnused */
function mathParserVerteilungR($rohpunkte, $platz, $teilnehmer, $multiplikator) { function mathParserVerteilungR($rohpunkte, $platz, $teilnehmer, $multiplikator) {
return max(round(((($multiplikator * $rohpunkte - 1) * (-log($platz / $teilnehmer) * (1 - ($platz / $teilnehmer)))) / (-log(1 / $teilnehmer) * (1 - (1 / $teilnehmer)))) + 1), 1); return max(round(((($multiplikator * $rohpunkte - 1) * (-log($platz / $teilnehmer) * (1 - ($platz / $teilnehmer)))) / (-log(1 / $teilnehmer) * (1 - (1 / $teilnehmer)))) + 1), 1);
} }
class MathParserSM extends MathParser { class MathParserSM extends MathParser
// Verteilung nach Klostermann/Wahle {
public function __construct() { // Verteilung nach Klostermann/Wahle
MathParser::__construct(); public function __construct()
$this->createFunc("ROUND", round, 1); {
$this->createFunc("VERTEILUNG", mathParserVerteilung, 4); parent::__construct();
$this->createFunc("VERTEILUNGR", mathParserVerteilungR, 4); try {
} $this->createFunc("ROUND", 'round', 1);
$this->createFunc("VERTEILUNG", 'mathParserVerteilung', 4);
$this->createFunc("VERTEILUNGR", 'mathParserVerteilungR', 4);
} catch (Exception $e) {
Log::add('an error occurred: ' . $e->getMessage(), Log::ERROR, 'com_sportsmanager');
throw new RuntimeException('An error occurred.', 500);
}
}
} }
function keinZugriff($login = FALSE) { #[NoReturn] function keinZugriff($login = FALSE): void
if (isJson()) { {
abortWithError(401 . ' Unauthorized'); if (isJson()) {
} abortWithError(401 . ' Unauthorized');
if (!$login || JFactory::getUser()->id) { }
JError::raiseError(500, JText::_('JERROR_ALERTNOAUTHOR')); if (!$login || Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id) {
jexit(); Log::add('Unauthorized user with id ' . Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id, Log::WARNING, 'com_sportsmanager');
} throw new RuntimeException('Not authorized!', 401);
$version = new JVersion; }
$joomla = $version->getShortVersion(); $version = new Version();
$u =& JFactory::getURI(); $joomla = $version->getShortVersion();
$redirectUrl = urlencode(base64_encode($u->toString())); $u = Uri::getInstance();
$redirectUrl = '&return='.$redirectUrl; $redirectUrl = urlencode(base64_encode($u->toString()));
$joomlaLoginUrl = 'index.php?option=' . (substr($joomla, 0, 3) != '1.5' ? 'com_users' : 'com_user') . '&view=login'; $redirectUrl = '&return=' . $redirectUrl;
$finalUrl = $joomlaLoginUrl . $redirectUrl; $joomlaLoginUrl = 'index.php?option=' . (!str_starts_with($joomla, '1.5') ? 'com_users' : 'com_user') . '&view=login';
$app = &JFactory::getApplication(); $finalUrl = $joomlaLoginUrl . $redirectUrl;
$app->redirect(JRoute::_($finalUrl)); $app = Factory::getContainer()->get(SiteApplication::class);
jexit(); $app->redirect(Route::_($finalUrl));
jexit();
} }
function bereinigterDateiname($dateiname) { function bereinigterDateiname($dateiname): array|string
$_convertTable = array( {
'&amp;' => 'and', '@' => 'at', '©' => 'c', '®' => 'r', 'À' => 'a', $_convertTable = array(
'Á' => 'a', ' => 'a', 'Ä' => 'a', 'Å' => 'a', 'Æ' => 'ae','Ç' => 'c', '&amp;' => 'and', '@' => 'at', '©' => 'c', '®' => 'r', 'À' => 'a',
'È' => 'e', 'É' => 'e', 'Ë' => 'e', 'Ì' => 'i', 'Í' => 'i', 'Î' => 'i', 'Á' => 'a', 'Â' => 'a', 'Ä' => 'a', 'Å' => 'a', 'Æ' => 'ae', 'Ç' => 'c',
'Ï' => 'i', 'Ò' => 'o', 'Ó' => 'o', 'Ô' => 'o', 'Õ' => 'o', 'Ö' => 'o', 'È' => 'e', 'É' => 'e', 'Ë' => 'e', 'Ì' => 'i', 'Í' => 'i', 'Î' => 'i',
'Ø' => 'o', 'Ù' => 'u', 'Ú' => 'u', 'Û' => 'u', 'Ü' => 'u', 'Ý' => 'y', 'Ï' => 'i', 'Ò' => 'o', 'Ó' => 'o', 'Ô' => 'o', 'Õ' => 'o', 'Ö' => 'o',
'ß' => 'ss','à' => 'a', 'á' => 'a', 'â' => 'a', 'ä' => 'a', 'å' => 'a', 'Ø' => 'o', 'Ù' => 'u', 'Ú' => 'u', 'Û' => 'u', 'Ü' => 'u', 'Ý' => 'y',
'æ' => 'ae','ç' => 'c', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ß' => 'ss', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ä' => 'a', 'å' => 'a',
'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ò' => 'o', 'ó' => 'o', 'æ' => 'ae', 'ç' => 'c', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e',
'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ò' => 'o', 'ó' => 'o',
'û' => 'u', 'ü' => 'u', 'ý' => 'y', 'þ' => 'p', 'ÿ' => 'y', 'Ā' => 'a', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ø' => 'o', 'ù' => 'u', 'ú' => 'u',
'ā' => 'a', 'Ă' => 'a', 'ă' => 'a', 'Ą' => 'a', 'ą' => 'a', 'Ć' => 'c', 'û' => 'u', 'ü' => 'u', 'ý' => 'y', 'þ' => 'p', 'ÿ' => 'y', 'Ā' => 'a',
'ć' => 'c', 'Ĉ' => 'c', 'ĉ' => 'c', 'Ċ' => 'c', 'ċ' => 'c', 'Č' => 'c', 'ā' => 'a', 'Ă' => 'a', 'ă' => 'a', 'Ą' => 'a', 'ą' => 'a', 'Ć' => 'c',
'č' => 'c', 'Ď' => 'd', 'ď' => 'd', 'Đ' => 'd', 'đ' => 'd', 'Ē' => 'e', 'ć' => 'c', 'Ĉ' => 'c', 'ĉ' => 'c', 'Ċ' => 'c', 'ċ' => 'c', 'Č' => 'c',
'ē' => 'e', 'Ĕ' => 'e', 'ĕ' => 'e', 'Ė' => 'e', 'ė' => 'e', 'Ę' => 'e', 'č' => 'c', 'Ď' => 'd', 'ď' => 'd', 'Đ' => 'd', 'đ' => 'd', 'Ē' => 'e',
'ę' => 'e', 'Ě' => 'e', 'ě' => 'e', 'Ĝ' => 'g', 'ĝ' => 'g', 'Ğ' => 'g', 'ē' => 'e', 'Ĕ' => 'e', 'ĕ' => 'e', 'Ė' => 'e', 'ė' => 'e', 'Ę' => 'e',
'ğ' => 'g', 'Ġ' => 'g', 'ġ' => 'g', 'Ģ' => 'g', 'ģ' => 'g', 'Ĥ' => 'h', 'ę' => 'e', 'Ě' => 'e', 'ě' => 'e', 'Ĝ' => 'g', 'ĝ' => 'g', 'Ğ' => 'g',
'ĥ' => 'h', 'Ħ' => 'h', 'ħ' => 'h', 'Ĩ' => 'i', 'ĩ' => 'i', 'Ī' => 'i', 'ğ' => 'g', 'Ġ' => 'g', 'ġ' => 'g', 'Ģ' => 'g', 'ģ' => 'g', 'Ĥ' => 'h',
'ī' => 'i', 'Ĭ' => 'i', 'ĭ' => 'i', 'Į' => 'i', 'į' => 'i', 'İ' => 'i', 'ĥ' => 'h', 'Ħ' => 'h', 'ħ' => 'h', 'Ĩ' => 'i', 'ĩ' => 'i', 'Ī' => 'i',
'ı' => 'i', 'IJ' => 'ij','ij' => 'ij','Ĵ' => 'j', 'ĵ' => 'j', 'Ķ' => 'k', 'ī' => 'i', 'Ĭ' => 'i', 'ĭ' => 'i', 'Į' => 'i', 'į' => 'i', 'İ' => 'i',
'ķ' => 'k', 'ĸ' => 'k', 'Ĺ' => 'l', 'ĺ' => 'l', 'Ļ' => 'l', 'ļ' => 'l', 'ı' => 'i', 'IJ' => 'ij', 'ij' => 'ij', 'Ĵ' => 'j', 'ĵ' => 'j', 'Ķ' => 'k',
'Ľ' => 'l', 'ľ' => 'l', 'Ŀ' => 'l', 'ŀ' => 'l', 'Ł' => 'l', 'ł' => 'l', 'ķ' => 'k', 'ĸ' => 'k', 'Ĺ' => 'l', 'ĺ' => 'l', 'Ļ' => 'l', 'ļ' => 'l',
'Ń' => 'n', 'ń' => 'n', 'Ņ' => 'n', 'ņ' => 'n', 'Ň' => 'n', 'ň' => 'n', 'Ľ' => 'l', 'ľ' => 'l', 'Ŀ' => 'l', 'ŀ' => 'l', 'Ł' => 'l', 'ł' => 'l',
'ʼn' => 'n', 'Ŋ' => 'n', 'ŋ' => 'n', 'Ō' => 'o', 'ō' => 'o', 'Ŏ' => 'o', 'Ń' => 'n', 'ń' => 'n', 'Ņ' => 'n', 'ņ' => 'n', 'Ň' => 'n', 'ň' => 'n',
'ŏ' => 'o', 'Ő' => 'o', 'ő' => 'o', 'Œ' => 'oe','œ' => 'oe','Ŕ' => 'r', 'ʼn' => 'n', 'Ŋ' => 'n', 'ŋ' => 'n', 'Ō' => 'o', 'ō' => 'o', 'Ŏ' => 'o',
'ŕ' => 'r', 'Ŗ' => 'r', 'ŗ' => 'r', 'Ř' => 'r', 'ř' => 'r', 'Ś' => 's', 'ŏ' => 'o', 'Ő' => 'o', 'ő' => 'o', 'Œ' => 'oe', 'œ' => 'oe', 'Ŕ' => 'r',
'ś' => 's', 'Ŝ' => 's', 'ŝ' => 's', 'Ş' => 's', 'ş' => 's', 'Š' => 's', 'ŕ' => 'r', 'Ŗ' => 'r', 'ŗ' => 'r', 'Ř' => 'r', 'ř' => 'r', 'Ś' => 's',
'š' => 's', 'Ţ' => 't', 'ţ' => 't', 'Ť' => 't', 'ť' => 't', 'Ŧ' => 't', 'ś' => 's', 'Ŝ' => 's', 'ŝ' => 's', 'Ş' => 's', 'ş' => 's', 'Š' => 's',
'ŧ' => 't', 'Ũ' => 'u', 'ũ' => 'u', 'Ū' => 'u', 'ū' => 'u', 'Ŭ' => 'u', 'š' => 's', 'Ţ' => 't', 'ţ' => 't', 'Ť' => 't', 'ť' => 't', 'Ŧ' => 't',
'ŭ' => 'u', 'Ů' => 'u', 'ů' => 'u', 'Ű' => 'u', 'ű' => 'u', 'Ų' => 'u', 'ŧ' => 't', 'Ũ' => 'u', 'ũ' => 'u', 'Ū' => 'u', 'ū' => 'u', 'Ŭ' => 'u',
'ų' => 'u', 'Ŵ' => 'w', 'ŵ' => 'w', 'Ŷ' => 'y', 'ŷ' => 'y', 'Ÿ' => 'y', 'ŭ' => 'u', 'Ů' => 'u', 'ů' => 'u', 'Ű' => 'u', 'ű' => 'u', 'Ų' => 'u',
'Ź' => 'z', 'ź' => 'z', 'Ż' => 'z', 'ż' => 'z', 'Ž' => 'z', 'ž' => 'z', 'ų' => 'u', 'Ŵ' => 'w', 'ŵ' => 'w', 'Ŷ' => 'y', 'ŷ' => 'y', 'Ÿ' => 'y',
'ſ' => 'z', 'Ə' => 'e', 'ƒ' => 'f', 'Ơ' => 'o', 'ơ' => 'o', 'Ư' => 'u', 'Ź' => 'z', 'ź' => 'z', 'Ż' => 'z', 'ż' => 'z', 'Ž' => 'z', 'ž' => 'z',
'ư' => 'u', 'Ǎ' => 'a', 'ǎ' => 'a', 'Ǐ' => 'i', 'ǐ' => 'i', 'Ǒ' => 'o', 'ſ' => 'z', 'Ə' => 'e', 'ƒ' => 'f', 'Ơ' => 'o', 'ơ' => 'o', 'Ư' => 'u',
'ǒ' => 'o', 'Ǔ' => 'u', 'ǔ' => 'u', 'Ǖ' => 'u', 'ǖ' => 'u', 'Ǘ' => 'u', 'ư' => 'u', 'Ǎ' => 'a', 'ǎ' => 'a', 'Ǐ' => 'i', 'ǐ' => 'i', 'Ǒ' => 'o',
'ǘ' => 'u', 'Ǚ' => 'u', 'ǚ' => 'u', 'Ǜ' => 'u', 'ǜ' => 'u', 'Ǻ' => 'a', 'ǒ' => 'o', 'Ǔ' => 'u', 'ǔ' => 'u', 'Ǖ' => 'u', 'ǖ' => 'u', 'Ǘ' => 'u',
'ǻ' => 'a', 'Ǽ' => 'ae','ǽ' => 'ae','Ǿ' => 'o', 'ǿ' => 'o', 'ə' => 'e', 'ǘ' => 'u', 'Ǚ' => 'u', 'ǚ' => 'u', 'Ǜ' => 'u', 'ǜ' => 'u', 'Ǻ' => 'a',
'Ё' => 'jo','Є' => 'e', 'І' => 'i', 'Ї' => 'i', 'А' => 'a', 'Б' => 'b', 'ǻ' => 'a', 'Ǽ' => 'ae', 'ǽ' => 'ae', 'Ǿ' => 'o', 'ǿ' => 'o', 'ə' => 'e',
'В' => 'v', 'Г' => 'g', 'Д' => 'd', 'Е' => 'e', 'Ж' => 'zh','З' => 'z', 'Ё' => 'jo', 'Є' => 'e', 'І' => 'i', 'Ї' => 'i', 'А' => 'a', 'Б' => 'b',
'И' => 'i', 'Й' => 'j', 'К' => 'k', 'Л' => 'l', 'М' => 'm', 'Н' => 'n', 'В' => 'v', 'Г' => 'g', 'Д' => 'd', 'Е' => 'e', 'Ж' => 'zh', 'З' => 'z',
'О' => 'o', 'П' => 'p', 'Р' => 'r', 'С' => 's', 'Т' => 't', 'У' => 'u', 'И' => 'i', 'Й' => 'j', 'К' => 'k', 'Л' => 'l', 'М' => 'm', 'Н' => 'n',
'Ф' => 'f', 'Х' => 'h', 'Ц' => 'c', 'Ч' => 'ch','Ш' => 'sh','Щ' => 'sch', 'О' => 'o', 'П' => 'p', 'Р' => 'r', 'С' => 's', 'Т' => 't', 'У' => 'u',
'Ъ' => '-', 'Ы' => 'y', 'Ь' => '-', 'Э' => 'je','Ю' => 'ju','Я' => 'ja', 'Ф' => 'f', 'Х' => 'h', 'Ц' => 'c', 'Ч' => 'ch', 'Ш' => 'sh', 'Щ' => 'sch',
'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'Ъ' => '-', 'Ы' => 'y', 'Ь' => '-', 'Э' => 'je', 'Ю' => 'ju', 'Я' => 'ja',
'ж' => 'zh','з' => 'z', 'и' => 'i', 'й' => 'j', 'к' => 'k', 'л' => 'l', 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e',
'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'j', 'к' => 'k', 'л' => 'l',
'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's',
'ш' => 'sh','щ' => 'sch','ъ' => '-','ы' => 'y', 'ь' => '-', 'э' => 'je', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch',
'ю' => 'ju','я' => 'ja','ё' => 'jo','є' => 'e', 'і' => 'i', 'ї' => 'i', 'ш' => 'sh', 'щ' => 'sch', 'ъ' => '-', 'ы' => 'y', 'ь' => '-', 'э' => 'je',
'Ґ' => 'g', 'ґ' => 'g', 'א' => 'a', 'ב' => 'b', 'ג' => 'g', 'ד' => 'd', 'ю' => 'ju', 'я' => 'ja', 'ё' => 'jo', 'є' => 'e', 'і' => 'i', 'ї' => 'i',
'ה' => 'h', 'ו' => 'v', 'ז' => 'z', 'ח' => 'h', 'ט' => 't', 'י' => 'i', 'Ґ' => 'g', 'ґ' => 'g', 'א' => 'a', 'ב' => 'b', 'ג' => 'g', 'ד' => 'd',
'ך' => 'k', 'כ' => 'k', 'ל' => 'l', 'ם' => 'm', 'מ' => 'm', 'ן' => 'n', 'ה' => 'h', 'ו' => 'v', 'ז' => 'z', 'ח' => 'h', 'ט' => 't', 'י' => 'i',
'נ' => 'n', 'ס' => 's', 'ע' => 'e', 'ף' => 'p', 'פ' => 'p', 'ץ' => 'C', 'ך' => 'k', 'כ' => 'k', 'ל' => 'l', 'ם' => 'm', 'מ' => 'm', 'ן' => 'n',
'צ' => 'c', 'ק' => 'q', 'ר' => 'r', 'ש' => 'w', 'ת' => 't', '' => 'tm', 'נ' => 'n', 'ס' => 's', 'ע' => 'e', 'ף' => 'p', 'פ' => 'p', 'ץ' => 'C',
); 'צ' => 'c', 'ק' => 'q', 'ר' => 'r', 'ש' => 'w', 'ת' => 't', '™' => 'tm',
$bad = array_merge( );
array_map('chr', range(0,31)), $bad = array_merge(
array_map('chr', range(0, 31)),
array("<", ">", ":", '"', "/", "\\", "|", "?", "*")); array("<", ">", ":", '"', "/", "\\", "|", "?", "*"));
return str_replace($bad, "", strtr($dateiname, $_convertTable)); return str_replace($bad, "", strtr($dateiname, $_convertTable));
} }
function setMinMemoryLimit($memDestSize) { function setMinMemoryLimit($memDestSize): void
if (getBytes(ini_get('memory_limit')) < getBytes($memDestSize)) {
ini_set('memory_limit', $memDestSize); if (getBytes(ini_get('memory_limit')) < getBytes($memDestSize))
ini_set('memory_limit', $memDestSize);
} }
function getBytes($val) { function getBytes($val): int|string
$val = trim($val); {
$last = strtolower($val{strlen($val)-1}); $val = trim($val);
switch($last) { $numeric = substr($val, 0, strlen($val) - 1);
// The 'G' modifier is available since PHP 5.1.0 $last = strtolower($val[strlen($val) - 1]);
case 'g': switch ($last) {
$val *= 1024; // The 'G' modifier is available since PHP 5.1.0
case 'm': case 'm':
$val *= 1024; case 'g':
case 'k': case 'k':
$val *= 1024; $numeric *= 1024;
} break;
return $val; }
return $numeric;
} }
function encrypt($str, $key){ function encrypt($str, $key): string
$result=""; {
for($i=0; $i<strlen($str); $i++) { $result = "";
$char = substr($str, $i, 1); for ($i = 0; $i < strlen($str); $i++) {
$keychar = substr($key, ($i % strlen($key))-1, 1); $char = substr($str, $i, 1);
$char = chr(ord($char)+ord($keychar)); $keychar = substr($key, ($i % strlen($key)) - 1, 1);
$result.=$char; $char = chr(ord($char) + ord($keychar));
} $result .= $char;
return base64_encode($result); }
return base64_encode($result);
} }
function decrypt($str, $key){ function decrypt($str, $key): string
$str = base64_decode($str); {
$result=""; $str = base64_decode($str);
for($i=0; $i<strlen($str); $i++) { $result = "";
$char = substr($str, $i, 1); for ($i = 0; $i < strlen($str); $i++) {
$keychar = substr($key, ($i % strlen($key))-1, 1); $char = substr($str, $i, 1);
$char = chr(ord($char)-ord($keychar)); $keychar = substr($key, ($i % strlen($key)) - 1, 1);
$result.=$char; $char = chr(ord($char) - ord($keychar));
} $result .= $char;
return $result; }
return $result;
} }
function individualwettbewerbFilter($prefix) { function individualwettbewerbFilter($prefix): string
$db =& getDatabase(); {
$user_id = isExternalDatabase() ? 0 : JFactory::getUser()->id; $user_id = isExternalDatabase() ? 0 : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id;
return " " . $prefix . " (SELECT berechtigt_individualwettbewerb_id FROM #__sportsmanager_berechtigt_fuer_individualwettbewerb INNER JOIN #__sportsmanager_individualwettbewerb ON individualwettbewerb_id = berechtigt_individualwettbewerb_id WHERE berechtigt_user_id = $user_id) "; return " " . $prefix . " (SELECT berechtigt_individualwettbewerb_id FROM #__sportsmanager_berechtigt_fuer_individualwettbewerb INNER JOIN #__sportsmanager_individualwettbewerb ON individualwettbewerb_id = berechtigt_individualwettbewerb_id WHERE berechtigt_user_id = $user_id) ";
} }
function kategorieFilter($prefix, $suffix = "") { function kategorieFilter($prefix, $suffix = ""): string
global $params; {
$kategorien = explode(",", $params->get( 'kategorien' )); global $params;
$filter = ""; $kategorien = explode(",", $params->get('kategorien'));
foreach ($kategorien as $s) { $filter = "";
$kategorie = intval(trim($s)); foreach ($kategorien as $s) {
if ($kategorie == 0) $kategorie = intval(trim($s));
continue; if ($kategorie == 0)
if (!empty($filter)) continue;
$filter .= ", "; if (!empty($filter))
$filter .= $kategorie; $filter .= ", ";
} $filter .= $kategorie;
return empty($filter) ? "" : (" " . $prefix . " (" . $filter . ") " . $suffix); }
return empty($filter) ? "" : (" " . $prefix . " (" . $filter . ") " . $suffix);
} }
function turnierFilter($prefix) { function turnierFilter($prefix): string
$db =& getDatabase(); {
$user_id = isExternalDatabase() ? 0 : JFactory::getUser()->id; $user_id = isExternalDatabase() ? 0 : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id;
return " " . $prefix . " (SELECT berechtigt_turnier_id FROM #__sportsmanager_berechtigt_fuer_turnier WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -14) "; return " " . $prefix . " (SELECT berechtigt_turnier_id FROM #__sportsmanager_berechtigt_fuer_turnier WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -14) ";
} }
function vereinFilter($prefix) { function vereinFilter($prefix): string
$db =& getDatabase(); {
$user_id = isExternalDatabase() ? 0 : JFactory::getUser()->id; $user_id = isExternalDatabase() ? 0 : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id;
return " " . $prefix . " (SELECT berechtigt_verein_id FROM #__sportsmanager_berechtigt_fuer_verein INNER JOIN #__sportsmanager_verein ON berechtigt_verein_id = verein_id WHERE berechtigt_user_id = $user_id AND NOT ausgetreten) "; return " " . $prefix . " (SELECT berechtigt_verein_id FROM #__sportsmanager_berechtigt_fuer_verein INNER JOIN #__sportsmanager_verein ON berechtigt_verein_id = verein_id WHERE berechtigt_user_id = $user_id AND NOT ausgetreten) ";
} }
function veranstalterFilter($prefix) { function veranstalterFilter($prefix): string
$db =& getDatabase(); {
$user_id = isExternalDatabase() ? 0 : JFactory::getUser()->id; $user_id = isExternalDatabase() ? 0 : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id;
return " " . $prefix . " (SELECT berechtigt_veranstalter_id FROM #__sportsmanager_berechtigt_fuer_veranstalter WHERE berechtigt_user_id = $user_id) "; return " " . $prefix . " (SELECT berechtigt_veranstalter_id FROM #__sportsmanager_berechtigt_fuer_veranstalter WHERE berechtigt_user_id = $user_id) ";
} }
function veranstaltungFilter($prefix) { function veranstaltungFilter($prefix): string
$db =& getDatabase(); {
$user_id = isExternalDatabase() ? 0 : JFactory::getUser()->id; $user_id = isExternalDatabase() ? 0 : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id;
return " " . $prefix . " (SELECT berechtigt_veranstaltung_id FROM #__sportsmanager_berechtigt_fuer_veranstaltung INNER JOIN #__sportsmanager_veranstaltung ON veranstaltung_id = berechtigt_veranstaltung_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -14) "; return " " . $prefix . " (SELECT berechtigt_veranstaltung_id FROM #__sportsmanager_berechtigt_fuer_veranstaltung INNER JOIN #__sportsmanager_veranstaltung ON veranstaltung_id = berechtigt_veranstaltung_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -14) ";
} }
// Berechnet Datum zum Montag der ersten Kalenderwoche eines Jahres // Berechnet Datum zum Montag der ersten Kalenderwoche eines Jahres
function firstkw($jahr) { function firstkw($jahr): bool|int
$erster = mktime(0,0,0,1,1,$jahr); {
$wtag = date('w',$erster); $erster = mktime(0, 0, 0, 1, 1, $jahr);
if ($wtag <= 4) { $wtag = date('w', $erster);
/** if ($wtag <= 4) {
* Donnerstag oder kleiner: auf den Montag zurückrechnen. /**
*/ * Donnerstag oder kleiner: auf den Montag zurückrechnen.
$montag = mktime(0,0,0,1,1-($wtag-1),$jahr); */
} $montag = mktime(0, 0, 0, 1, 1 - ($wtag - 1), $jahr);
else { } else {
/** /**
* auf den Montag nach vorne rechnen. * auf den Montag nach vorne rechnen.
*/ */
$montag = mktime(0,0,0,1,1+(7-$wtag+1),$jahr); $montag = mktime(0, 0, 0, 1, 1 + (7 - $wtag + 1), $jahr);
} }
return $montag; return $montag;
} }
// Berechnet Wochentag über Kalenderwoche, Jahr und Wochentag (0 = Montag, ..., 6 = Sonntag) // Berechnet Wochentag über Kalenderwoche, Jahr und Wochentag (0 = Montag, ..., 6 = Sonntag)
function mondaykw($kw, $jahr, $weekday) { function mondaykw($kw, $jahr, $weekday): bool|int
$firstmonday = firstkw($jahr); {
$mon_monat = date('m',$firstmonday); $firstmonday = firstkw($jahr);
$mon_jahr = date('Y',$firstmonday); $mon_monat = date('m', $firstmonday);
$mon_tage = date('d',$firstmonday); $mon_jahr = date('Y', $firstmonday);
$tage = ($kw-1)*7; $mon_tage = (int)date('d', $firstmonday);
$daykw = mktime(0,0,0,$mon_monat,$mon_tage+$tage+$weekday,$mon_jahr); $tage = ($kw - 1) * 7;
return $daykw; return mktime(0, 0, 0, $mon_monat, $mon_tage + $tage + $weekday, $mon_jahr);
} }
// Berechnet Termin am Wochentag (0 = Montag, ..., 6 = Sonntag) in Kalenderwoche zum Datum // Berechnet Termin am Wochentag (0 = Montag, ..., 6 = Sonntag) in Kalenderwoche zum Datum
function geaenderterWochentag($datum, $wochentag) { function geaenderterWochentag($datum, $wochentag): bool|int
$wtag = date('w', $datum); {
if ($wtag == 0) // Sonntag $wtag = date('w', $datum);
$wtag = 7; if ($wtag == 0) // Sonntag
$mon_monat = date('m', $datum); $wtag = 7;
$mon_jahr = date('Y', $datum); $mon_monat = date('m', $datum);
$mon_tage = date('d', $datum); $mon_jahr = date('Y', $datum);
return mktime(0,0,0, $mon_monat, $mon_tage + 1 - $wtag + $wochentag, $mon_jahr); $mon_tage = (int)date('d', $datum);
return mktime(0, 0, 0, $mon_monat, $mon_tage + 1 - $wtag + $wochentag, $mon_jahr);
} }
function normalisiertesDatum($datum) { function normalisiertesDatum($datum): ?string
if ($datum == NULL) {
return NULL; if ($datum == NULL)
return NULL;
if (strpos($datum, "-") !== false) if (str_contains($datum, "-"))
$trennzeichen = "-"; $trennzeichen = "-";
else else
$trennzeichen = "."; $trennzeichen = ".";
$t = explode($trennzeichen, $datum); $t = explode($trennzeichen, $datum);
$n = count($t); $n = count($t);
if ($n == 1) { if ($n == 1) {
$s = $t[0]; $s = $t[0];
if (strlen($s) < 8) if (strlen($s) < 8)
return NULL; return NULL;
$jahr = intval(substr($s, 0, 4)); $jahr = intval(substr($s, 0, 4));
$monat = intval(substr($s, 4, 2)); $monat = intval(substr($s, 4, 2));
$tag = intval(substr($s, 6, 2)); $tag = intval(substr($s, 6, 2));
} } else if ($n == 3) {
else if ($n == 3) { if ($trennzeichen != ".") {
if ($trennzeichen != ".") { $jahr = intval($t[0]);
$jahr = intval($t[0]); if (strlen($t[0]) <= 2)
if (strlen($t[0]) <= 2) $jahr += 1900;
$jahr += 1900; $monat = intval($t[1]);
$monat = intval($t[1]); $tag = intval($t[2]);
$tag = intval($t[2]); } else {
} $tag = intval($t[0]);
else { $monat = intval($t[1]);
$tag = intval($t[0]); $jahr = intval($t[2]);
$monat = intval($t[1]); if (strlen($t[2]) <= 2)
$jahr = intval($t[2]); $jahr += 1900;
if (strlen($t[2]) <= 2) }
$jahr += 1900; } else
} return NULL;
}
else
return NULL;
if (!checkdate($monat, $tag, $jahr)) if (!checkdate($monat, $tag, $jahr))
return NULL; return NULL;
return sprintf("%04d-%02d-%02d", $jahr, $monat, $tag);; return sprintf("%04d-%02d-%02d", $jahr, $monat, $tag);
} }
function normalisierteUhrzeit($uhrzeit) { function normalisierteUhrzeit($uhrzeit): ?string
if ($uhrzeit == NULL) {
return NULL; if ($uhrzeit == NULL)
return NULL;
if (strpos($uhrzeit, "-") !== FALSE) if (str_contains($uhrzeit, "-"))
$trennzeichen = "-"; $trennzeichen = "-";
else else
$trennzeichen = ":"; $trennzeichen = ":";
$t = explode($trennzeichen, $uhrzeit); $t = explode($trennzeichen, $uhrzeit);
$n = count($t); $n = count($t);
if ($n == 1) { if ($n == 1) {
$s = $t[0]; $s = $t[0];
$len = strlen($s); $len = strlen($s);
if ($len != 4 && $len != 6) if ($len != 4 && $len != 6)
return NULL; return NULL;
$stunden = intval(substr($s, 0, 2)); $stunden = intval(substr($s, 0, 2));
$minuten = intval(substr($s, 2, 2)); $minuten = intval(substr($s, 2, 2));
$sekunden = $len != 6 ? 0 : intval(substr($s, 4, 2)); $sekunden = $len != 6 ? 0 : intval(substr($s, 4, 2));
} } else if ($n == 2 || $n == 3) {
else if ($n == 2 || $n == 3) { $stunden = intval($t[0]);
$stunden = intval($t[0]); $minuten = intval($t[1]);
$minuten = intval($t[1]); $sekunden = $n != 3 ? 0 : intval($t[2]);
$sekunden = $n != 3 ? 0 : intval($t[2]); } else
} return NULL;
else
return NULL;
if ($stunden < 0 || $stunden > 23 || $minuten < 0 || $minuten > 59 || $sekunden < 0 || $sekunden > 59) if ($stunden < 0 || $stunden > 23 || $minuten < 0 || $minuten > 59 || $sekunden < 0 || $sekunden > 59)
return NULL; return NULL;
return sprintf("%02d:%02d:%02d", $stunden, $minuten, $sekunden);; return sprintf("%02d:%02d:%02d", $stunden, $minuten, $sekunden);
} }
function runden_detailliert_invers($runden) { function runden_detailliert_invers($runden): ?string
if ($runden == null) {
return null; if ($runden == null)
$runden_invers = ""; return null;
$saetze = explode(" ", $runden); $runden_invers = "";
foreach ($saetze as $satz) {
$punkte = explode(":", $satz);
if (!empty($runden_invers))
$runden_invers .= " ";
$runden_invers .= $punkte[1] . ":" . $punkte[0];
}
return $runden_invers;
}
function runden_detailliert_auswertung($runden) {
$ergebnis = 0;
$heim_saetze = 0;
$unentschieden_saetze = 0;
$gast_saetze = 0;
$heim_punkte = 0;
$gast_punkte = 0;
if ($runden != null) {
$saetze = explode(" ", $runden); $saetze = explode(" ", $runden);
foreach ($saetze as $satz) { foreach ($saetze as $satz) {
$punkte = explode(":", $satz); $punkte = explode(":", $satz);
$heim_punkte += (int)$punkte[0]; if (!empty($runden_invers))
$gast_punkte += (int)$punkte[1]; $runden_invers .= " ";
if ($punkte[0] > $punkte[1]) $runden_invers .= $punkte[1] . ":" . $punkte[0];
$heim_saetze++;
else if ($punkte[0] < $punkte[1])
$gast_saetze++;
else
$unentschieden_saetze++;
} }
if ($heim_saetze > $gast_saetze) return $runden_invers;
$ergebnis = 1; }
else if ($heim_saetze < $gast_saetze)
$ergebnis = 2; function runden_detailliert_auswertung($runden): array
} {
return array($ergebnis, $heim_saetze, $unentschieden_saetze, $gast_saetze, $heim_punkte, $gast_punkte); $ergebnis = 0;
$heim_saetze = 0;
$unentschieden_saetze = 0;
$gast_saetze = 0;
$heim_punkte = 0;
$gast_punkte = 0;
if ($runden != null) {
$saetze = explode(" ", $runden);
foreach ($saetze as $satz) {
$punkte = explode(":", $satz);
$heim_punkte += (int)$punkte[0];
$gast_punkte += (int)$punkte[1];
if ($punkte[0] > $punkte[1])
$heim_saetze++;
else if ($punkte[0] < $punkte[1])
$gast_saetze++;
else
$unentschieden_saetze++;
}
if ($heim_saetze > $gast_saetze)
$ergebnis = 1;
else if ($heim_saetze < $gast_saetze)
$ergebnis = 2;
}
return array($ergebnis, $heim_saetze, $unentschieden_saetze, $gast_saetze, $heim_punkte, $gast_punkte);
} }
// pass two file names // pass two file names
// returns TRUE if files are the same, FALSE otherwise // returns TRUE if files are the same, FALSE otherwise
function files_identical($fn1, $fn2) { function files_identical($fn1, $fn2): bool
if(!is_file($fn1) || !is_file($fn2)) {
return FALSE; if (!is_file($fn1) || !is_file($fn2))
return FALSE;
if(filesize($fn1) !== filesize($fn2)) if (filesize($fn1) !== filesize($fn2))
return FALSE; return FALSE;
if(!$fp1 = fopen($fn1, 'rb')) if (!$fp1 = fopen($fn1, 'rb'))
return FALSE; return FALSE;
if(!$fp2 = fopen($fn2, 'rb')) { if (!$fp2 = fopen($fn2, 'rb')) {
fclose($fp1); fclose($fp1);
return FALSE; return FALSE;
} }
$same = TRUE; $same = TRUE;
while (!feof($fp1) and !feof($fp2)) while (!feof($fp1) and !feof($fp2))
if(fread($fp1, 4096) !== fread($fp2, 4096)) { if (fread($fp1, 4096) !== fread($fp2, 4096)) {
$same = FALSE; $same = FALSE;
break; break;
} }
if(feof($fp1) !== feof($fp2)) if (feof($fp1) !== feof($fp2))
$same = FALSE; $same = FALSE;
fclose($fp1); fclose($fp1);
fclose($fp2); fclose($fp2);
return $same; return $same;
} }
?>
@@ -0,0 +1,475 @@
<?php
use JetBrains\PhpStorm\NoReturn;
use Joomla\CMS\Application\SiteApplication;
use Joomla\CMS\Factory;
use Joomla\CMS\Uri\Uri;
use Joomla\Filesystem\File;
use Joomla\Filesystem\Folder;
require_once JPATH_SITE . '/components/com_sportsmanager/database/util.php';
const SPORTSMANAGER_JOOMLA_PATH = JPATH_ROOT;
define("SPORTSMANAGER_JOOMLA_URL", Uri::base());
function bildKopierenAngepasst($quelle, $ziel, $ziel_breite, $ziel_hoehe, $zuschneiden): bool
{
$len = strlen($ziel);
if ($len < 4 || $ziel[$len - 4] != ".")
return false;
$ext = strtolower(substr($ziel, $len - 3));
if ($ext != "jpg" && $ext != "png")
return false;
$quelle_image = $ext == "png" ? imagecreatefrompng($quelle) : imagecreatefromjpeg($quelle);
if ($quelle_image === false)
return false;
$quelle_breite = imagesx($quelle_image);
$quelle_hoehe = imagesy($quelle_image);
if ($quelle_breite == $ziel_breite && $quelle_hoehe == $ziel_hoehe)
return File::copy($quelle, $ziel);
$ziel_image = imagecreatetruecolor($ziel_breite, $ziel_hoehe);
$hintergrund = $ext == "png" ? imagecolorallocatealpha($ziel_image, 0, 0, 0, 127) : imagecolorallocate($ziel_image, 64, 64, 64);
imagefill($ziel_image, 0, 0, $hintergrund);
$quelle_proportionen = $quelle_breite / $quelle_hoehe;
$ziel_proportionen = $ziel_breite / $ziel_hoehe;
if ($zuschneiden) {
if ($ziel_proportionen >= $quelle_proportionen) {
$quelle_teilhoehe = round($quelle_breite / $ziel_proportionen);
if (!imagecopyresampled($ziel_image, $quelle_image, 0, 0, 0, round(($quelle_hoehe - $quelle_teilhoehe) / 2), $ziel_breite, $ziel_hoehe, $quelle_breite, $quelle_teilhoehe))
return false;
} else {
$quelle_teilbreite = round($quelle_hoehe * $ziel_proportionen);
if (!imagecopyresampled($ziel_image, $quelle_image, 0, 0, round(($quelle_breite - $quelle_teilbreite) / 2), 0, $ziel_breite, $ziel_hoehe, $quelle_teilbreite, $quelle_hoehe))
return false;
}
} else {
if ($ziel_proportionen >= $quelle_proportionen) {
$ziel_teilbreite = round($ziel_hoehe * $quelle_proportionen);
if (!imagecopyresampled($ziel_image, $quelle_image, round(($ziel_breite - $ziel_teilbreite) / 2), 0, 0, 0, $ziel_teilbreite, $ziel_hoehe, $quelle_breite, $quelle_hoehe))
return false;
} else {
$ziel_teilhoehe = round($ziel_breite / $quelle_proportionen);
if (!imagecopyresampled($ziel_image, $quelle_image, 0, round(($ziel_hoehe - $ziel_teilhoehe) / 2), 0, 0, $ziel_breite, $ziel_teilhoehe, $quelle_breite, $quelle_hoehe))
return false;
}
}
ob_start();
if ($ext == "png") {
imagesavealpha($ziel_image, true);
if (!imagepng($ziel_image))
return false;
} else {
if (!imagejpeg($ziel_image))
return false;
}
$output = ob_get_contents();
ob_end_clean();
File::write($ziel, $output);
return true;
}
#[NoReturn] function bildAnpassen($typ, $id = 0): void
{
$jInput = Factory::getContainer()->get(SiteApplication::class)->input;
if (empty($id))
$id = $jInput->get('id', 0, 'INT');
$fixed_width = $jInput->get('w', 0, 'INT');
$fixed_height = $jInput->get('h', 0, 'INT');
$max_width = $jInput->get('mw', 0, 'INT');
$max_height = $jInput->get('mh', 0, 'INT');
$no_cache = $jInput->get('nc', 0, 'INT');
$pfad = SPORTSMANAGER_JOOMLA_PATH . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . 'sportsmanager' . DIRECTORY_SEPARATOR . $typ . DIRECTORY_SEPARATOR . $id . '.';
if (file_exists($pfad . 'png') && is_file($pfad . 'png'))
$ext = "png";
else if (file_exists($pfad . 'png') && is_file($pfad . 'png'))
$ext = "jpg";
else {
ob_end_clean(); // Wegen UTF-8-Zeichen, die in der ausgabe vorhanden sind
header('HTTP/1.1 404 Not Found');
die();
}
$filemtime = filemtime($pfad . $ext);
$last_modified = gmdate('D, d M Y H:i:s', $filemtime) . " GMT";
$etag = md5($id . '.' . $ext . $filemtime);
// Prüfung, ob die im Browsercache vorhandene Datei der hiesigen entspricht
if ($_SERVER['HTTP_IF_NONE_MATCH'] == '"' . $etag . '"' || $last_modified == $_SERVER['HTTP_IF_MODIFIED_SINCE']) {
ob_end_clean(); // Wegen UTF-8-Zeichen, die in der ausgabe vorhanden sind
header('HTTP/1.1 304 Not Modified');
if ($no_cache)
header("Cache-Control: must-revalidate"); // Bewirkt, dass der Browser jedesmal die Datei neu prüft
else
header("Cache-Control: max-age=2592000"); // Bewirkt, dass nach dreißig Tagen die Datei vom Browser auf eine Aktualisierung geprüft wird.
header("Last-Modified: " . $last_modified);
header('ETag: "' . $etag . '"');
die();
}
$image = $ext == "png" ? imagecreatefrompng($pfad . $ext) : imagecreatefromjpeg($pfad . $ext);
if ($image === false) {
ob_end_clean(); // Wegen UTF-8-Zeichen, die in der ausgabe vorhanden sind
header('HTTP/1.1 404 Not Found');
die();
}
ob_end_clean(); // Wegen UTF-8-Zeichen, die in der ausgabe vorhanden sind
header("Content-type: image/" . ($ext == "png" ? "png" : "jpeg"));
if ($no_cache)
header("Cache-Control: must-revalidate"); // Bewirkt, dass der Browser jedesmal die Datei neu prüft
else
header("Cache-Control: max-age=2592000"); // Bewirkt, dass nach dreißig Tagen die Datei vom Browser auf eine Aktualisierung geprüft wird.
header("Last-Modified: " . $last_modified);
header('ETag: "' . $etag . '"');
$width = imagesx($image);
$height = imagesy($image);
if (($fixed_width == 0 || $width == $fixed_width) && ($fixed_height == 0 || $height == $fixed_height) && ($fixed_width != 0 || $max_width == 0 || $width <= $max_width) && ($fixed_height != 0 || $max_height == 0 || $height <= $max_height)) {
if ($ext == "png") {
imagesavealpha($image, true);
imagepng($image);
} else
imagejpeg($image);
die();
}
$new_width = $width;
$new_height = $height;
if ($max_height > 0 && $new_height > $max_height) {
$new_width = max(round($new_width * $max_height / $new_height), 1);
$new_height = $max_height;
}
if ($max_width > 0 && $new_width > $max_width) {
$new_height = max(round($new_height * $max_width / $new_width), 1);
$new_width = $max_width;
}
if ($max_width > 0 && (($max_width - $new_width) % 2) == 1) // Toleranz bei nur 1 Pixel Unterschied
$new_width += 1;
if ($max_height > 0 && (($max_height - $new_height) % 2) == 1) // Toleranz bei nur 1 Pixel Unterschied
$new_height += 1;
$image_resized = imagecreatetruecolor(max($fixed_width, $new_width), max($fixed_height, $new_height));
$color = $ext == "png" ? imagecolorallocatealpha($image_resized, 0, 0, 0, 127) : imagecolorallocate($image_resized, 64, 64, 64);
imagefill($image_resized, 0, 0, $color);
imagecopyresampled($image_resized, $image, round((imagesx($image_resized) - $new_width) / 2), round((imagesy($image_resized) - $new_height) / 2), 0, 0, $new_width, $new_height, $width, $height);
if ($ext == "png") {
imagesavealpha($image_resized, true);
imagepng($image_resized);
} else
imagejpeg($image_resized);
die();
}
function bildLoeschen($typ, $id): void
{
$typ_exploded = explode("/", $typ);
$typ = $typ_exploded[0];
$typ_prefix = count($typ_exploded) > 1 ? $typ_exploded[1] : "";
$bilder_pfad = SPORTSMANAGER_JOOMLA_PATH . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . 'sportsmanager' . DIRECTORY_SEPARATOR . $typ;
$pfad = $bilder_pfad . '/' . $typ_prefix . $id . ".";
if (!is_file($pfad . 'png') && !is_file($pfad . 'jpg'))
return;
$alte_bilder = Folder::files($bilder_pfad, '^' . $typ_prefix . $id . '\.|^' . $typ_prefix . 'I' . $id . 'T');
foreach ($alte_bilder as $fn)
File::delete($bilder_pfad . DIRECTORY_SEPARATOR . $fn);
}
function bildIdentisch($typ1, $id1, $typ2, $id2): bool
{
$typ1_exploded = explode("/", $typ1);
$typ1 = $typ1_exploded[0];
$typ1_prefix = count($typ1_exploded) > 1 ? $typ1_exploded[1] : "";
$bilder_pfad1 = SPORTSMANAGER_JOOMLA_PATH . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . 'sportsmanager' . DIRECTORY_SEPARATOR . $typ1;
$pfad1 = $bilder_pfad1 . '/' . $typ1_prefix . $id1 . ".";
if (is_file($pfad1 . "png"))
$ext = "png";
else if (is_file($pfad1 . "jpg"))
$ext = "jpg";
else
$ext = "";
$pfad1 .= $ext;
$typ2_exploded = explode("/", $typ2);
$typ2 = $typ2_exploded[0];
$typ2_prefix = count($typ2_exploded) > 1 ? $typ2_exploded[1] : "";
$bilder_pfad2 = SPORTSMANAGER_JOOMLA_PATH . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . 'sportsmanager' . DIRECTORY_SEPARATOR . $typ2;
$pfad2 = $bilder_pfad2 . '/' . $typ2_prefix . $id2 . "." . $ext;
return files_identical($pfad1, $pfad2);
}
function teamImage($teamId, $vereinId, $width = 240, $height = 240): ?string
{
$url = bildURL("mannschaften", $teamId, 0, 0, $width, $height);
if ($url == null) {
$url = bildURL("vereine", $vereinId, 0, 0, $width, $height);
}
return $url;
}
function playerImage($playerId, $gender, $width = 180, $height = 240): ?string
{
$url = bildURL("spieler", $playerId, $width, $height, 0,0, $gender == 'M' ? 'm' : 'w');
if ($url == null) {
$url = bildURL("mannschaftsmitglieder", $playerId, $width, $height);
}
return $url;
}
#[NoReturn] function spielerbild(): void
{
$db = getDatabase();
$jInput = Factory::getContainer()->get(SiteApplication::class)->input;
$spielernr = $db->escape(trim($jInput->get('spielernr', '', 'RAW')));
$lizenznr = $db->escape(trim($jInput->get('lizenznr', '', 'RAW')));
if (empty($spielernr) && empty($lizenznr)) {
ob_end_clean(); // Wegen UTF-8-Zeichen, die in der ausgabe vorhanden sind
header('HTTP/1.1 404 Not Found');
die();
}
$query = "SELECT spieler_id"
. "\n FROM #__sportsmanager_spieler"
. "\n WHERE NOT ISNULL(aktueller_verein_id) AND NOT bild_ausblenden" . (!empty($spielernr) ? " AND spielernr = '$spielernr'" : " AND lizenznr = '$lizenznr'")
. "\n ORDER BY spieler_id DESC";
$rows = loadObjectList($db, $query);
if (count($rows) < 1) {
ob_end_clean(); // Wegen UTF-8-Zeichen, die in der ausgabe vorhanden sind
header('HTTP/1.1 404 Not Found');
die();
}
$id = $rows[0]->spieler_id;
bildAnpassen("spieler", $id);
}
function bildURL($typ, $id, $fixed_width = 0, $fixed_height = 0, $max_width = 0, $max_height = 0, $alternativ = ""): ?string
{
$typ_exploded = explode("/", $typ);
$typ = $typ_exploded[0];
$typ_prefix = count($typ_exploded) > 1 ? $typ_exploded[1] : "";
$pfad = SPORTSMANAGER_JOOMLA_PATH . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . ".";
if (is_file($pfad . "png"))
$ext = "png";
else if (is_file($pfad . "jpg"))
$ext = "jpg";
else if (!empty($alternativ)) {
$id = $alternativ;
$pfad = SPORTSMANAGER_JOOMLA_PATH . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . ".";
if (is_file($pfad . "png"))
$ext = "png";
else if (is_file($pfad . "jpg"))
$ext = "jpg";
else
return null;
}
else
return null;
$time = filemtime($pfad . $ext);
if ($fixed_width > 0 && $fixed_height > 0) {
$pfad_angepasst = SPORTSMANAGER_JOOMLA_PATH . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . "I" . $id . "T" . $time . "W" . $fixed_width . "H" . $fixed_height . "." . $ext;
if (is_file($pfad_angepasst)) {
return SPORTSMANAGER_JOOMLA_URL . 'images/sportsmanager/' . $typ . '/' . basename($pfad_angepasst);
}
}
$size = getimagesize($pfad . $ext);
$width = $size[0];
$height = $size[1];
$max_width = $fixed_width > 0 ? $fixed_width : $max_width;
$max_height = $fixed_height > 0 ? $fixed_height : $max_height;
if (($fixed_width == 0 || $width == $fixed_width) && ($fixed_height == 0 || $height == $fixed_height) && ($fixed_width != 0 || $max_width == 0 || $width <= $max_width) && ($fixed_height != 0 || $max_height == 0 || $height <= $max_height)) {
$pfad_angepasst = SPORTSMANAGER_JOOMLA_PATH . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . "I" . $id . "T" . $time . "W" . $width . "H" . $height . "." . $ext;
if (!is_file($pfad_angepasst)) {
if (!copy($pfad . $ext, $pfad_angepasst))
return null;
}
return SPORTSMANAGER_JOOMLA_URL . 'images/sportsmanager/' . $typ . '/' . basename($pfad_angepasst);
}
$new_width = $width;
$new_height = $height;
if ($max_height > 0 && $new_height > $max_height) {
$new_width = max(round($new_width * $max_height / $new_height), 1);
$new_height = $max_height;
}
if ($max_width > 0 && $new_width > $max_width) {
$new_height = max(round($new_height * $max_width / $new_width), 1);
$new_width = $max_width;
}
if ($max_width > 0 && (($max_width - $new_width) % 2) == 1) // Toleranz bei nur 1 Pixel Unterschied
$new_width += 1;
if ($max_height > 0 && (($max_height - $new_height) % 2) == 1) // Toleranz bei nur 1 Pixel Unterschied
$new_height += 1;
$pfad_angepasst = SPORTSMANAGER_JOOMLA_PATH . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . "I" . $id . "T" . $time . "W" . max($fixed_width, $new_width) . "H" . max($fixed_height, $new_height) . "." . $ext;
if (!is_file($pfad_angepasst)) {
$image = $ext == "png" ? imagecreatefrompng($pfad . $ext) : imagecreatefromjpeg($pfad . $ext);
if ($image === false)
return null;
$image_resized = imagecreatetruecolor(max($fixed_width, $new_width), max($fixed_height, $new_height));
$color = $ext == "png" ? imagecolorallocatealpha($image_resized, 0, 0, 0, 127) : imagecolorallocate($image_resized, 64, 64, 64);
imagefill($image_resized, 0, 0, $color);
imagecopyresampled($image_resized, $image, round((imagesx($image_resized) - $new_width) / 2), round((imagesy($image_resized) - $new_height) / 2), 0, 0, $new_width, $new_height, $width, $height);
if ($ext == "png") {
imagesavealpha($image_resized, true);
imagepng($image_resized, $pfad_angepasst);
}
else
imagejpeg($image_resized, $pfad_angepasst);
}
return SPORTSMANAGER_JOOMLA_URL . 'images/sportsmanager/' . $typ . '/' . basename($pfad_angepasst);
}
/*
* #resize=250
#resize=250,250,blue
#resize=250,250,blue
#resize=250,250&sizes=60%,80%,200%
#resize=250,250,cover&sizes=60%,80%,200%
#resize=250,250,fill&sizes=60%,80%,200%
#crop=250,250,center,top
#crop=250,250
#crop=250,250,center,bottom
#crop=250,250,left
#crop=250,250,right
*/
function yoothemeBild($typ, $id, $alternativ, $zusatz = ""): ?string
{
$typ_exploded = explode("/", $typ);
$typ = $typ_exploded[0];
$typ_prefix = count($typ_exploded) > 1 ? $typ_exploded[1] : "";
$pfad = SPORTSMANAGER_JOOMLA_PATH . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . ".";
if (is_file($pfad . "png"))
$ext = "png";
else if (is_file($pfad . "jpg"))
$ext = "jpg";
else if (!empty($alternativ)) {
$id = $alternativ;
$pfad = SPORTSMANAGER_JOOMLA_PATH . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . ".";
if (is_file($pfad . "png"))
$ext = "png";
else if (is_file($pfad . "jpg"))
$ext = "jpg";
else
return null;
}
else
return null;
$bildpfad = SPORTSMANAGER_JOOMLA_URL . "images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . "." . $ext;
return '<img class="el-image" data-src="' . $bildpfad . '" ' . $zusatz . ' uk-img />';
}
function bildHTML($typ, $id, $fixed_width = 0, $fixed_height = 0, $max_width = 0, $max_height = 0, $zusatz = "", $alternativ = ""): ?string
{
$typ_exploded = explode("/", $typ);
$typ = $typ_exploded[0];
$typ_prefix = count($typ_exploded) > 1 ? $typ_exploded[1] : "";
$pfad = SPORTSMANAGER_JOOMLA_PATH . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . ".";
if (is_file($pfad . "png"))
$ext = "png";
else if (is_file($pfad . "jpg"))
$ext = "jpg";
else if (!empty($alternativ)) {
$id = $alternativ;
$pfad = SPORTSMANAGER_JOOMLA_PATH . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . ".";
if (is_file($pfad . "png"))
$ext = "png";
else if (is_file($pfad . "jpg"))
$ext = "jpg";
else
return null;
}
else
return null;
$time = filemtime($pfad . $ext);
if ($fixed_width > 0 && $fixed_height > 0) {
$pfad_angepasst = SPORTSMANAGER_JOOMLA_PATH . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . "I" . $id . "T" . $time . "W" . $fixed_width . "H" . $fixed_height . "." . $ext;
if (is_file($pfad_angepasst)) {
return '<img src="' . SPORTSMANAGER_JOOMLA_URL . 'images/sportsmanager/' . $typ . '/' . basename($pfad_angepasst) . '" width="' . $fixed_width . '" height="' . $fixed_height . '" ' . $zusatz . ' />';
}
}
$size = getimagesize($pfad . $ext);
$width = $size[0];
$height = $size[1];
$max_width = $fixed_width > 0 ? $fixed_width : $max_width;
$max_height = $fixed_height > 0 ? $fixed_height : $max_height;
if (($fixed_width == 0 || $width == $fixed_width) && ($fixed_height == 0 || $height == $fixed_height) && ($fixed_width != 0 || $max_width == 0 || $width <= $max_width) && ($fixed_height != 0 || $max_height == 0 || $height <= $max_height)) {
$pfad_angepasst = SPORTSMANAGER_JOOMLA_PATH . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . "I" . $id . "T" . $time . "W" . $width . "H" . $height . "." . $ext;
if (!is_file($pfad_angepasst)) {
if (!copy($pfad . $ext, $pfad_angepasst))
return null;
}
return '<img src="' . SPORTSMANAGER_JOOMLA_URL . 'images/sportsmanager/' . $typ . '/' . basename($pfad_angepasst) . '" width="' . $width . '" height="' . $height . '" ' . $zusatz . ' />';
}
$new_width = $width;
$new_height = $height;
if ($max_height > 0 && $new_height > $max_height) {
$new_width = max(round($new_width * $max_height / $new_height), 1);
$new_height = $max_height;
}
if ($max_width > 0 && $new_width > $max_width) {
$new_height = max(round($new_height * $max_width / $new_width), 1);
$new_width = $max_width;
}
if ($max_width > 0 && (($max_width - $new_width) % 2) == 1) // Toleranz bei nur 1 Pixel Unterschied
$new_width += 1;
if ($max_height > 0 && (($max_height - $new_height) % 2) == 1) // Toleranz bei nur 1 Pixel Unterschied
$new_height += 1;
$pfad_angepasst = SPORTSMANAGER_JOOMLA_PATH . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . "I" . $id . "T" . $time . "W" . max($fixed_width, $new_width) . "H" . max($fixed_height, $new_height) . "." . $ext;
if (!is_file($pfad_angepasst)) {
$image = $ext == "png" ? imagecreatefrompng($pfad . $ext) : imagecreatefromjpeg($pfad . $ext);
if ($image === false)
return null;
$image_resized = imagecreatetruecolor(max($fixed_width, $new_width), max($fixed_height, $new_height));
$color = $ext == "png" ? imagecolorallocatealpha($image_resized, 0, 0, 0, 127) : imagecolorallocate($image_resized, 64, 64, 64);
imagefill($image_resized, 0, 0, $color);
imagecopyresampled($image_resized, $image, round((imagesx($image_resized) - $new_width) / 2), round((imagesy($image_resized) - $new_height) / 2), 0, 0, $new_width, $new_height, $width, $height);
if ($ext == "png") {
imagesavealpha($image_resized, true);
imagepng($image_resized, $pfad_angepasst);
}
else
imagejpeg($image_resized, $pfad_angepasst);
}
return '<img src="' . SPORTSMANAGER_JOOMLA_URL . 'images/sportsmanager/' . $typ . '/' . basename($pfad_angepasst) . '" width="' . max($fixed_width, $new_width) . '" height="' . max($fixed_height, $new_height) . '" ' . $zusatz . ' />';
}
@@ -0,0 +1,6 @@
<?php // do not change this file, this is automatically updated while building releases, see .github/workflows/build_release.yml
defined('_JEXEC') or die;
return [
'version' => 'DEV',
'date' => '2025-08-05',
];
@@ -1,5 +0,0 @@
[.ShellClassInfo]
InfoTip=Dieser Ordner wird online freigegeben.
IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe
IconIndex=16
@@ -1,5 +0,0 @@
[.ShellClassInfo]
InfoTip=Dieser Ordner wird online freigegeben.
IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe
IconIndex=16
@@ -1,5 +0,0 @@
[.ShellClassInfo]
InfoTip=Dieser Ordner wird online freigegeben.
IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe
IconIndex=16
File diff suppressed because it is too large Load Diff
@@ -1,204 +1,218 @@
<?php <?php
use JetBrains\PhpStorm\NoReturn;
defined('_JEXEC') or die('Restricted access'); defined('_JEXEC') or die('Restricted access');
require_once(JPATH_COMPONENT . DIRECTORY_SEPARATOR . 'views/sportsmanager/view_tools.php'); require_once JPATH_SITE . '/components/com_sportsmanager/views/sportsmanager/view_tools.php';
require_once JPATH_SITE . '/components/com_sportsmanager/util/image.php';
class JSON_sportsmanager { class JSON_sportsmanager
{
static function mannschaften($veranstaltung, $rows) { static function mannschaften($veranstaltung, $rows): array
$teams = []; {
foreach ($rows as $team) { $teams = [];
$team->teambild = teamImage($team->team_id, $team->verein_id); foreach ($rows as $team) {
$teams[] = $team; $team->teambild = teamImage($team->team_id, $team->verein_id);
} $teams[] = $team;
if ($veranstaltung == null) {
return $teams;
}
return [
'veranstaltung' => $veranstaltung,
'teams' => $teams,
];
}
static function tabelleAnzeigen($veranstaltung, $modus, $teams, $spieltag, $spieltage, $alleine_angezeigt, $praesentation) {
foreach ($teams as $team) {
$team->teambild = teamImage($team->team_id, $team->verein_id);
}
return [
'tabelle' => $teams,
'modus' => $modus,
];
}
static function tabelleEigeneAnzeigen($veranstaltung, $modus, $teams, $alleine_angezeigt, $praesentation) {
foreach($teams as $team) {
$team->teambild = teamImage($team->team_id, $team->verein_id);
} }
return [ if ($veranstaltung == null) {
'tabelle' => $teams, return $teams;
}
return [
'veranstaltung' => $veranstaltung,
'teams' => $teams,
];
}
static function tabelleAnzeigen($modus, $teams): array
{
foreach ($teams as $team) {
$team->teambild = teamImage($team->team_id, $team->verein_id);
}
return [
'tabelle' => $teams,
'modus' => $modus, 'modus' => $modus,
]; ];
} }
static function _getPlayerDetails($game, $home_player_map, $away_player_map) { static function tabelleEigeneAnzeigen($modus, $teams): array
// TODO dynamisch machen {
$game->heim_spieler_1_vorname = isset($home_player_map[$game->heim_spieler_1_id]) foreach ($teams as $team) {
? $home_player_map[$game->heim_spieler_1_id]->vorname $team->teambild = teamImage($team->team_id, $team->verein_id);
: NULL; }
$game->heim_spieler_1_nachname = isset($home_player_map[$game->heim_spieler_1_id]) return [
? $home_player_map[$game->heim_spieler_1_id]->nachname 'tabelle' => $teams,
: NULL; 'modus' => $modus,
$game->heim_spieler_1_bild = isset($home_player_map[$game->heim_spieler_1_id]) ];
? $home_player_map[$game->heim_spieler_1_id]->bild }
: NULL;
$game->heim_spieler_2_vorname = isset($home_player_map[$game->heim_spieler_2_id]) static function _getPlayerDetails($game, $home_player_map, $away_player_map): void
? $home_player_map[$game->heim_spieler_2_id]->vorname {
: NULL; // TODO dynamisch machen
$game->heim_spieler_2_nachname = isset($home_player_map[$game->heim_spieler_2_id]) $game->heim_spieler_1_vorname = isset($home_player_map[$game->heim_spieler_1_id])
? $home_player_map[$game->heim_spieler_2_id]->nachname ? $home_player_map[$game->heim_spieler_1_id]->vorname
: NULL; : NULL;
$game->heim_spieler_2_bild = isset($home_player_map[$game->heim_spieler_2_id]) $game->heim_spieler_1_nachname = isset($home_player_map[$game->heim_spieler_1_id])
? $home_player_map[$game->heim_spieler_2_id]->bild ? $home_player_map[$game->heim_spieler_1_id]->nachname
: NULL; : NULL;
$game->heim_spieler_1_bild = isset($home_player_map[$game->heim_spieler_1_id])
? $home_player_map[$game->heim_spieler_1_id]->bild
: NULL;
$game->gast_spieler_1_vorname = isset($away_player_map[$game->gast_spieler_1_id]) $game->heim_spieler_2_vorname = isset($home_player_map[$game->heim_spieler_2_id])
? $away_player_map[$game->gast_spieler_1_id]->vorname ? $home_player_map[$game->heim_spieler_2_id]->vorname
: NULL; : NULL;
$game->gast_spieler_1_nachname = isset($away_player_map[$game->gast_spieler_1_id]) $game->heim_spieler_2_nachname = isset($home_player_map[$game->heim_spieler_2_id])
? $away_player_map[$game->gast_spieler_1_id]->nachname ? $home_player_map[$game->heim_spieler_2_id]->nachname
: NULL; : NULL;
$game->gast_spieler_1_bild = isset($away_player_map[$game->gast_spieler_1_id]) $game->heim_spieler_2_bild = isset($home_player_map[$game->heim_spieler_2_id])
? $away_player_map[$game->gast_spieler_1_id]->bild ? $home_player_map[$game->heim_spieler_2_id]->bild
: NULL; : NULL;
$game->gast_spieler_2_vorname = isset($away_player_map[$game->gast_spieler_2_id]) $game->gast_spieler_1_vorname = isset($away_player_map[$game->gast_spieler_1_id])
? $away_player_map[$game->gast_spieler_2_id]->vorname ? $away_player_map[$game->gast_spieler_1_id]->vorname
: NULL; : NULL;
$game->gast_spieler_2_nachname = isset($away_player_map[$game->gast_spieler_2_id]) $game->gast_spieler_1_nachname = isset($away_player_map[$game->gast_spieler_1_id])
? $away_player_map[$game->gast_spieler_2_id]->nachname ? $away_player_map[$game->gast_spieler_1_id]->nachname
: NULL; : NULL;
$game->gast_spieler_2_bild = isset($away_player_map[$game->gast_spieler_2_id]) $game->gast_spieler_1_bild = isset($away_player_map[$game->gast_spieler_1_id])
? $away_player_map[$game->gast_spieler_2_id]->bild ? $away_player_map[$game->gast_spieler_1_id]->bild
: NULL; : NULL;
} $game->gast_spieler_2_vorname = isset($away_player_map[$game->gast_spieler_2_id])
? $away_player_map[$game->gast_spieler_2_id]->vorname
: NULL;
$game->gast_spieler_2_nachname = isset($away_player_map[$game->gast_spieler_2_id])
? $away_player_map[$game->gast_spieler_2_id]->nachname
: NULL;
$game->gast_spieler_2_bild = isset($away_player_map[$game->gast_spieler_2_id])
? $away_player_map[$game->gast_spieler_2_id]->bild
: NULL;
static function adminEditBegegnungSpielplan($bestaetigen, $veranstaltung, $begegnung, $heim_team, $gast_team, $spiele, $heim_spieler, $gast_spieler, $teamspiel_modus, $encrypted_pin, $count_verlegen_aktionen, $erneut_oeffnen, $aus_uebersicht) { }
$heim_team->teambild = teamImage($heim_team->team_id, $heim_team->verein_id);
$gast_team->teambild = teamImage($gast_team->team_id, $gast_team->verein_id); static function adminEditBegegnungSpielplan($bestaetigen, $veranstaltung, $begegnung, $heim_team, $gast_team, $spiele, $heim_spieler, $gast_spieler, $teamspiel_modus): array
$heim_spieler_map = []; {
$gast_spieler_map = []; $heim_team->teambild = teamImage($heim_team->team_id, $heim_team->verein_id);
foreach ($heim_spieler as $player) { $gast_team->teambild = teamImage($gast_team->team_id, $gast_team->verein_id);
$player->bild = playerImage($player->spieler_id, $player->geschlecht); $heim_spieler_map = [];
$heim_spieler_map[$player->spieler_id] = $player; $gast_spieler_map = [];
} foreach ($heim_spieler as $player) {
foreach ($gast_spieler as $player) { $player->bild = playerImage($player->spieler_id, $player->geschlecht);
$player->bild = playerImage($player->spieler_id, $player->geschlecht); $heim_spieler_map[$player->spieler_id] = $player;
$gast_spieler_map[$player->spieler_id] = $player; }
} foreach ($gast_spieler as $player) {
$begegnung->bezeichnung = $veranstaltung->bezeichnung; $player->bild = playerImage($player->spieler_id, $player->geschlecht);
$begegnung->veranstaltung_id = $veranstaltung->veranstaltung_id; $gast_spieler_map[$player->spieler_id] = $player;
foreach ($spiele as $game) { }
self::_getPlayerDetails($game, $heim_spieler_map, $gast_spieler_map); $begegnung->bezeichnung = $veranstaltung->bezeichnung;
} $begegnung->veranstaltung_id = $veranstaltung->veranstaltung_id;
foreach ($spiele as $game) {
self::_getPlayerDetails($game, $heim_spieler_map, $gast_spieler_map);
}
$begegnung->spieltag = Rundenbezeichnung($begegnung->spieltag, $veranstaltung->unterteilung == 0); $begegnung->spieltag = Rundenbezeichnung($begegnung->spieltag, $veranstaltung->unterteilung == 0);
return [ return [
'bestaetigen' => $bestaetigen, 'bestaetigen' => $bestaetigen,
'veranstaltung' => $veranstaltung, 'veranstaltung' => $veranstaltung,
'begegnung' => $begegnung, 'begegnung' => $begegnung,
'heim_team' => $heim_team, 'heim_team' => $heim_team,
'gast_team' => $gast_team, 'gast_team' => $gast_team,
'spiele' => $spiele, 'spiele' => $spiele,
'heim_spieler' => $heim_spieler, 'heim_spieler' => $heim_spieler,
'gast_spieler' => $gast_spieler, 'gast_spieler' => $gast_spieler,
'modus' => $teamspiel_modus, 'modus' => $teamspiel_modus,
]; ];
} }
static function mannschaftDetails($veranstaltung, $team, $mitglieder, $mailverteiler, $mitglieder_statistiken, $teamansprechpartner, $begegnungen, $vorheriges_team_id, $naechstes_team_id, $team_moderator, $details_anzeigen, $ansprechpartner_anzeigen, $weitere_veranstaltungen, $veranstaltungsbezeichnungen, $spielberechtigungen, $ansicht_vereinigt, $ist_vergangen) { static function mannschaftDetails($veranstaltung, $team, $mitglieder, $teamansprechpartner, $begegnungen, $ansprechpartner_anzeigen, $veranstaltungsbezeichnungen): array
global $sportsmanager_joomla_path; {
global $sportsmanager_joomla_url; global $sportsmanager_joomla_path;
global $sportsmanager_joomla_url;
$team->teambild = teamImage($team->team_id, $team->verein_id);
$team->color = getColorOfImage(str_replace($sportsmanager_joomla_url, $sportsmanager_joomla_path . '/', $team->teambild)); $team->teambild = teamImage($team->team_id, $team->verein_id);
foreach ($mitglieder as $m) { $team->color = getColorOfImage(str_replace($sportsmanager_joomla_url, $sportsmanager_joomla_path . '/', $team->teambild));
$m->bild = playerImage($m->spieler_id, $m->geschlecht); foreach ($mitglieder as $m) {
} $m->bild = playerImage($m->spieler_id, $m->geschlecht);
foreach ($begegnungen as $begegnung) { }
$begegnung->heim_name = $begegnung->auswaerts == '1' ? $begegnung->gegner : $team->teamname; foreach ($begegnungen as $begegnung) {
$begegnung->heim_name = $begegnung->auswaerts == '1' ? $begegnung->gegner : $team->teamname;
$begegnung->heim_teamgruppe = $begegnung->auswaerts == '1' ? $begegnung->gegner_teamgruppe_id : $team->teamgruppe_id; $begegnung->heim_teamgruppe = $begegnung->auswaerts == '1' ? $begegnung->gegner_teamgruppe_id : $team->teamgruppe_id;
$begegnung->gast_name = $begegnung->auswaerts == '1' ? $team->teamname : $begegnung->gegner; $begegnung->gast_name = $begegnung->auswaerts == '1' ? $team->teamname : $begegnung->gegner;
$begegnung->gast_teamgruppe = $begegnung->auswaerts == '1' ? $team->teamgruppe_id : $begegnung->gegner_teamgruppe_id; $begegnung->gast_teamgruppe = $begegnung->auswaerts == '1' ? $team->teamgruppe_id : $begegnung->gegner_teamgruppe_id;
$begegnung->spielort_name = $begegnung->heimspielort_name; $begegnung->spielort_name = $begegnung->heimspielort_name;
$begegnung->heim_bild = $begegnung->auswaerts == '1' ? teamImage($begegnung->gegner_id, $begegnung->gegner_verein_id) : teamImage($team->team_id, $team->verein_id); $begegnung->heim_bild = $begegnung->auswaerts == '1' ? teamImage($begegnung->gegner_id, $begegnung->gegner_verein_id) : teamImage($team->team_id, $team->verein_id);
$begegnung->gast_bild = $begegnung->auswaerts == '1' ? teamImage($team->team_id, $team->verein_id) : teamImage($begegnung->gegner_id, $begegnung->gegner_verein_id); $begegnung->gast_bild = $begegnung->auswaerts == '1' ? teamImage($team->team_id, $team->verein_id) : teamImage($begegnung->gegner_id, $begegnung->gegner_verein_id);
$begegnung->bezeichnung = $veranstaltungsbezeichnungen[$begegnung->veranstaltung_id]; $begegnung->bezeichnung = $veranstaltungsbezeichnungen[$begegnung->veranstaltung_id];
$begegnung->spieltag = Rundenbezeichnung($begegnung->spieltag, $veranstaltung->unterteilung == 0); $begegnung->spieltag = Rundenbezeichnung($begegnung->spieltag, $veranstaltung->unterteilung == 0);
} }
if (getUserID() == 0 && $ansprechpartner_anzeigen) { if (getUserID() == 0 && $ansprechpartner_anzeigen) {
foreach ($teamansprechpartner as $ansprechpartner) { foreach ($teamansprechpartner as $ansprechpartner) {
unset($ansprechpartner->mobil); unset($ansprechpartner->mobil);
unset($ansprechpartner->telefon); unset($ansprechpartner->telefon);
} }
} }
$team->veranstaltung_name = $veranstaltungsbezeichnungen[$team->veranstaltung_id]; $team->veranstaltung_name = $veranstaltungsbezeichnungen[$team->veranstaltung_id];
return [ return [
'team' => $team, 'team' => $team,
'mitglieder' => $mitglieder, 'mitglieder' => $mitglieder,
'kontakt' => $ansprechpartner_anzeigen ? $teamansprechpartner : NULL, 'kontakt' => $ansprechpartner_anzeigen ? $teamansprechpartner : NULL,
'begegnungen' => $begegnungen 'begegnungen' => $begegnungen
]; ];
} }
static function JSON($data, $meta = NULL) { #[NoReturn] static function JSON($data, $meta = NULL): void
$response = [ {
'data' => $data $response = [
]; 'data' => $data
if ($meta != NULL) { ];
$response['meta'] = $meta; if ($meta != NULL) {
} $response['meta'] = $meta;
header('Content-Type: application/json; charset=utf-8', true); }
echo json_encode($response); header('Content-Type: application/json; charset=utf-8');
jexit(); echo json_encode($response);
} jexit();
}
static function spielerstatistik($spielerstatistik, $spielerstatistik_punkte, $allein_angezeigt, $filter_saison_id, $vorherige_spielerstatistik_id, $naechste_spielerstatistik_id, $details_anzeigen) { #[NoReturn] static function spielerstatistik($spielerstatistik_punkte): void
$rank = 1; {
foreach ($spielerstatistik_punkte as $s) { $rank = 1;
$s->spieler_bild = playerImage($s->spieler_id, $s->geschlecht); foreach ($spielerstatistik_punkte as $s) {
$s->spieler_2_bild= playerImage($s->spieler_2_id, $s->geschlecht_2); $s->spieler_bild = playerImage($s->spieler_id, $s->geschlecht);
$s->quote = ($s->spielpunkte_gewonnen > 0 || $s->spielpunkte_verloren > 0) $s->spieler_2_bild = playerImage($s->spieler_2_id, $s->geschlecht_2);
? round($s->spielpunkte_gewonnen * 100 / ($s->spielpunkte_gewonnen + $s->spielpunkte_verloren), 0) . '%' $s->quote = ($s->spielpunkte_gewonnen > 0 || $s->spielpunkte_verloren > 0)
: '-'; ? round($s->spielpunkte_gewonnen * 100 / ($s->spielpunkte_gewonnen + $s->spielpunkte_verloren)) . '%'
$s->rank = '' . $rank; : '-';
$rank++; $s->rank = '' . $rank;
} $rank++;
self::JSON($spielerstatistik_punkte); }
} self::JSON($spielerstatistik_punkte);
}
static function spielerDetails($spieler, $vereine, $veranstalter, $spieler_elo_verlauf_einzel, $spieler_elo_verlauf_doppel, $spielerNamen, $teamNamen, $veranstaltungBezeichnungen, $turnierdisziplinBezeichnungen, $individualwettbewerbBezeichnungen, $ranglistenplatzierungen, $turnierplatzierungen, $teams, $sortierung, $vorheriger_spieler_id, $naechster_spieler_id, $elo_detailliert, $statistik, $beginn, $kategorie, $einstufungen, $filter, $veranstaltungid, $veranstalterid, $einstufungid, $unabhaengige_ansicht, $details_anzeigen) { #[NoReturn] static function spielerDetails($spieler, $vereine, $veranstalter, $spieler_elo_verlauf_einzel, $spieler_elo_verlauf_doppel, $spielerNamen, $teamNamen, $veranstaltungBezeichnungen, $turnierdisziplinBezeichnungen, $individualwettbewerbBezeichnungen, $ranglistenplatzierungen, $turnierplatzierungen, $teams, $elo_detailliert, $statistik, $einstufungen): void
$letzte_einzel = []; {
$spieler->bild = playerImage($spieler->spieler_id, $spieler->geschlecht); $letzte_einzel = [];
for ($i = sizeof($spieler_elo_verlauf_einzel) - 1; $i >= max(sizeof($spieler_elo_verlauf_einzel)-10, 0); $i--) { $spieler->bild = playerImage($spieler->spieler_id, $spieler->geschlecht);
$e = $spieler_elo_verlauf_einzel[$i]; for ($i = sizeof($spieler_elo_verlauf_einzel) - 1; $i >= max(sizeof($spieler_elo_verlauf_einzel) - 10, 0); $i--) {
$letzte_einzel[] = [ $e = $spieler_elo_verlauf_einzel[$i];
'datum' => $e['z'], $letzte_einzel[] = [
'datum' => $e['z'],
'spieler_1' => isset($spielerNamen[$e['h1']]) ? [ 'spieler_1' => isset($spielerNamen[$e['h1']]) ? [
'spieler_id' => $e['h1'], 'spieler_id' => $e['h1'],
'bild' => playerImage($e['h1'], 'M'), 'bild' => playerImage($e['h1'], 'M'),
'vorname' => explode(', ',$spielerNamen[$e['h1']])[1], 'vorname' => explode(', ', $spielerNamen[$e['h1']])[1],
'nachname' => explode(', ',$spielerNamen[$e['h1']])[0], 'nachname' => explode(', ', $spielerNamen[$e['h1']])[0],
] : NULL, ] : NULL,
'spieler_team' => isset($e['th']) ? [ 'spieler_team' => isset($e['th']) ? [
'id' => $e['th'], 'id' => $e['th'],
'name' => $teamNamen[$e['th']], 'name' => $teamNamen[$e['th']],
]: NULL, ] : NULL,
'gegner_1' => isset($spielerNamen[$e['g1']]) ? [ 'gegner_1' => isset($spielerNamen[$e['g1']]) ? [
'spieler_id' => $e['g1'], 'spieler_id' => $e['g1'],
'bild' => playerImage($e['g1'], 'M'), 'bild' => playerImage($e['g1'], 'M'),
@@ -221,10 +235,10 @@ class JSON_sportsmanager {
]; ];
} }
$letzte_doppel = []; $letzte_doppel = [];
for ($i = sizeof($spieler_elo_verlauf_doppel) - 1; $i >= max(sizeof($spieler_elo_verlauf_doppel) - 10, 0); $i--) { for ($i = sizeof($spieler_elo_verlauf_doppel) - 1; $i >= max(sizeof($spieler_elo_verlauf_doppel) - 10, 0); $i--) {
$d = $spieler_elo_verlauf_doppel[$i]; $d = $spieler_elo_verlauf_doppel[$i];
$letzte_doppel[] = [ $letzte_doppel[] = [
'datum' => $d['z'], 'datum' => $d['z'],
'spieler_1' => isset($spielerNamen[$d['h1']]) ? [ 'spieler_1' => isset($spielerNamen[$d['h1']]) ? [
'spieler_id' => $d['h1'], 'spieler_id' => $d['h1'],
'bild' => playerImage($d['h1'], 'M'), 'bild' => playerImage($d['h1'], 'M'),
@@ -252,7 +266,7 @@ class JSON_sportsmanager {
'bild' => playerImage($d['g2'], 'M'), 'bild' => playerImage($d['g2'], 'M'),
'vorname' => explode(', ', $spielerNamen[$d['g2']])[1], 'vorname' => explode(', ', $spielerNamen[$d['g2']])[1],
'nachname' => explode(', ', $spielerNamen[$d['g2']])[0], 'nachname' => explode(', ', $spielerNamen[$d['g2']])[0],
]: NULL, ] : NULL,
'gegner_team' => isset($d['th']) && isset($d['tg']) ? 'gegner_team' => isset($d['th']) && isset($d['tg']) ?
[ [
'id' => $d['tg'], 'id' => $d['tg'],
@@ -268,11 +282,11 @@ class JSON_sportsmanager {
'ergebnis' => $d['s'], 'ergebnis' => $d['s'],
]; ];
} }
self::JSON([ self::JSON([
'spieler' => $spieler, 'spieler' => $spieler,
'vereine' => $vereine, 'vereine' => $vereine,
'teams' => $teams, 'teams' => $teams,
'veranstalter'=> $veranstalter, 'veranstalter' => $veranstalter,
'ranglisten_platzierungen' => $ranglistenplatzierungen, 'ranglisten_platzierungen' => $ranglistenplatzierungen,
'turnier_platzierungen' => $turnierplatzierungen, 'turnier_platzierungen' => $turnierplatzierungen,
'statistik' => $statistik, 'statistik' => $statistik,
@@ -285,53 +299,54 @@ class JSON_sportsmanager {
]); ]);
} }
static function begegnungVerlegen($veranstaltung, $begegnung, $heim_team, $gast_team, $verlegen_aktionen, $berechtigt_fuer_akzeptieren, $aus_uebersicht, $vorschlagendes_team_id) { #[NoReturn] static function begegnungVerlegen($veranstaltung, $verlegen_aktionen, $berechtigt_fuer_akzeptieren, $vorschlagendes_team_id): void
$letzte_aktionen = array(); {
foreach ($verlegen_aktionen as $aktion) { $letzte_aktionen = array();
if ($aktion->aktion == 1 || $aktion->aktion == 5 || $aktion == 10) { foreach ($verlegen_aktionen as $aktion) {
break; if ($aktion->aktion == 1 || $aktion->aktion == 5 || $aktion == 10) {
} break;
array_push($letzte_aktionen, $aktion); }
} $letzte_aktionen[] = $aktion;
$termine = array(); }
if (count($letzte_aktionen) > 0) { $termine = array();
$eingetragen = $letzte_aktionen[0]->eingetragen; if (count($letzte_aktionen) > 0) {
foreach ($letzte_aktionen as $aktion) { $eingetragen = $letzte_aktionen[0]->eingetragen;
if ($aktion->eingetragen != $eingetragen || $aktion->aktion != 0 || $aktion->zeitpunkt == NULL) { foreach ($letzte_aktionen as $aktion) {
break; if ($aktion->eingetragen != $eingetragen || $aktion->aktion != 0 || $aktion->zeitpunkt == NULL) {
} break;
array_push($termine, $aktion); }
} $termine[] = $aktion;
} }
}
$berechtigt_anfordern = $veranstaltung->initial_ohne_termin != 1 && (count($letzte_aktionen) == 0 || $letzte_aktionen[0]->aktion == 1); $berechtigt_anfordern = $veranstaltung->initial_ohne_termin != 1 && (count($letzte_aktionen) == 0 || $letzte_aktionen[0]->aktion == 1);
$berechtigt_vorschlagen = ($veranstaltung->initial_ohne_termin != 2 || (count($letzte_aktionen) != 0 && $letzte_aktionen[0]->aktion != 1)) $berechtigt_vorschlagen = ($veranstaltung->initial_ohne_termin != 2 || (count($letzte_aktionen) != 0 && $letzte_aktionen[0]->aktion != 1))
&& (!$veranstaltung->keine_gegenvorschlaege || count($letzte_aktionen) == 0 || $letzte_aktionen[0]->aktion != 3 || $letzte_aktionen[0]->team_id != $vorschlagendes_team_id) && (!$veranstaltung->keine_gegenvorschlaege || count($letzte_aktionen) == 0 || $letzte_aktionen[0]->aktion != 3 || $letzte_aktionen[0]->team_id != $vorschlagendes_team_id)
&& (count($termine) == 0 || !$veranstaltung->keine_gegenvorschlaege || $letzte_aktionen[0]->team_id == $vorschlagendes_team_id); && (count($termine) == 0 || !$veranstaltung->keine_gegenvorschlaege || $letzte_aktionen[0]->team_id == $vorschlagendes_team_id);
$berechtigt_ablehnen = count($letzte_aktionen) != 0 && ($letzte_aktionen[0]->aktion == 0 || $letzte_aktionen[0]->aktion == 3 || $letzte_aktionen[0]->aktion == 4) $berechtigt_ablehnen = count($letzte_aktionen) != 0 && ($letzte_aktionen[0]->aktion == 0 || $letzte_aktionen[0]->aktion == 3 || $letzte_aktionen[0]->aktion == 4)
&& ((($veranstaltung->ablehnen == 1 || $veranstaltung->ablehnen == 3) && $berechtigt_fuer_akzeptieren) || (($veranstaltung->ablehnen == 1 || $veranstaltung->ablehnen == 2) && ((($veranstaltung->ablehnen == 1 || $veranstaltung->ablehnen == 3) && $berechtigt_fuer_akzeptieren) || (($veranstaltung->ablehnen == 1 || $veranstaltung->ablehnen == 2)
&& $berechtigt_vorschlagen)); && $berechtigt_vorschlagen));
$response = []; $response = [];
$anzahl_termine = $veranstaltung->termine_maximal == 0 ? 3 : $veranstaltung->termine_maximal; $anzahl_termine = $veranstaltung->termine_maximal == 0 ? 3 : $veranstaltung->termine_maximal;
for ($termin = 1; $termin <= $anzahl_termine; $termin++) { for ($termin = 1; $termin <= $anzahl_termine; $termin++) {
if (isset($termine[$termin-1])) { if (isset($termine[$termin - 1])) {
$response[] = [ $response[] = [
'begegnung_historie_id' => $termine[$termin-1]->begegnung_historie_id, 'begegnung_historie_id' => $termine[$termin - 1]->begegnung_historie_id,
'zeitpunkt' => $termine[$termin-1]->zeitpunkt 'zeitpunkt' => $termine[$termin - 1]->zeitpunkt
]; ];
} }
} }
self::JSON([ self::JSON([
'termine' => $response, 'termine' => $response,
'berechtigt_anfordern' => $berechtigt_anfordern, 'berechtigt_anfordern' => $berechtigt_anfordern,
'berechtigt_ablehnen' => $berechtigt_ablehnen, 'berechtigt_ablehnen' => $berechtigt_ablehnen,
'berechtigt_akzeptieren' => $berechtigt_fuer_akzeptieren ? TRUE : FALSE, 'berechtigt_akzeptieren' => (bool)$berechtigt_fuer_akzeptieren,
'termine_minimal' => $veranstaltung->termine_minimal, 'termine_minimal' => $veranstaltung->termine_minimal,
'termine_maximal' => $veranstaltung->termine_maximal, 'termine_maximal' => $veranstaltung->termine_maximal,
]); ]);
} }
} }
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -3,29 +3,32 @@
* Sports Manager (C) 2006-2020, Sven Nickel * Sports Manager (C) 2006-2020, Sven Nickel
*/ */
// kein direkter Zugriff use Joomla\Filesystem\Folder;
defined('_JEXEC') or die('Restricted access'); use Joomla\CMS\Router\Route;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Uri\Uri;
function htmlentities_utf8($s) { // kein direkter Zugriff
defined("_JEXEC") or die("Restricted access");
function htmlentities_utf8($s): string
{
return htmlentities($s, ENT_QUOTES, "UTF-8"); return htmlentities($s, ENT_QUOTES, "UTF-8");
} }
function htmlentities_noquotes_utf8($s) { function addOnLoad($function): void
return htmlentities($s, ENT_NOQUOTES, "UTF-8"); {
}
function addOnLoad($function) {
?> ?>
<script language="JavaScript"> <script language="JavaScript">
function addLoadEvent(func) { function addLoadEvent(func) {
var oldonload = window.onload; const oldOnload = window.onload;
if (typeof window.onload != 'function') { if (typeof window.onload != 'function') {
window.onload = func; window.onload = func;
} }
else { else {
window.onload = function () { window.onload = function () {
if (oldonload) { if (oldOnload) {
oldonload(); oldOnload();
} }
func(); func();
} }
@@ -37,57 +40,87 @@ function addOnLoad($function) {
<?php <?php
} }
function SportsManagerURL($weitereParameter = null, $ssl = 0) { function SportsManagerURL($weitereParameter = "", $ssl = 0): ?string
return JRoute::_('index.php' . ($weitereParameter != null ? ("?" . ltrim($weitereParameter, "&")) : ""), false, $ssl); {
$urlPath = handleFilter($weitereParameter);
$joomlaBaseUrl = Uri::getInstance()->toString([
"scheme",
"host",
"port",
"path",
]);
if (str_contains($joomlaBaseUrl, "?")) {
// Base URL already contains a query string, append with '&'
$finalUrl = $joomlaBaseUrl . "&" . ltrim($urlPath, "&");
} else {
// Base URL does not contain a query string, append with '?'
$finalUrl = $joomlaBaseUrl . "?" . ltrim($urlPath, "&");
}
return Route::_($finalUrl, false, $ssl);
} }
function NichtLeererString($s, $ersatz = "Keiner") { function handleFilter($urlPart)
{
// Check if both '&filter=' and '#' are present in the URL part
if (
str_contains($urlPart, "&filter=") &&
str_contains($urlPart, "#")
) {
// Split the string by '#' to remove the hash part
$parts = explode("#", $urlPart, 2);
$query = $parts[0];
// Parse the query string into an associative array
parse_str($query, $queryParams);
// Remove the 'filter' parameter if it exists
unset($queryParams["filter"]);
// Rebuild the query string without the 'filter' parameter
return http_build_query($queryParams);
} else {
// Return the original URL part if either '&filter=' or '#' is not present
return $urlPart;
}
}
function NichtLeererString($s, $ersatz = "Keiner")
{
return !empty($s) ? $s : $ersatz; return !empty($s) ? $s : $ersatz;
} }
function hervorheben($titel) { function hervorheben($titel) {
if (empty($titel)) if (empty($titel)) {
return $titel; return $titel;
}
return $titel . ' *'; return $titel . " *";
} }
function Laenderkennungen() { function Laenderkennungen(): array
$kennungen = array("AUT", "BEL", "BUL", "CZE", "DEN", "FRA", "GBR", "GER", "LUX", "NED", "SUI", "USA"); {
return array("AUT", "BEL", "BUL", "CZE", "DEN", "FRA", "GBR", "GER", "LUX", "NED", "SUI", "USA");
return $kennungen;
} }
function rundenstufe($stufe) { function rundenstufe($stufe): string
switch ($stufe) { {
case 0: return match ($stufe) {
$bezeichnung = JText::_('COM_SPORTSMANAGER_FINAL_RANKS'); 0 => Text::_("COM_SPORTSMANAGER_FINAL_RANKS"),
break; 1 => Text::_("COM_SPORTSMANAGER_MAIN_ROUND"),
case 1: 2 => Text::_("COM_SPORTSMANAGER_ADDITIONAL_ROUND"),
$bezeichnung = JText::_('COM_SPORTSMANAGER_MAIN_ROUND'); 3 => Text::_("COM_SPORTSMANAGER_2ND_ADDITIONAL_ROUND"),
break; 10 => Text::_("COM_SPORTSMANAGER_PRELIMINARY_ROUND"),
case 2: 20 => Text::_("COM_SPORTSMANAGER_REGISTRATIONS"),
$bezeichnung = JText::_('COM_SPORTSMANAGER_ADDITIONAL_ROUND'); default => "",
break; };
case 3:
$bezeichnung = JText::_('COM_SPORTSMANAGER_2ND_ADDITIONAL_ROUND');
break;
case 10:
$bezeichnung = JText::_('COM_SPORTSMANAGER_PRELIMINARY_ROUND');
break;
case 20:
$bezeichnung = JText::_('COM_SPORTSMANAGER_REGISTRATIONS');
break;
default:
$bezeichnung = "";
} // switch
return $bezeichnung;
} }
function StringsZusammenfassen($titel1, $titel2, $ersatz = null, $separator = " / ") { function StringsZusammenfassen($titel1, $titel2, $ersatz = null, $separator = " / ") {
if ($ersatz == null) if ($ersatz == null) {
$ersatz = JText::_('COM_SPORTSMANAGER_NONE'); $ersatz = Text::_("COM_SPORTSMANAGER_NONE");
}
$t1 = NichtLeererString($titel1, $ersatz); $t1 = NichtLeererString($titel1, $ersatz);
$t2 = NichtLeererString($titel2, $ersatz); $t2 = NichtLeererString($titel2, $ersatz);
@@ -97,65 +130,59 @@ function StringsZusammenfassen($titel1, $titel2, $ersatz = null, $separator = "
function Rundenbezeichnung($runde, $spieltag = false, $bezeichnung_verstecken = false, $kurzform = false) { function Rundenbezeichnung($runde, $spieltag = false, $bezeichnung_verstecken = false, $kurzform = false) {
if ($kurzform) { if ($kurzform) {
if ($runde >= 20000) if ($runde >= 20000)
return JText::sprintf('COM_SPORTSMANAGER_PLACE_FROM_TO_SHORTCUT', 99 - $runde % 100, 99 - floor(($runde - 20000) / 100) + 99 - ($runde % 100)); return Text::sprintf("COM_SPORTSMANAGER_PLACE_FROM_TO_SHORTCUT", 99 - $runde % 100, 99 - floor(($runde - 20000) / 100) + 99 - ($runde % 100));
switch ($runde) { return match ($runde) {
case 0: 0 => $spieltag
return $spieltag ? JText::_('COM_SPORTSMANAGER_MATCH_DAY_NONE') : JText::_('COM_SPORTSMANAGER_ROUND_NONE'); ? Text::_("COM_SPORTSMANAGER_MATCH_DAY_NONE")
case 19999: : Text::_("COM_SPORTSMANAGER_ROUND_NONE"),
return JText::_('COM_SPORTSMANAGER_FINAL_SHORTCUT'); 19999 => Text::_("COM_SPORTSMANAGER_FINAL_SHORTCUT"),
case 19998: 19998 => Text::_("COM_SPORTSMANAGER_3RD_PLACE_SHORTCUT"),
return JText::_('COM_SPORTSMANAGER_3RD_PLACE_SHORTCUT'); 19997 => Text::_("COM_SPORTSMANAGER_HALF_FINAL_SHORTCUT"),
case 19997: 19996 => Text::_("COM_SPORTSMANAGER_QUARTER_FINAL_SHORTCUT"),
return JText::_('COM_SPORTSMANAGER_HALF_FINAL_SHORTCUT'); 19995 => Text::_("COM_SPORTSMANAGER_ROUND_OF_16_SHORTCUT"),
case 19996: 19994 => Text::_("COM_SPORTSMANAGER_ROUND_OF_32_SHORTCUT"),
return JText::_('COM_SPORTSMANAGER_QUARTER_FINAL_SHORTCUT'); 19993 => Text::_("COM_SPORTSMANAGER_ROUND_OF_64_SHORTCUT"),
case 19995: 19992 => Text::_("COM_SPORTSMANAGER_ROUND_OF_128_SHORTCUT"),
return JText::_('COM_SPORTSMANAGER_ROUND_OF_16_SHORTCUT'); default => $bezeichnung_verstecken ? $runde : Text::sprintf($spieltag ? "COM_SPORTSMANAGER_MATCH_DAY_NR_SHORTCUT" : "COM_SPORTSMANAGER_ROUND_NR_SHORTCUT", $runde),
case 19994: };
return JText::_('COM_SPORTSMANAGER_ROUND_OF_32_SHORTCUT');
case 19993:
return JText::_('COM_SPORTSMANAGER_ROUND_OF_64_SHORTCUT');
case 19992:
return JText::_('COM_SPORTSMANAGER_ROUND_OF_128_SHORTCUT');
}
return $bezeichnung_verstecken ? $runde : JText::sprintf($spieltag ? 'COM_SPORTSMANAGER_MATCH_DAY_NR_SHORTCUT' : 'COM_SPORTSMANAGER_ROUND_NR_SHORTCUT', $runde); }
}
else { else {
if ($runde >= 20000) if ($runde >= 20000)
return JText::sprintf('COM_SPORTSMANAGER_PLACE_FROM_TO', 99 - $runde % 100, 99 - floor(($runde - 20000) / 100) + 99 - ($runde % 100)); return Text::sprintf("COM_SPORTSMANAGER_PLACE_FROM_TO", 99 - $runde % 100, 99 - floor(($runde - 20000) / 100) + 99 - ($runde % 100));
switch ($runde) { return match ($runde) {
case 0: 0 => $spieltag
return $spieltag ? JText::_('COM_SPORTSMANAGER_MATCH_DAY_NONE') : JText::_('COM_SPORTSMANAGER_ROUND_NONE'); ? Text::_("COM_SPORTSMANAGER_MATCH_DAY_NONE")
case 19999: : Text::_("COM_SPORTSMANAGER_ROUND_NONE"),
return JText::_('COM_SPORTSMANAGER_FINAL'); 19999 => Text::_("COM_SPORTSMANAGER_FINAL"),
case 19998: 19998 => Text::_("COM_SPORTSMANAGER_3RD_PLACE"),
return JText::_('COM_SPORTSMANAGER_3RD_PLACE'); 19997 => Text::_("COM_SPORTSMANAGER_HALF_FINAL"),
case 19997: 19996 => Text::_("COM_SPORTSMANAGER_QUARTER_FINAL"),
return JText::_('COM_SPORTSMANAGER_HALF_FINAL'); 19995 => Text::_("COM_SPORTSMANAGER_ROUND_OF_16"),
case 19996: 19994 => Text::_("COM_SPORTSMANAGER_ROUND_OF_32"),
return JText::_('COM_SPORTSMANAGER_QUARTER_FINAL'); 19993 => Text::_("COM_SPORTSMANAGER_ROUND_OF_64"),
case 19995: 19992 => Text::_("COM_SPORTSMANAGER_ROUND_OF_128"),
return JText::_('COM_SPORTSMANAGER_ROUND_OF_16'); default => $bezeichnung_verstecken
case 19994: ? $runde
return JText::_('COM_SPORTSMANAGER_ROUND_OF_32'); : Text::sprintf(
case 19993: $spieltag
return JText::_('COM_SPORTSMANAGER_ROUND_OF_64'); ? "COM_SPORTSMANAGER_MATCH_DAY_NR"
case 19992: : "COM_SPORTSMANAGER_ROUND_NR",
return JText::_('COM_SPORTSMANAGER_ROUND_OF_128'); $runde
} ),
};
return $bezeichnung_verstecken ? $runde : JText::sprintf($spieltag ? 'COM_SPORTSMANAGER_MATCH_DAY_NR' : 'COM_SPORTSMANAGER_ROUND_NR', $runde); }
}
} }
function FormatiertesDatum($s, $zeit_anzeigen = true, $wochentag_anzeigen = true) { function FormatiertesDatum($s, $zeit_anzeigen = true, $wochentag_anzeigen = true): string
{
if ($s != null && strlen($s) > 0) { if ($s != null && strlen($s) > 0) {
$ts = getdate(strtotime($s)); $ts = getdate(strtotime($s));
if ($wochentag_anzeigen) { if ($wochentag_anzeigen) {
$wochentage = array(JText::_('COM_SPORTSMANAGER_DAY_0_SHORTCUT'), JText::_('COM_SPORTSMANAGER_DAY_1_SHORTCUT'), JText::_('COM_SPORTSMANAGER_DAY_2_SHORTCUT'), JText::_('COM_SPORTSMANAGER_DAY_3_SHORTCUT'), JText::_('COM_SPORTSMANAGER_DAY_4_SHORTCUT'), JText::_('COM_SPORTSMANAGER_DAY_5_SHORTCUT'), JText::_('COM_SPORTSMANAGER_DAY_6_SHORTCUT')); $wochentage = array(Text::_("COM_SPORTSMANAGER_DAY_0_SHORTCUT"), Text::_("COM_SPORTSMANAGER_DAY_1_SHORTCUT"), Text::_("COM_SPORTSMANAGER_DAY_2_SHORTCUT"), Text::_("COM_SPORTSMANAGER_DAY_3_SHORTCUT"), Text::_("COM_SPORTSMANAGER_DAY_4_SHORTCUT"), Text::_("COM_SPORTSMANAGER_DAY_5_SHORTCUT"), Text::_("COM_SPORTSMANAGER_DAY_6_SHORTCUT"));
if ($zeit_anzeigen) if ($zeit_anzeigen)
return sprintf("%s, %02d.%02d.%04d %02d:%02d", $wochentage[$ts["wday"]], $ts["mday"], $ts["mon"], $ts["year"], $ts["hours"], $ts["minutes"]); return sprintf("%s, %02d.%02d.%04d %02d:%02d", $wochentage[$ts["wday"]], $ts["mday"], $ts["mon"], $ts["year"], $ts["hours"], $ts["minutes"]);
@@ -167,10 +194,11 @@ function FormatiertesDatum($s, $zeit_anzeigen = true, $wochentag_anzeigen = true
return sprintf("%02d.%02d.%04d", $ts["mday"], $ts["mon"], $ts["year"]); return sprintf("%02d.%02d.%04d", $ts["mday"], $ts["mon"], $ts["year"]);
} }
return JText::_('COM_SPORTSMANAGER_DATE_NONE'); return Text::_("COM_SPORTSMANAGER_DATE_NONE");
} }
function FormatierterTermin($erster_tag, $letzter_tag, $jahr_anzeigen = false, $filter_jahr = null) { function FormatierterTermin($erster_tag, $letzter_tag, $jahr_anzeigen = false, $filter_jahr = null): string
{
$erster_ts = getdate(strtotime($erster_tag)); $erster_ts = getdate(strtotime($erster_tag));
$letzter_ts = getdate(strtotime($letzter_tag)); $letzter_ts = getdate(strtotime($letzter_tag));
if (!empty($filter_jahr)) if (!empty($filter_jahr))
@@ -188,401 +216,12 @@ function FormatierterTermin($erster_tag, $letzter_tag, $jahr_anzeigen = false, $
return $erster_termin . "-" . $letzter_termin; return $erster_termin . "-" . $letzter_termin;
} }
function bildLoeschen($typ, $id) { function terminDokumentname($id): bool|string
global $sportsmanager_joomla_path;
$typ_exploded = explode("/", $typ);
$typ = $typ_exploded[0];
$typ_prefix = count($typ_exploded) > 1 ? $typ_exploded[1] : "";
$bilder_pfad = $sportsmanager_joomla_path . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . 'sportsmanager' . DIRECTORY_SEPARATOR . $typ;
$pfad = $bilder_pfad . '/' . $typ_prefix . $id . ".";
if (!is_file($pfad . 'png') && !is_file($pfad . 'jpg'))
return;
$alte_bilder = JFolder::files($bilder_pfad, '^' . $typ_prefix . $id . '\.|^' . $typ_prefix . 'I' . $id . 'T');
foreach ($alte_bilder as $fn)
JFile::delete($bilder_pfad . DIRECTORY_SEPARATOR . $fn);
}
function bildIdentisch($typ1, $id1, $typ2, $id2) {
global $sportsmanager_joomla_path;
$typ1_exploded = explode("/", $typ1);
$typ1 = $typ1_exploded[0];
$typ1_prefix = count($typ1_exploded) > 1 ? $typ1_exploded[1] : "";
$bilder_pfad1 = $sportsmanager_joomla_path . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . 'sportsmanager' . DIRECTORY_SEPARATOR . $typ1;
$pfad1 = $bilder_pfad1 . '/' . $typ1_prefix . $id1 . ".";
if (is_file($pfad1 . "png"))
$ext = "png";
else if (is_file($pfad1 . "jpg"))
$ext = "jpg";
else
$ext = "";
$pfad1 .= $ext;
$typ2_exploded = explode("/", $typ2);
$typ2 = $typ2_exploded[0];
$typ2_prefix = count($typ2_exploded) > 1 ? $typ2_exploded[1] : "";
$bilder_pfad2 = $sportsmanager_joomla_path . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . 'sportsmanager' . DIRECTORY_SEPARATOR . $typ2;
$pfad2 = $bilder_pfad2 . '/' . $typ2_prefix . $id2 . "." . $ext;
return files_identical($pfad1, $pfad2);
}
function teamImage($teamId, $vereinId, $width = 240, $height = 240) {
$url = bildURL("mannschaften", $teamId, 0, 0, $width, $height);
if ($url == null) {
$url = bildURL("vereine", $vereinId, 0, 0, $width, $height);
}
return $url;
}
function playerImage($playerId, $gender, $width = 180, $height = 240) {
$url = bildURL("spieler", $playerId, $width, $height, 0,0,'', $gender == 'M' ? 'm' : 'w');
if ($url == null) {
$url = bildURL("mannschaftsmitglieder", $playerId, $width, $height, 0,0,'');
}
return $url;
}
function bildURL($typ, $id, $fixed_width = 0, $fixed_height = 0, $max_width = 0, $max_height = 0, $zusatz = "", $alternativ = "") {
global $sportsmanager_joomla_path;
global $sportsmanager_joomla_url;
$typ_exploded = explode("/", $typ);
$typ = $typ_exploded[0];
$typ_prefix = count($typ_exploded) > 1 ? $typ_exploded[1] : "";
$pfad = $sportsmanager_joomla_path . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . ".";
if (is_file($pfad . "png"))
$ext = "png";
else if (is_file($pfad . "jpg"))
$ext = "jpg";
else if (!empty($alternativ)) {
$id = $alternativ;
$pfad = $sportsmanager_joomla_path . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . ".";
if (is_file($pfad . "png"))
$ext = "png";
else if (is_file($pfad . "jpg"))
$ext = "jpg";
else
return null;
}
else
return null;
$time = filemtime($pfad . $ext);
if ($fixed_width > 0 && $fixed_height > 0) {
$pfad_angepasst = $sportsmanager_joomla_path . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . "I" . $id . "T" . $time . "W" . $fixed_width . "H" . $fixed_height . "." . $ext;
if (is_file($pfad_angepasst)) {
return $sportsmanager_joomla_url . 'images/sportsmanager/' . $typ . '/' . basename($pfad_angepasst);
}
}
$size = getimagesize($pfad . $ext);
$width = $size[0];
$height = $size[1];
$max_width = $fixed_width > 0 ? $fixed_width : $max_width;
$max_height = $fixed_height > 0 ? $fixed_height : $max_height;
if (($fixed_width == 0 || $width == $fixed_width) && ($fixed_height == 0 || $height == $fixed_height) && ($fixed_width != 0 || $max_width == 0 || $width <= $max_width) && ($fixed_height != 0 || $max_height == 0 || $height <= $max_height)) {
$pfad_angepasst = $sportsmanager_joomla_path . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . "I" . $id . "T" . $time . "W" . $width . "H" . $height . "." . $ext;
if (!is_file($pfad_angepasst)) {
if (!copy($pfad . $ext, $pfad_angepasst))
return null;
}
return $sportsmanager_joomla_url . 'images/sportsmanager/' . $typ . '/' . basename($pfad_angepasst);
}
$new_width = $width;
$new_height = $height;
if ($max_height > 0 && $new_height > $max_height) {
$new_width = max(round($new_width * $max_height / $new_height), 1);
$new_height = $max_height;
}
if ($max_width > 0 && $new_width > $max_width) {
$new_height = max(round($new_height * $max_width / $new_width), 1);
$new_width = $max_width;
}
if ($max_width > 0 && (($max_width - $new_width) % 2) == 1) // Toleranz bei nur 1 Pixel Unterschied
$new_width += 1;
if ($max_height > 0 && (($max_height - $new_height) % 2) == 1) // Toleranz bei nur 1 Pixel Unterschied
$new_height += 1;
$pfad_angepasst = $sportsmanager_joomla_path . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . "I" . $id . "T" . $time . "W" . max($fixed_width, $new_width) . "H" . max($fixed_height, $new_height) . "." . $ext;
if (!is_file($pfad_angepasst)) {
$image = $ext == "png" ? imagecreatefrompng($pfad . $ext) : imagecreatefromjpeg($pfad . $ext);
if ($image === false)
return null;
$image_resized = imagecreatetruecolor(max($fixed_width, $new_width), max($fixed_height, $new_height));
$color = $ext == "png" ? imagecolorallocatealpha($image_resized, 0, 0, 0, 127) : imagecolorallocate($image_resized, 64, 64, 64);
imagefill($image_resized, 0, 0, $color);
imagecopyresampled($image_resized, $image, round((imagesx($image_resized) - $new_width) / 2), round((imagesy($image_resized) - $new_height) / 2), 0, 0, $new_width, $new_height, $width, $height);
if ($ext == "png") {
imagesavealpha($image_resized, true);
imagepng($image_resized, $pfad_angepasst);
}
else
imagejpeg($image_resized, $pfad_angepasst);
}
return $sportsmanager_joomla_url . 'images/sportsmanager/' . $typ . '/' . basename($pfad_angepasst);
}
/*
* #resize=250
#resize=250,250,blue
#resize=250,250,blue
#resize=250,250&sizes=60%,80%,200%
#resize=250,250,cover&sizes=60%,80%,200%
#resize=250,250,fill&sizes=60%,80%,200%
#crop=250,250,center,top
#crop=250,250
#crop=250,250,center,bottom
#crop=250,250,left
#crop=250,250,right
*/
function yoothemeBild($typ, $id, $resize = '', $zusatz = "", $alternativ)
{ {
global $sportsmanager_joomla_path; global $sportsmanager_joomla_path;
global $sportsmanager_joomla_url;
$typ_exploded = explode("/", $typ);
$typ = $typ_exploded[0];
$typ_prefix = count($typ_exploded) > 1 ? $typ_exploded[1] : "";
$pfad = $sportsmanager_joomla_path . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . ".";
if (is_file($pfad . "png"))
$ext = "png";
else if (is_file($pfad . "jpg"))
$ext = "jpg";
else if (!empty($alternativ)) {
$id = $alternativ;
$pfad = $sportsmanager_joomla_path . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . ".";
if (is_file($pfad . "png"))
$ext = "png";
else if (is_file($pfad . "jpg"))
$ext = "jpg";
else
return null;
}
else
return null;
$time = filemtime($pfad . $ext);
$bildpfad = "images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . "." . $ext;
return '<img class="el-image" data-src="' . $bildpfad . $resize . '" ' . $zusatz . ' uk-img />';
}
/*
Quick and dirty DTFL Logo Bilder
*/
function logoBilder($typ, $id, $resize = '', $zusatz = "", $alternativ)
{
global $sportsmanager_joomla_path;
global $sportsmanager_joomla_url;
$typ_exploded = explode("/", $typ);
$typ = $typ_exploded[0];
$typ_prefix = count($typ_exploded) > 1 ? $typ_exploded[1] : "";
$pfad = $sportsmanager_joomla_path . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . ".";
if (is_file($pfad . "png"))
$ext = "png";
else if (is_file($pfad . "jpg"))
$ext = "jpg";
else if (!empty($alternativ)) {
$id = $alternativ;
$pfad = $sportsmanager_joomla_path . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . ".";
if (is_file($pfad . "png"))
$ext = "png";
else if (is_file($pfad . "jpg"))
$ext = "jpg";
else
return null;
}
else
return null;
$time = filemtime($pfad . $ext);
$bildpfad = "images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . "." . $ext;
return '<img class="el-image" data-src="' . $bildpfad . $resize . '" ' . $zusatz . ' uk-img />';
}
function bildHTML($typ, $id, $fixed_width = 0, $fixed_height = 0, $max_width = 0, $max_height = 0, $zusatz = "", $alternativ = "") {
global $sportsmanager_joomla_path;
global $sportsmanager_joomla_url;
$typ_exploded = explode("/", $typ);
$typ = $typ_exploded[0];
$typ_prefix = count($typ_exploded) > 1 ? $typ_exploded[1] : "";
$pfad = $sportsmanager_joomla_path . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . ".";
if (is_file($pfad . "png"))
$ext = "png";
else if (is_file($pfad . "jpg"))
$ext = "jpg";
else if (!empty($alternativ)) {
$id = $alternativ;
$pfad = $sportsmanager_joomla_path . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . ".";
if (is_file($pfad . "png"))
$ext = "png";
else if (is_file($pfad . "jpg"))
$ext = "jpg";
else
return null;
}
else
return null;
$time = filemtime($pfad . $ext);
if ($fixed_width > 0 && $fixed_height > 0) {
$pfad_angepasst = $sportsmanager_joomla_path . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . "I" . $id . "T" . $time . "W" . $fixed_width . "H" . $fixed_height . "." . $ext;
if (is_file($pfad_angepasst)) {
return '<img src="' . $sportsmanager_joomla_url . 'images/sportsmanager/' . $typ . '/' . basename($pfad_angepasst) . '" width="' . $fixed_width . '" height="' . $fixed_height . '" ' . $zusatz . ' />';
}
}
$size = getimagesize($pfad . $ext);
$width = $size[0];
$height = $size[1];
$max_width = $fixed_width > 0 ? $fixed_width : $max_width;
$max_height = $fixed_height > 0 ? $fixed_height : $max_height;
if (($fixed_width == 0 || $width == $fixed_width) && ($fixed_height == 0 || $height == $fixed_height) && ($fixed_width != 0 || $max_width == 0 || $width <= $max_width) && ($fixed_height != 0 || $max_height == 0 || $height <= $max_height)) {
$pfad_angepasst = $sportsmanager_joomla_path . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . "I" . $id . "T" . $time . "W" . $width . "H" . $height . "." . $ext;
if (!is_file($pfad_angepasst)) {
if (!copy($pfad . $ext, $pfad_angepasst))
return null;
}
return '<img src="' . $sportsmanager_joomla_url . 'images/sportsmanager/' . $typ . '/' . basename($pfad_angepasst) . '" width="' . $width . '" height="' . $height . '" ' . $zusatz . ' />';
}
$new_width = $width;
$new_height = $height;
if ($max_height > 0 && $new_height > $max_height) {
$new_width = max(round($new_width * $max_height / $new_height), 1);
$new_height = $max_height;
}
if ($max_width > 0 && $new_width > $max_width) {
$new_height = max(round($new_height * $max_width / $new_width), 1);
$new_width = $max_width;
}
if ($max_width > 0 && (($max_width - $new_width) % 2) == 1) // Toleranz bei nur 1 Pixel Unterschied
$new_width += 1;
if ($max_height > 0 && (($max_height - $new_height) % 2) == 1) // Toleranz bei nur 1 Pixel Unterschied
$new_height += 1;
$pfad_angepasst = $sportsmanager_joomla_path . "/images/sportsmanager/" . $typ . "/" . $typ_prefix . "I" . $id . "T" . $time . "W" . max($fixed_width, $new_width) . "H" . max($fixed_height, $new_height) . "." . $ext;
if (!is_file($pfad_angepasst)) {
$image = $ext == "png" ? imagecreatefrompng($pfad . $ext) : imagecreatefromjpeg($pfad . $ext);
if ($image === false)
return null;
$image_resized = imagecreatetruecolor(max($fixed_width, $new_width), max($fixed_height, $new_height));
$color = $ext == "png" ? imagecolorallocatealpha($image_resized, 0, 0, 0, 127) : imagecolorallocate($image_resized, 64, 64, 64);
imagefill($image_resized, 0, 0, $color);
imagecopyresampled($image_resized, $image, round((imagesx($image_resized) - $new_width) / 2), round((imagesy($image_resized) - $new_height) / 2), 0, 0, $new_width, $new_height, $width, $height);
if ($ext == "png") {
imagesavealpha($image_resized, true);
imagepng($image_resized, $pfad_angepasst);
}
else
imagejpeg($image_resized, $pfad_angepasst);
}
return '<img src="' . $sportsmanager_joomla_url . 'images/sportsmanager/' . $typ . '/' . basename($pfad_angepasst) . '" width="' . max($fixed_width, $new_width) . '" height="' . max($fixed_height, $new_height) . '" ' . $zusatz . ' />';
}
function terminDokumentname($id) {
global $sportsmanager_joomla_path;
$pfad = $sportsmanager_joomla_path . "/images/sportsmanager/termine"; $pfad = $sportsmanager_joomla_path . "/images/sportsmanager/termine";
$dokumente = JFolder::files($pfad, '^' . $id . ' '); $dokumente = Folder::files($pfad, '^' . $id . ' ');
return !empty($dokumente) ? substr($dokumente[0], strlen((string) $id) + 1) : false; return !empty($dokumente) ? substr($dokumente[0], strlen((string) $id) + 1) : false;
} }
function lightBoxJSShow($lightbox_class = "lightbox") {
return "show" . $lightbox_class . "();";
}
function lightBoxJSHide($lightbox_class = "lightbox") {
return "hide" . $lightbox_class . "();";
}
function lightBoxClassHide($lightbox_class = "lightbox") {
return $lightbox_class . "_close";
}
function lightBoxHeader($lightbox_class = "lightbox") {
?>
<style type="text/css">
div<?php echo "#" . $lightbox_class; ?> {
position: fixed;
left: 50px;
right: 50px;
top: 50px;
bottom: 50px;
border: 1px solid #999999;
overflow: scroll;
background-color: #e4e4e4;
padding: 20px;
display: none;
visibility: hidden;
}
div<?php echo "#" . $lightbox_class . "_close"; ?> {
position: fixed;
right: 0px;
top: 0px;
bottom: 0px;
left: 0px;
overflow: hidden;
display: none;
visibility: hidden;
background-color: rgba(0, 0, 0, 0.8);
}
</style>
<script type="text/javascript">
//<!--
function show<?php echo $lightbox_class; ?>() {
document.getElementById("<?php echo $lightbox_class; ?>").style.display = "inline";
document.getElementById("<?php echo $lightbox_class; ?>").style.visibility = "visible";
document.getElementById("<?php echo $lightbox_class . "_close"; ?>").style.display = "inline";
document.getElementById("<?php echo $lightbox_class . "_close"; ?>").style.visibility = "visible";
}
function hide<?php echo $lightbox_class; ?>() {
document.getElementById("<?php echo $lightbox_class; ?>").style.display = "none";
document.getElementById("<?php echo $lightbox_class; ?>").style.visibility = "hidden";
document.getElementById("<?php echo $lightbox_class . "_close"; ?>").style.display = "none";
document.getElementById("<?php echo $lightbox_class . "_close"; ?>").style.visibility = "hidden";
}
//-->
</script>
<?php
}
@@ -1,4 +1,4 @@
; Sports Manager (C) 2006-2020, Sven Nickel (Test) ; Sports Manager (C) 2006-2020, Sven Nickel (Test)
COM_SPORTSMANAGER="Sports Manager" COM_SPORTSMANAGER="Sports Manager"
COM_SPORTSMANAGER_PLAYERS="Spieler" COM_SPORTSMANAGER_PLAYERS="Spieler"
COM_SPORTSMANAGER_CLUBS="Vereine" COM_SPORTSMANAGER_CLUBS="Vereine"
@@ -21,6 +21,7 @@ COM_SPORTSMANAGER_LOCATIONS="Spielorte"
COM_SPORTSMANAGER_SEASONS="Saisons" COM_SPORTSMANAGER_SEASONS="Saisons"
COM_SPORTSMANAGER_TEAM_PLANS="Mannschaftsspielpl&auml;ne" COM_SPORTSMANAGER_TEAM_PLANS="Mannschaftsspielpl&auml;ne"
COM_SPORTSMANAGER_TEAM_NAME="Mannschaftsname" COM_SPORTSMANAGER_TEAM_NAME="Mannschaftsname"
COM_SPORTSMANAGER_TEAM_NAME_SHORT="Mannschaftsname kurz (max 24)"
COM_SPORTSMANAGER_TEAM_NAME2="Vereinsname" COM_SPORTSMANAGER_TEAM_NAME2="Vereinsname"
COM_SPORTSMANAGER_TEAM_SEAT="Vereinssitz" COM_SPORTSMANAGER_TEAM_SEAT="Vereinssitz"
COM_SPORTSMANAGER_POSTPONE_RULES="Verschieberegeln" COM_SPORTSMANAGER_POSTPONE_RULES="Verschieberegeln"
@@ -70,17 +71,18 @@ COM_SPORTSMANAGER_CONFIRM_REMOVE_RANKING="Willst du die Rangliste wirklich entfe
COM_SPORTSMANAGER_ADD_INDIVIDUAL_COMPETITION="Individualwettbewerb hinzuf&uuml;gen" COM_SPORTSMANAGER_ADD_INDIVIDUAL_COMPETITION="Individualwettbewerb hinzuf&uuml;gen"
COM_SPORTSMANAGER_INDIVIDUAL_COMPETITION="Individualwettbewerb" COM_SPORTSMANAGER_INDIVIDUAL_COMPETITION="Individualwettbewerb"
COM_SPORTSMANAGER_INDIVIDUAL_COMPETITIONS="Individualwettbewerbe" COM_SPORTSMANAGER_INDIVIDUAL_COMPETITIONS="Individualwettbewerbe"
COM_SPORTSMANAGER_ASSOCIATION_BODIES="Verbandsorgane"
COM_SPORTSMANAGER_GAME="Spiel" COM_SPORTSMANAGER_GAME="Spiel"
COM_SPORTSMANAGER_GAMES="Spiele" COM_SPORTSMANAGER_GAMES="Spiele"
COM_SPORTSMANAGER_GAMES_SHORTCUT="S" COM_SPORTSMANAGER_GAMES_SHORTCUT="S"
COM_SPORTSMANAGER_ADD_PLAYER_STATISTICS="Spielerstatistik hinzuf&uuml;gen" COM_SPORTSMANAGER_ADD_PLAYER_STATISTICS="Spielerstatistik hinzuf&uuml;gen"
COM_SPORTSMANAGER_PLAYER_STATISTICS="Spielerstatistik" COM_SPORTSMANAGER_PLAYER_STATISTIC="Spielerstatistik"
COM_SPORTSMANAGER_COMPETITION="Wettbewerb" COM_SPORTSMANAGER_COMPETITION="Wettbewerb"
COM_SPORTSMANAGER_COMPETITIONS="Wettbewerbe" COM_SPORTSMANAGER_COMPETITIONS="Wettbewerbe"
COM_SPORTSMANAGER_IN_COMPETITIONS="in Wettbewerb" COM_SPORTSMANAGER_IN_COMPETITIONS="in Wettbewerb"
COM_SPORTSMANAGER_COMPETITIONS_SHORTCUT="W" COM_SPORTSMANAGER_COMPETITIONS_SHORTCUT="W"
COM_SPORTSMANAGER_DUPLICATE="Duplizieren" COM_SPORTSMANAGER_DUPLICATE="Duplizieren"
COM_SPORTSMANAGER_CONFIRM_REMOVE_RANKING="Willst du die Spielerstatistik wirklich entfernen?" COM_SPORTSMANAGER_CONFIRM_REMOVE_PLAYER_STATISTICS="Willst du die Spielerstatistik wirklich entfernen?"
COM_SPORTSMANAGER_LIVE_TICKER="Live-Ticker" COM_SPORTSMANAGER_LIVE_TICKER="Live-Ticker"
COM_SPORTSMANAGER_PLACE="Platz" COM_SPORTSMANAGER_PLACE="Platz"
COM_SPORTSMANAGER_TEAM="Mannschaft" COM_SPORTSMANAGER_TEAM="Mannschaft"
@@ -129,10 +131,13 @@ COM_SPORTSMANAGER_QUARTER_FINAL_SHORTCUT="1/4"
COM_SPORTSMANAGER_ROUND_OF_16="Achtelfinale" COM_SPORTSMANAGER_ROUND_OF_16="Achtelfinale"
COM_SPORTSMANAGER_ROUND_OF_16_SHORTCUT="1/8" COM_SPORTSMANAGER_ROUND_OF_16_SHORTCUT="1/8"
COM_SPORTSMANAGER_ROUND_OF_32="Sechzehntelfinale" COM_SPORTSMANAGER_ROUND_OF_32="Sechzehntelfinale"
COM_SPORTSMANAGER_ROUND_OF_32_ALT="16-tel-Finale"
COM_SPORTSMANAGER_ROUND_OF_32_SHORTCUT="1/16" COM_SPORTSMANAGER_ROUND_OF_32_SHORTCUT="1/16"
COM_SPORTSMANAGER_ROUND_OF_64="Zweiunddreißigstelfinale" COM_SPORTSMANAGER_ROUND_OF_64="Zweiunddreißigstelfinale"
COM_SPORTSMANAGER_ROUND_OF_64_ALT="32-tel-Finale"
COM_SPORTSMANAGER_ROUND_OF_64_SHORTCUT="1/32" COM_SPORTSMANAGER_ROUND_OF_64_SHORTCUT="1/32"
COM_SPORTSMANAGER_ROUND_OF_128="Vierundsechzigstelfinale" COM_SPORTSMANAGER_ROUND_OF_128="Vierundsechzigstelfinale"
COM_SPORTSMANAGER_ROUND_OF_128_ALT="64-tel-Finale"
COM_SPORTSMANAGER_ROUND_OF_128_SHORTCUT="1/64" COM_SPORTSMANAGER_ROUND_OF_128_SHORTCUT="1/64"
COM_SPORTSMANAGER_DAY_0_SHORTCUT="So." COM_SPORTSMANAGER_DAY_0_SHORTCUT="So."
COM_SPORTSMANAGER_DAY_1_SHORTCUT="Mo." COM_SPORTSMANAGER_DAY_1_SHORTCUT="Mo."
@@ -289,7 +294,6 @@ COM_SPORTSMANAGER_REQUEST_MESSAGE_PLURAL="Es m&uuml;ssen mindestens %d Termine v
COM_SPORTSMANAGER_REJECT_SHIFT="Verschiebung ablehnen" COM_SPORTSMANAGER_REJECT_SHIFT="Verschiebung ablehnen"
COM_SPORTSMANAGER_TO="bis" COM_SPORTSMANAGER_TO="bis"
COM_SPORTSMANAGER_PLAYER_STATISTICS="Spielerstatistiken" COM_SPORTSMANAGER_PLAYER_STATISTICS="Spielerstatistiken"
COM_SPORTSMANAGER_PERFORMANCE_INDEX="Leistungsindex"
COM_SPORTSMANAGER_PERFORMANCE_INDEX_SHORTCUT="LI" COM_SPORTSMANAGER_PERFORMANCE_INDEX_SHORTCUT="LI"
COM_SPORTSMANAGER_WON="gewonnen" COM_SPORTSMANAGER_WON="gewonnen"
COM_SPORTSMANAGER_LOST="verloren" COM_SPORTSMANAGER_LOST="verloren"
@@ -311,6 +315,9 @@ COM_SPORTSMANAGER_FOR_OTHER_CONTACT="F&uuml;r andere Ansprechpartner"
COM_SPORTSMANAGER_DATES_REGISTERED_USERS="Termine beantragten durch angemeldete Benutzer" COM_SPORTSMANAGER_DATES_REGISTERED_USERS="Termine beantragten durch angemeldete Benutzer"
COM_SPORTSMANAGER_VIEW_ELO_RATING="Elo-Wertung anzeigen" COM_SPORTSMANAGER_VIEW_ELO_RATING="Elo-Wertung anzeigen"
COM_SPORTSMANAGER_VIEW_SPORTSMANAGER_LIZENZ="Lizenz anzeigen" COM_SPORTSMANAGER_VIEW_SPORTSMANAGER_LIZENZ="Lizenz anzeigen"
COM_SPORTSMANAGER_VIEW_LEAST_MEMBER_COUNT="Mindest Mitgliederzahl zeigen"
COM_SPORTSMANAGER_SHOW_ORGANISATION="Verband zeigen"
COM_SPORTSMANAGER_SHOW_TOURNAMENT_BRACKET="Turnierbaum anzeigen"
COM_SPORTSMANAGER_PLAYER_DETAILS="Spielerdetails" COM_SPORTSMANAGER_PLAYER_DETAILS="Spielerdetails"
COM_SPORTSMANAGER_PLAYER_LIST_DETAILS="Spielerliste/-details" COM_SPORTSMANAGER_PLAYER_LIST_DETAILS="Spielerliste/-details"
COM_SPORTSMANAGER_PLAYER_EDIT="Spielerdaten durch Organisations-/Vereinsansprechpartner bearbeiten" COM_SPORTSMANAGER_PLAYER_EDIT="Spielerdaten durch Organisations-/Vereinsansprechpartner bearbeiten"
@@ -366,7 +373,7 @@ COM_SPORTSMANAGER_BIRTHYEAR="Geburtsjahr"
COM_SPORTSMANAGER_NAT="Nat. #" COM_SPORTSMANAGER_NAT="Nat. #"
COM_SPORTSMANAGER_INT="Intern. #" COM_SPORTSMANAGER_INT="Intern. #"
COM_SPORTSMANAGER_REMOVE_MESSAGE="Willst du den Spieler wirklich entfernen?" COM_SPORTSMANAGER_REMOVE_MESSAGE="Willst du den Spieler wirklich entfernen?"
COM_SPORTSMANAGER_BIRTHDATE="Geburtstag" COM_SPORTSMANAGER_BIRTHDATE = "Geburtstag"
COM_SPORTSMANAGER_PLACE_SHORTCUT="PLZ / Ort" COM_SPORTSMANAGER_PLACE_SHORTCUT="PLZ / Ort"
COM_SPORTSMANAGER_PHONE="Telefon" COM_SPORTSMANAGER_PHONE="Telefon"
COM_SPORTSMANAGER_MOBILE="Mobil" COM_SPORTSMANAGER_MOBILE="Mobil"
@@ -380,6 +387,7 @@ COM_SPORTSMANAGER_MEMBER_STATUS="Mitgliedsstatus"
COM_SPORTSMANAGER_ACTIVE="Aktiv" COM_SPORTSMANAGER_ACTIVE="Aktiv"
COM_SPORTSMANAGER_RESTRICTED="Eingeschränkt" COM_SPORTSMANAGER_RESTRICTED="Eingeschränkt"
COM_SPORTSMANAGER_BEATEN="Ausgetreten" COM_SPORTSMANAGER_BEATEN="Ausgetreten"
COM_SPORTSMANAGER_HIDE="Verstecken"
COM_SPORTSMANAGER_PASSIVE="Passiv" COM_SPORTSMANAGER_PASSIVE="Passiv"
COM_SPORTSMANAGER_BEATEN_CLUB="Verein ausgetreten" COM_SPORTSMANAGER_BEATEN_CLUB="Verein ausgetreten"
COM_SPORTSMANAGER_SINGLE_SEED="Elo-Startwert Einzel" COM_SPORTSMANAGER_SINGLE_SEED="Elo-Startwert Einzel"
@@ -404,8 +412,9 @@ COM_SPORTSMANAGER_COUNTRY_CODE="Landeskennung"
COM_SPORTSMANAGER_IMPORT="Importieren" COM_SPORTSMANAGER_IMPORT="Importieren"
COM_SPORTSMANAGER_IMPORT_MESSAGE="Im Import sind ausschlie&szlig;lich Spielerdaten zum Verein %s enthalten. Soll ausschlie&szlig;lich der Spielerbestand des einen Vereins aktualisiert werden, muss der zugeh&ouml;rige Verein unten ausgew&auml;hlt werden. Beinhaltet der Import den gesamten Spielerbestand einer Organisation, muss die zugeh&ouml;rige Organisation gew&auml;hlt werden." COM_SPORTSMANAGER_IMPORT_MESSAGE="Im Import sind ausschlie&szlig;lich Spielerdaten zum Verein %s enthalten. Soll ausschlie&szlig;lich der Spielerbestand des einen Vereins aktualisiert werden, muss der zugeh&ouml;rige Verein unten ausgew&auml;hlt werden. Beinhaltet der Import den gesamten Spielerbestand einer Organisation, muss die zugeh&ouml;rige Organisation gew&auml;hlt werden."
COM_SPORTSMANAGER_CHECK="Pr&uuml;fen" COM_SPORTSMANAGER_CHECK="Pr&uuml;fen"
COM_SPORTSMANAGER_IMPORT_CONFLICTS_MESSAGE="Im Import sind Konflikte enthalten, die im Vorfeld manuell beseitigt werden müssen." 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" COM_SPORTSMANAGER_IMPORT_DUPLICATE_MESSAGE="Versuch, Spielernr. auf eine bereits für einen anderen Spieler vergebene Spielernr. zu ändern"
COM_SPORTSMANAGER_IMPORT_WRONG_FORMAT_PLAYERNUMBER="Eine oder mehrere Spielernummer enthalten ein ung&uuml;ltiges Format"
COM_SPORTSMANAGER_NAME2="Name" COM_SPORTSMANAGER_NAME2="Name"
COM_SPORTSMANAGER_DATA_IMPORT_ABORT_MESSAGE="Der Import wird abgebrochen, da Konflikte bei den zu importierenden Spielerdaten bestehen. Bitte kontaktiere einen Moderator und sende dabei die Importdatei mit!" COM_SPORTSMANAGER_DATA_IMPORT_ABORT_MESSAGE="Der Import wird abgebrochen, da Konflikte bei den zu importierenden Spielerdaten bestehen. Bitte kontaktiere einen Moderator und sende dabei die Importdatei mit!"
COM_SPORTSMANAGER_DATA_IMPORT_NO_CONFLICTS="Es bestehen keine Konflikte bei den zu importierenden Spielerdaten." COM_SPORTSMANAGER_DATA_IMPORT_NO_CONFLICTS="Es bestehen keine Konflikte bei den zu importierenden Spielerdaten."
@@ -536,6 +545,7 @@ COM_SPORTSMANAGER_FULL_RATING="Volle Wertung"
COM_SPORTSMANAGER_NO_RATING="Keine Wertung" COM_SPORTSMANAGER_NO_RATING="Keine Wertung"
COM_SPORTSMANAGER_TEAM_COMPETITIONS="Mannschaftswettbewerbe" COM_SPORTSMANAGER_TEAM_COMPETITIONS="Mannschaftswettbewerbe"
COM_SPORTSMANAGER_TABLE_SUMMARY="Tabellenwertung" COM_SPORTSMANAGER_TABLE_SUMMARY="Tabellenwertung"
COM_SPORTSMANAGER_HEAD_TO_HEAD_RECORD="Direkter Vergleich"
COM_SPORTSMANAGER_POINTS_WON_LOST_DIFFERENCE="Spielpunkte gewonnen, Spielpunkte verloren, Punktedifferenz" COM_SPORTSMANAGER_POINTS_WON_LOST_DIFFERENCE="Spielpunkte gewonnen, Spielpunkte verloren, Punktedifferenz"
COM_SPORTSMANAGER_PERFORMANCE_INDEX="Leistungsindex (SP+ * SP+ * 100) / (SP+ + SP-), Spielpunkte gewonnen, ..." COM_SPORTSMANAGER_PERFORMANCE_INDEX="Leistungsindex (SP+ * SP+ * 100) / (SP+ + SP-), Spielpunkte gewonnen, ..."
COM_SPORTSMANAGER_PERFORMANCE_INDEX2="Leistungsindex (S * P+ * 10) / (P+ + P-), Spielpunkte gewonnen, ..." COM_SPORTSMANAGER_PERFORMANCE_INDEX2="Leistungsindex (S * P+ * 10) / (P+ + P-), Spielpunkte gewonnen, ..."
@@ -604,7 +614,10 @@ COM_SPORTSMANAGER_ONLY_DETAILED_RATING_POINT_DIFFERENCE="Nur Detailwertung nach
COM_SPORTSMANAGER_ONLY_DETAILED_POINTS_AFTER_POINTSRATE="Nur Detailwertung nach Punktequote" COM_SPORTSMANAGER_ONLY_DETAILED_POINTS_AFTER_POINTSRATE="Nur Detailwertung nach Punktequote"
COM_SPORTSMANAGER_KO_SIMPLE_FULL="K.O. (einfach oder vollstaendige Ausspielung aller Plaetze)" COM_SPORTSMANAGER_KO_SIMPLE_FULL="K.O. (einfach oder vollstaendige Ausspielung aller Plaetze)"
COM_SPORTSMANAGER_MANUAL_PRO_TEAMS="Manuell (pro Mannschaft)" COM_SPORTSMANAGER_MANUAL_PRO_TEAMS="Manuell (pro Mannschaft)"
COM_SPORTSMANAGER_CUP_DRAW_EVERY_ROUND="Pokal: Jede Runde wird neu gelost"
COM_SPORTSMANAGER_CUP_USING_SEEDING_LIST="Pokal: Losen einer Setzliste"
COM_SPORTSMANAGER_SUBDIVISION="Unterteilung" COM_SPORTSMANAGER_SUBDIVISION="Unterteilung"
COM_SPORTSMANAGER_SHOW_MATCHDAY_TITLE="Titel von Spieltag zeigen"
COM_SPORTSMANAGER_ELO_RATING="ELO-Wertung" COM_SPORTSMANAGER_ELO_RATING="ELO-Wertung"
COM_SPORTSMANAGER_ELIGIBLE_FOR_EVENT="Berechtigte f&uuml;r Veranstaltung" COM_SPORTSMANAGER_ELIGIBLE_FOR_EVENT="Berechtigte f&uuml;r Veranstaltung"
COM_SPORTSMANAGER_TITLE_LOGO="Titel-Logo" COM_SPORTSMANAGER_TITLE_LOGO="Titel-Logo"
@@ -632,6 +645,8 @@ COM_SPORTSMANAGER_GAMEDAY="Spieltag"
COM_SPORTSMANAGER_GAMEDAYS="Spieltage" COM_SPORTSMANAGER_GAMEDAYS="Spieltage"
COM_SPORTSMANAGER_ROUND="Runde" COM_SPORTSMANAGER_ROUND="Runde"
COM_SPORTSMANAGER_ROUNDS="Runden" COM_SPORTSMANAGER_ROUNDS="Runden"
COM_SPORTSMANAGER_ROUND_TITLE="Runde Bezeichnung"
COM_SPORTSMANAGER_MATCH_PLACE3="Spiel um Platz 3"
COM_SPORTSMANAGER_MONTH="Monat" COM_SPORTSMANAGER_MONTH="Monat"
COM_SPORTSMANAGER_MONTHS="Monate" COM_SPORTSMANAGER_MONTHS="Monate"
COM_SPORTSMANAGER_PLAYER_FROM_TEAM="Spieler von Mannschaft" COM_SPORTSMANAGER_PLAYER_FROM_TEAM="Spieler von Mannschaft"
@@ -647,8 +662,14 @@ COM_SPORTSMANAGER_SO_FAR="bisher"
COM_SPORTSMANAGER_PLACEMENT_AREA="Platzierungsbereich" COM_SPORTSMANAGER_PLACEMENT_AREA="Platzierungsbereich"
COM_SPORTSMANAGER_IMAGE_WITHIN_TEAM="Bild innerhalb Mannschaft" COM_SPORTSMANAGER_IMAGE_WITHIN_TEAM="Bild innerhalb Mannschaft"
COM_SPORTSMANAGER_ADD_MEETING="Begegnung hinzuf&uuml;gen" COM_SPORTSMANAGER_ADD_MEETING="Begegnung hinzuf&uuml;gen"
COM_SPORTSMANAGER_GAMEDAY_GENERATION="Spieltag erzeugen"
COM_SPORTSMANAGER_ROUND_GENERATION="Runde erzeugen" COM_SPORTSMANAGER_ROUND_GENERATION="Runde erzeugen"
COM_SPORTSMANAGER_CUP_ROUND_GENERATION="Pokalrunde auslosen"
COM_SPORTSMANAGER_GENERATE_GROUP_GAME="Gruppenspiele erzeugen" COM_SPORTSMANAGER_GENERATE_GROUP_GAME="Gruppenspiele erzeugen"
COM_SPORTSMANAGER_IMPORT_GROUP_GAME="Gruppenspiele importieren"
COM_SPORTSMANAGER_IMPORT_GROUP_GAME2="Gruppenspiele: Importieren"
COM_SPORTSMANAGER_IMPORT_GROUP_GAME_IMPORTED="Begegnungen wurden importiert"
COM_SPORTSMANAGER_IMPORT_GROUP_GAME_CREATED="Begegnungen wurden erstellt"
COM_SPORTSMANAGER_REMOVE_ALL_ENCOUNTERS="Willst du wirklich alle Begegnungen entfernen?" COM_SPORTSMANAGER_REMOVE_ALL_ENCOUNTERS="Willst du wirklich alle Begegnungen entfernen?"
COM_SPORTSMANAGER_REMOVE_ALL_MATCHES="Alle Begegnungen entfernen" COM_SPORTSMANAGER_REMOVE_ALL_MATCHES="Alle Begegnungen entfernen"
COM_SPORTSMANAGER_HOME_TEAM="Heimteam" COM_SPORTSMANAGER_HOME_TEAM="Heimteam"
@@ -694,6 +715,7 @@ COM_SPORTSMANAGER_NUMBER_DAYS="%d Tage"
COM_SPORTSMANAGER_CALENDAR_WEEK="Kalenderwoche" COM_SPORTSMANAGER_CALENDAR_WEEK="Kalenderwoche"
COM_SPORTSMANAGER_CALENDAR_WEEK_SHORTCUT="KW" COM_SPORTSMANAGER_CALENDAR_WEEK_SHORTCUT="KW"
COM_SPORTSMANAGER_PAIRING="Paarung" COM_SPORTSMANAGER_PAIRING="Paarung"
COM_SPORTSMANAGER_SETTING="Setzen"
COM_SPORTSMANAGER_PAIRINGS="Paarungen" COM_SPORTSMANAGER_PAIRINGS="Paarungen"
COM_SPORTSMANAGER_INTERMITTENT="Aussetzend" COM_SPORTSMANAGER_INTERMITTENT="Aussetzend"
COM_SPORTSMANAGER_MAXIMUM_SETS="S&auml;tze maximal" COM_SPORTSMANAGER_MAXIMUM_SETS="S&auml;tze maximal"
@@ -770,6 +792,7 @@ COM_SPORTSMANAGER_FEDERAL_STATES="Bundesl&auml;nder"
COM_SPORTSMANAGER_STATES="L&auml;nder" COM_SPORTSMANAGER_STATES="L&auml;nder"
COM_SPORTSMANAGER_YEAR="Jahr" COM_SPORTSMANAGER_YEAR="Jahr"
COM_SPORTSMANAGER_ADDITION="Zusatz" COM_SPORTSMANAGER_ADDITION="Zusatz"
COM_SPORTSMANAGER_LOCATION="Ort"
COM_SPORTSMANAGER_STATE="Land" COM_SPORTSMANAGER_STATE="Land"
COM_SPORTSMANAGER_FEDERAL_="Bundes-" COM_SPORTSMANAGER_FEDERAL_="Bundes-"
COM_SPORTSMANAGER_INFO="Info" COM_SPORTSMANAGER_INFO="Info"
@@ -827,7 +850,6 @@ COM_SPORTSMANAGER_REMOVE_STATE_REALLY="Willst du das Land wirklich entfernen?"
COM_SPORTSMANAGER_DATES_STATE="Termine Land" COM_SPORTSMANAGER_DATES_STATE="Termine Land"
COM_SPORTSMANAGER_RENAME_APPOINTMENTS_STATE="Termine mit dem bisherigen Land umbenennen" COM_SPORTSMANAGER_RENAME_APPOINTMENTS_STATE="Termine mit dem bisherigen Land umbenennen"
COM_SPORTSMANAGER_FINAL_RANKING="FINAL RANKING" COM_SPORTSMANAGER_FINAL_RANKING="FINAL RANKING"
COM_SPORTSMANAGER_HOME_TEAM2="Heimmanschaft"
COM_SPORTSMANAGER_RESULTS2="Resultat" COM_SPORTSMANAGER_RESULTS2="Resultat"
COM_SPORTSMANAGER_NO_GAMES="Keine Spiele" COM_SPORTSMANAGER_NO_GAMES="Keine Spiele"
COM_SPORTSMANAGER_END_GAME="Endspiel" COM_SPORTSMANAGER_END_GAME="Endspiel"
@@ -925,3 +947,67 @@ COM_SPORTSMANAGER_RANK="Rang"
; SPIELER BEARBEITEN ; SPIELER BEARBEITEN
COM_SPORTSMANAGER_LIZENZ="Lizenz" COM_SPORTSMANAGER_LIZENZ="Lizenz"
COM_SPORTSMANAGER_ARIA_LABEL_MATCHDAY_SELECT="Wähle einen Spieltag"
COM_SPORTSMANAGER_ARIA_LABEL_PROPOSAL_DAY="Wähle den Tag des Begegnungsvorschlags"
COM_SPORTSMANAGER_ARIA_LABEL_PROPOSAL_MONTH="Wähle den Monat des Begegnungsvorschlags"
COM_SPORTSMANAGER_ARIA_LABEL_PROPOSAL_YEAR="Wähle das Jahr des Begegnungsvorschlags"
COM_SPORTSMANAGER_ARIA_LABEL_PROPOSAL_HOUR="Wähle die Stunde des Begegnungsvorschlags"
COM_SPORTSMANAGER_ARIA_LABEL_PROPOSAL_MINUTE="Wähle die Minute des Begegnungsvorschlags"
COM_SPORTSMANAGER_ARIA_LABEL_SPECIAL_FILTER="Erweiterter Filter"
COM_SPORTSMANAGER_ARIA_LABEL_PLACE="Ort"
COM_SPORTSMANAGER_ARIA_LABEL_ELIGIBLE_CLUB="Wähle berechtigten Verein"
COM_SPORTSMANAGER_ARIA_LABEL_TOURNAMENT_START_MONTH="Monat des Turnierbeginns"
COM_SPORTSMANAGER_ARIA_LABEL_TOURNAMENT_START_YEAR="Jahr des Turnierbeginns"
COM_SPORTSMANAGER_ARIA_LABEL_TOURNAMENT_END_MONTH="Monat des Turnierendes"
COM_SPORTSMANAGER_ARIA_LABEL_TOURNAMENT_END_YEAR="Jahr des Turnierendes"
COM_SPORTSMANAGER_ARIA_LABEL_ELIGIBLE_USER="Wähle berechtigten Anwender"
COM_SPORTSMANAGER_ARIA_LABEL_POINTS_GUEST="Punkte Gast"
COM_SPORTSMANAGER_ARIA_LABEL_POINTS_HOME="Punkte Heim"
COM_SPORTSMANAGER_ARIA_LABEL_PLAYER_GUEST="Spieler Gast"
COM_SPORTSMANAGER_ARIA_LABEL_PLAYER_HOME="Spieler Heim"
COM_SPORTSMANAGER_ARIA_LABEL_SCHEDULE_DATE_MONTH="Wähle den Monat"
COM_SPORTSMANAGER_ARIA_LABEL_SCHEDULE_DATE_YEAR="Wähle das Jahr"
COM_SPORTSMANAGER_ARIA_LABEL_SCHEDULE_DATE_HOUR="Wähle eine Stunde"
COM_SPORTSMANAGER_ARIA_LABEL_SCHEDULE_DATE_MINUTE="Wähle eine Minute"
COM_SPORTSMANAGER_ARIA_LABEL_GAME_NUMBER_GUEST="Spiel Gast"
COM_SPORTSMANAGER_ARIA_LABEL_GAME_NUMBER_HOME="Spiel Heim"
COM_SPORTSMANAGER_ARIA_LABEL_GAME_LINK_DOUBLE="Verknüpfung Doppel"
COM_SPORTSMANAGER_ARIA_LABEL_GAME_LINK_SINGLE="Verknüpfung Einzel"
COM_SPORTSMANAGER_ARIA_LABEL_PLACEMENT_MIN="Platzierung Min."
COM_SPORTSMANAGER_ARIA_LABEL_PLACEMENT_MAX="Platzierung Max."
COM_SPORTSMANAGER_ARIA_LABEL_PARTICIPANT_MIN="Teilnehmer Min."
COM_SPORTSMANAGER_ARIA_LABEL_PARTICIPANT_MAX="Teilnehmer Max."
COM_SPORTSMANAGER_ARIA_LABEL_RANKING_START_MONTH="Monat des Ranglistenbeginns"
COM_SPORTSMANAGER_ARIA_LABEL_RANKING_START_YEAR="Jahr des Ranglistenbeginns"
COM_SPORTSMANAGER_ARIA_LABEL_RANKING_END_MONTH="Monat des Ranglistenendes"
COM_SPORTSMANAGER_ARIA_LABEL_RANKING_END_YEAR="Jahr des Ranglistenendes"
COM_SPORTSMANAGER_ARIA_LABEL_MAXIMUM_EVALUATED_COUNT="Maximal gewertete Teilnahmen"
COM_SPORTSMANAGER_ARIA_LABEL_STATISTICS_START_MONTH="Monat des Statistikbeginns"
COM_SPORTSMANAGER_ARIA_LABEL_STATISTICS_START_YEAR="Jahr des Statistikbeginns"
COM_SPORTSMANAGER_ARIA_LABEL_STATISTICS_END_MONTH="Monat des Statistikendes"
COM_SPORTSMANAGER_ARIA_LABEL_STATISTICS_END_YEAR="Jahr des Statistikendes"
COM_SPORTSMANAGER_ARIA_LABEL_ELIGIBLE_ORGANIZER="Wähle berechtigten Veranstalter"
COM_SPORTSMANAGER_ARIA_LABEL_EVENT_START_MONTH="Monat des Veranstaltungsbeginns"
COM_SPORTSMANAGER_ARIA_LABEL_EVENT_START_YEAR="Jahr des Veranstaltungsbeginns"
COM_SPORTSMANAGER_ARIA_LABEL_EVENT_END_MONTH="Monat des Veranstaltungsendes"
COM_SPORTSMANAGER_ARIA_LABEL_EVENT_END_YEAR="Jahr des Veranstaltungsendes"
COM_SPORTSMANAGER_ARIA_LABEL_FIRST_ROUND="Erste Runde"
COM_SPORTSMANAGER_ARIA_LABEL_FIRST_ROUND_TYPE="Erste Runde Typ"
COM_SPORTSMANAGER_ARIA_LABEL_FIRST_ROUND_PLACE="Erste Runde Platzierung"
COM_SPORTSMANAGER_ARIA_LABEL_LAST_ROUND="Letzte Runde"
COM_SPORTSMANAGER_ARIA_LABEL_LAST_ROUND_TYPE="Letzte Runde Typ"
COM_SPORTSMANAGER_ARIA_LABEL_LAST_ROUND_PLACE="Letzte Runde Platzierung"
COM_SPORTSMANAGER_ARIA_LABEL_ROUND_TYPE="Rundentyp"
COM_SPORTSMANAGER_ARIA_LABEL_ROUND_PLACE="Rundenplatzierung"
COM_SPORTSMANAGER_HOME_POINTS="Heim Punkte"
COM_SPORTSMANAGER_GUEST_POINTS="Gast Punkte"
COM_SPORTSMANAGER_ARIA_LABEL_ENCOUNTER_YEAR="Jahr der Begegnung"
COM_SPORTSMANAGER_ARIA_LABEL_PAIRING_TEAM="Team für Paarung"
COM_SPORTSMANAGER_ARIA_LABEL_ELIGIBLE_COMPETITION="Wähle berechtigten Anwender"
COM_SPORTSMANAGER_ARIA_LABEL_RANKING_EVALUATION="Ranking Wertung"
COM_SPORTSMANAGER_ARIA_LABEL_LASTNAME="Nachname"
COM_SPORTSMANAGER_ARIA_LABEL_FIRSTNAME="Vorname"
COM_SPORTSMANAGER_ARIA_LABEL_CLUB="Verein"
COM_SPORTSMANAGER_NUM_REQUESTED_SHIFTS="Verschiebungen"
COM_SPORTSMANAGER_NUM_REQUESTED_SHFITS_TOOLTIP="Spielverschiebungen durch diese Mannschaft"
COM_SPORTSMANAGER_GAME_RESULT_DELAYS="Verzögerung"
@@ -1,4 +1,4 @@
; Sports Manager (C) 2006-2020, Sven Nickel ; Sports Manager (C) 2006-2020, Sven Nickel
COM_SPORTSMANAGER="Sports Manager" COM_SPORTSMANAGER="Sports Manager"
COM_SPORTSMANAGER_PLAYERS="Players" COM_SPORTSMANAGER_PLAYERS="Players"
COM_SPORTSMANAGER_CLUBS="Clubs" COM_SPORTSMANAGER_CLUBS="Clubs"
@@ -21,6 +21,7 @@ COM_SPORTSMANAGER_LOCATIONS="Locations"
COM_SPORTSMANAGER_SEASONS="Seasons" COM_SPORTSMANAGER_SEASONS="Seasons"
COM_SPORTSMANAGER_TEAM_PLANS="Team plans" COM_SPORTSMANAGER_TEAM_PLANS="Team plans"
COM_SPORTSMANAGER_TEAM_NAME="Team name" COM_SPORTSMANAGER_TEAM_NAME="Team name"
COM_SPORTSMANAGER_TEAM_NAME_SHORT="Team name short (max 24)"
COM_SPORTSMANAGER_TEAM_NAME2="Club name" COM_SPORTSMANAGER_TEAM_NAME2="Club name"
COM_SPORTSMANAGER_TEAM_SEAT="Club location" COM_SPORTSMANAGER_TEAM_SEAT="Club location"
COM_SPORTSMANAGER_POSTPONE_RULES="Postpone rules" COM_SPORTSMANAGER_POSTPONE_RULES="Postpone rules"
@@ -70,17 +71,18 @@ COM_SPORTSMANAGER_CONFIRM_REMOVE_RANKING="Do you really want to remove the ranki
COM_SPORTSMANAGER_ADD_INDIVIDUAL_COMPETITION="Add individual competition" COM_SPORTSMANAGER_ADD_INDIVIDUAL_COMPETITION="Add individual competition"
COM_SPORTSMANAGER_INDIVIDUAL_COMPETITION="Individual competition" COM_SPORTSMANAGER_INDIVIDUAL_COMPETITION="Individual competition"
COM_SPORTSMANAGER_INDIVIDUAL_COMPETITIONS="Individual competitions" COM_SPORTSMANAGER_INDIVIDUAL_COMPETITIONS="Individual competitions"
COM_SPORTSMANAGER_ASSOCIATION_BODIES="Association bodies"
COM_SPORTSMANAGER_GAME="Game" COM_SPORTSMANAGER_GAME="Game"
COM_SPORTSMANAGER_GAMES="Games" COM_SPORTSMANAGER_GAMES="Games"
COM_SPORTSMANAGER_GAMES_SHORTCUT="G" COM_SPORTSMANAGER_GAMES_SHORTCUT="G"
COM_SPORTSMANAGER_ADD_PLAYER_STATISTICS="Add player statistics" COM_SPORTSMANAGER_ADD_PLAYER_STATISTICS="Add player statistics"
COM_SPORTSMANAGER_PLAYER_STATISTICS="Player statistics" COM_SPORTSMANAGER_PLAYER_STATISTIC="Player statistics"
COM_SPORTSMANAGER_COMPETITION="Competition" COM_SPORTSMANAGER_COMPETITION="Competition"
COM_SPORTSMANAGER_COMPETITIONS="Competitions" COM_SPORTSMANAGER_COMPETITIONS="Competitions"
COM_SPORTSMANAGER_IN_COMPETITIONS="in competition" COM_SPORTSMANAGER_IN_COMPETITIONS="in competition"
COM_SPORTSMANAGER_COMPETITIONS_SHORTCUT="C" COM_SPORTSMANAGER_COMPETITIONS_SHORTCUT="C"
COM_SPORTSMANAGER_DUPLICATE="Duplicate" COM_SPORTSMANAGER_DUPLICATE="Duplicate"
COM_SPORTSMANAGER_CONFIRM_REMOVE_RANKING="Do you really want to remove the player statistics?" COM_SPORTSMANAGER_CONFIRM_REMOVE_PLAYER_STATISTICS="Do you really want to remove the player statistics?"
COM_SPORTSMANAGER_LIVE_TICKER="Live ticker" COM_SPORTSMANAGER_LIVE_TICKER="Live ticker"
COM_SPORTSMANAGER_PLACE="Place" COM_SPORTSMANAGER_PLACE="Place"
COM_SPORTSMANAGER_TEAM="Team" COM_SPORTSMANAGER_TEAM="Team"
@@ -128,11 +130,14 @@ COM_SPORTSMANAGER_QUARTER_FINAL="Quarter final"
COM_SPORTSMANAGER_QUARTER_FINAL_SHORTCUT="1/4" COM_SPORTSMANAGER_QUARTER_FINAL_SHORTCUT="1/4"
COM_SPORTSMANAGER_ROUND_OF_16="Round of sixteen" COM_SPORTSMANAGER_ROUND_OF_16="Round of sixteen"
COM_SPORTSMANAGER_ROUND_OF_16_SHORTCUT="1/8" COM_SPORTSMANAGER_ROUND_OF_16_SHORTCUT="1/8"
COM_SPORTSMANAGER_ROUND_OF_32="Round of thiry-two" COM_SPORTSMANAGER_ROUND_OF_32="Round of thirty-two"
COM_SPORTSMANAGER_ROUND_OF_32_ALT="Round of thirty-two"
COM_SPORTSMANAGER_ROUND_OF_32_SHORTCUT="1/16" COM_SPORTSMANAGER_ROUND_OF_32_SHORTCUT="1/16"
COM_SPORTSMANAGER_ROUND_OF_64="Round of sixty-four" COM_SPORTSMANAGER_ROUND_OF_64="Round of sixty-four"
COM_SPORTSMANAGER_ROUND_OF_64_ALT="Round of sixty-four"
COM_SPORTSMANAGER_ROUND_OF_64_SHORTCUT="1/32" COM_SPORTSMANAGER_ROUND_OF_64_SHORTCUT="1/32"
COM_SPORTSMANAGER_ROUND_OF_128="Round of 128" COM_SPORTSMANAGER_ROUND_OF_128="Round of 128"
COM_SPORTSMANAGER_ROUND_OF_128_ALT="Round of 128"
COM_SPORTSMANAGER_ROUND_OF_128_SHORTCUT="1/64" COM_SPORTSMANAGER_ROUND_OF_128_SHORTCUT="1/64"
COM_SPORTSMANAGER_DAY_0_SHORTCUT="Su." COM_SPORTSMANAGER_DAY_0_SHORTCUT="Su."
COM_SPORTSMANAGER_DAY_1_SHORTCUT="Mo." COM_SPORTSMANAGER_DAY_1_SHORTCUT="Mo."
@@ -289,7 +294,6 @@ COM_SPORTSMANAGER_REQUEST_MESSAGE_PLURAL="At least %d dates must be given comple
COM_SPORTSMANAGER_REJECT_SHIFT="Reject shift" COM_SPORTSMANAGER_REJECT_SHIFT="Reject shift"
COM_SPORTSMANAGER_TO="until" COM_SPORTSMANAGER_TO="until"
COM_SPORTSMANAGER_PLAYER_STATISTICS="Player statistics" COM_SPORTSMANAGER_PLAYER_STATISTICS="Player statistics"
COM_SPORTSMANAGER_PERFORMANCE_INDEX="Performance index"
COM_SPORTSMANAGER_PERFORMANCE_INDEX_SHORTCUT="PI" COM_SPORTSMANAGER_PERFORMANCE_INDEX_SHORTCUT="PI"
COM_SPORTSMANAGER_WON="won" COM_SPORTSMANAGER_WON="won"
COM_SPORTSMANAGER_LOST="lost" COM_SPORTSMANAGER_LOST="lost"
@@ -311,6 +315,9 @@ COM_SPORTSMANAGER_FOR_OTHER_CONTACT="For other contact"
COM_SPORTSMANAGER_DATES_REGISTERED_USERS="Apply dates by registered users" COM_SPORTSMANAGER_DATES_REGISTERED_USERS="Apply dates by registered users"
COM_SPORTSMANAGER_VIEW_ELO_RATING="View Elo rating" COM_SPORTSMANAGER_VIEW_ELO_RATING="View Elo rating"
COM_SPORTSMANAGER_VIEW_SPORTSMANAGER_LIZENZ="Show License" COM_SPORTSMANAGER_VIEW_SPORTSMANAGER_LIZENZ="Show License"
COM_SPORTSMANAGER_VIEW_LEAST_MEMBER_COUNT="Show least member count"
COM_SPORTSMANAGER_SHOW_ORGANISATION="Show organisation"
COM_SPORTSMANAGER_SHOW_TOURNAMENT_BRACKET="Show Tournament Bracket"
COM_SPORTSMANAGER_PLAYER_DETAILS="Player details" COM_SPORTSMANAGER_PLAYER_DETAILS="Player details"
COM_SPORTSMANAGER_PLAYER_LIST_DETAILS="Player list details" COM_SPORTSMANAGER_PLAYER_LIST_DETAILS="Player list details"
COM_SPORTSMANAGER_PLAYER_EDIT="Edit player data by organisation/club contacts" COM_SPORTSMANAGER_PLAYER_EDIT="Edit player data by organisation/club contacts"
@@ -362,7 +369,7 @@ COM_SPORTSMANAGER_IDENTICAL_NAME="Identical name"
COM_SPORTSMANAGER_IDENTICAL_NAME_BIRTHYEAR="Identical name and birth year" COM_SPORTSMANAGER_IDENTICAL_NAME_BIRTHYEAR="Identical name and birth year"
COM_SPORTSMANAGER_NO_PLAYERS="No player number" COM_SPORTSMANAGER_NO_PLAYERS="No player number"
COM_SPORTSMANAGER_LAST_FIRST_NAME="Last name, first name" COM_SPORTSMANAGER_LAST_FIRST_NAME="Last name, first name"
COM_SPORTSMANAGER_BIRTHYEAR="birthyear" COM_SPORTSMANAGER_BIRTHYEAR="Birthyear"
COM_SPORTSMANAGER_NAT="Nat. #" COM_SPORTSMANAGER_NAT="Nat. #"
COM_SPORTSMANAGER_INT="Intern. #" COM_SPORTSMANAGER_INT="Intern. #"
COM_SPORTSMANAGER_REMOVE_MESSAGE="Do you really want to remove the player?" COM_SPORTSMANAGER_REMOVE_MESSAGE="Do you really want to remove the player?"
@@ -380,6 +387,7 @@ COM_SPORTSMANAGER_MEMBER_STATUS="Member status"
COM_SPORTSMANAGER_ACTIVE="Active" COM_SPORTSMANAGER_ACTIVE="Active"
COM_SPORTSMANAGER_RESTRICTED="Restricted" COM_SPORTSMANAGER_RESTRICTED="Restricted"
COM_SPORTSMANAGER_BEATEN="Excreted" COM_SPORTSMANAGER_BEATEN="Excreted"
COM_SPORTSMANAGER_HIDE="Hide"
COM_SPORTSMANAGER_PASSIVE="Passive" COM_SPORTSMANAGER_PASSIVE="Passive"
COM_SPORTSMANAGER_BEATEN_CLUB="Club excreted" COM_SPORTSMANAGER_BEATEN_CLUB="Club excreted"
COM_SPORTSMANAGER_SINGLE_SEED="Elo starting value singles" COM_SPORTSMANAGER_SINGLE_SEED="Elo starting value singles"
@@ -404,8 +412,9 @@ COM_SPORTSMANAGER_COUNTRY_CODE="Country code"
COM_SPORTSMANAGER_IMPORT="Import" 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."
COM_SPORTSMANAGER_CHECK="Check" COM_SPORTSMANAGER_CHECK="Check"
COM_SPORTSMANAGER_IMPORT_CONFLICTS_MESSAGE="There are conflicts in the import which have to be fixed manually first." 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." COM_SPORTSMANAGER_IMPORT_DUPLICATE_MESSAGE="Attempt to change player number into one that is already assigned to another player."
COM_SPORTSMANAGER_IMPORT_WRONG_FORMAT_PLAYERNUMBER="One or more player numbers contain an invalid format"
COM_SPORTSMANAGER_NAME2="Name" COM_SPORTSMANAGER_NAME2="Name"
COM_SPORTSMANAGER_DATA_IMPORT_ABORT_MESSAGE="The import has been aborted because there are conflicts in the containing player information. Please contact a moderator and attach the import!" COM_SPORTSMANAGER_DATA_IMPORT_ABORT_MESSAGE="The import has been aborted because there are conflicts in the containing player information. Please contact a moderator and attach the import!"
COM_SPORTSMANAGER_DATA_IMPORT_NO_CONFLICTS="There are conflicts in the containing player information." COM_SPORTSMANAGER_DATA_IMPORT_NO_CONFLICTS="There are conflicts in the containing player information."
@@ -444,7 +453,7 @@ COM_SPORTSMANAGER_NOTE="Note"
COM_SPORTSMANAGER_WANT_REALLY_REMOVE="Do you really want to remove the club?" COM_SPORTSMANAGER_WANT_REALLY_REMOVE="Do you really want to remove the club?"
COM_SPORTSMANAGER_ADD="Add" COM_SPORTSMANAGER_ADD="Add"
COM_SPORTSMANAGER_REMOVE_ACCOUNT="Remove account" COM_SPORTSMANAGER_REMOVE_ACCOUNT="Remove account"
COM_SPORTSMANAGER_DISTRICT="Ristrict" COM_SPORTSMANAGER_DISTRICT="District"
COM_SPORTSMANAGER_ELIGIBLE_FOR_TEAM="Eligible for team" COM_SPORTSMANAGER_ELIGIBLE_FOR_TEAM="Eligible for team"
COM_SPORTSMANAGER_ELIGIBLE_FOR_CLUB="Eligible for club" COM_SPORTSMANAGER_ELIGIBLE_FOR_CLUB="Eligible for club"
COM_SPORTSMANAGER_SAVED_CLUB="Club to maintain" COM_SPORTSMANAGER_SAVED_CLUB="Club to maintain"
@@ -536,6 +545,7 @@ COM_SPORTSMANAGER_FULL_RATING="Full rating"
COM_SPORTSMANAGER_NO_RATING="No rating" COM_SPORTSMANAGER_NO_RATING="No rating"
COM_SPORTSMANAGER_TEAM_COMPETITIONS="Team competitions" COM_SPORTSMANAGER_TEAM_COMPETITIONS="Team competitions"
COM_SPORTSMANAGER_TABLE_SUMMARY="Table rating" COM_SPORTSMANAGER_TABLE_SUMMARY="Table rating"
COM_SPORTSMANAGER_HEAD_TO_HEAD_RECORD="Head-to-head record"
COM_SPORTSMANAGER_POINTS_WON_LOST_DIFFERENCE="Game points won, game points lost, point difference" COM_SPORTSMANAGER_POINTS_WON_LOST_DIFFERENCE="Game points won, game points lost, point difference"
COM_SPORTSMANAGER_PERFORMANCE_INDEX="Performance index (GP+ * GP+ * 100) / (GP+ + GP-), game points won, ..." COM_SPORTSMANAGER_PERFORMANCE_INDEX="Performance index (GP+ * GP+ * 100) / (GP+ + GP-), game points won, ..."
COM_SPORTSMANAGER_PERFORMANCE_INDEX2="Performance index (games * P+ * 10) / (P+ + P-), game points won, ..." COM_SPORTSMANAGER_PERFORMANCE_INDEX2="Performance index (games * P+ * 10) / (P+ + P-), game points won, ..."
@@ -604,7 +614,10 @@ COM_SPORTSMANAGER_ONLY_DETAILED_RATING_POINT_DIFFERENCE="Only detailed ranking b
COM_SPORTSMANAGER_ONLY_DETAILED_POINTS_AFTER_POINTSRATE="Only detailed ranking by points rate" COM_SPORTSMANAGER_ONLY_DETAILED_POINTS_AFTER_POINTSRATE="Only detailed ranking by points rate"
COM_SPORTSMANAGER_KO_SIMPLE_FULL="K.O. (singles or full playout of all places)" COM_SPORTSMANAGER_KO_SIMPLE_FULL="K.O. (singles or full playout of all places)"
COM_SPORTSMANAGER_MANUAL_PRO_TEAMS="Manual (per team)" COM_SPORTSMANAGER_MANUAL_PRO_TEAMS="Manual (per team)"
COM_SPORTSMANAGER_CUP_DRAW_EVERY_ROUND="Cup: draw every round"
COM_SPORTSMANAGER_CUP_USING_SEEDING_LIST="Cup: draw seeding list"
COM_SPORTSMANAGER_SUBDIVISION="Subdivision" COM_SPORTSMANAGER_SUBDIVISION="Subdivision"
COM_SPORTSMANAGER_SHOW_MATCHDAY_TITLE="Show title matchday"
COM_SPORTSMANAGER_ELO_RATING="Elo rating" COM_SPORTSMANAGER_ELO_RATING="Elo rating"
COM_SPORTSMANAGER_ELIGIBLE_FOR_EVENT="Eligibles for competition" COM_SPORTSMANAGER_ELIGIBLE_FOR_EVENT="Eligibles for competition"
COM_SPORTSMANAGER_TITLE_LOGO="Title logo" COM_SPORTSMANAGER_TITLE_LOGO="Title logo"
@@ -632,6 +645,8 @@ COM_SPORTSMANAGER_GAMEDAY="Gameday"
COM_SPORTSMANAGER_GAMEDAYS="Gamedays" COM_SPORTSMANAGER_GAMEDAYS="Gamedays"
COM_SPORTSMANAGER_ROUND="Round" COM_SPORTSMANAGER_ROUND="Round"
COM_SPORTSMANAGER_ROUNDS="Rounds" COM_SPORTSMANAGER_ROUNDS="Rounds"
COM_SPORTSMANAGER_ROUND_TITLE="Round Title"
COM_SPORTSMANAGER_MATCH_PLACE3="Match for place 3"
COM_SPORTSMANAGER_MONTH="Month" COM_SPORTSMANAGER_MONTH="Month"
COM_SPORTSMANAGER_MONTHS="Months" COM_SPORTSMANAGER_MONTHS="Months"
COM_SPORTSMANAGER_PLAYER_FROM_TEAM="Player of team" COM_SPORTSMANAGER_PLAYER_FROM_TEAM="Player of team"
@@ -647,8 +662,14 @@ COM_SPORTSMANAGER_SO_FAR="so far"
COM_SPORTSMANAGER_PLACEMENT_AREA="Placement area" COM_SPORTSMANAGER_PLACEMENT_AREA="Placement area"
COM_SPORTSMANAGER_IMAGE_WITHIN_TEAM="Image within team" COM_SPORTSMANAGER_IMAGE_WITHIN_TEAM="Image within team"
COM_SPORTSMANAGER_ADD_MEETING="Add match" COM_SPORTSMANAGER_ADD_MEETING="Add match"
COM_SPORTSMANAGER_GAMEDAY_GENERATION="Generate gameday"
COM_SPORTSMANAGER_ROUND_GENERATION="Generate round" COM_SPORTSMANAGER_ROUND_GENERATION="Generate round"
COM_SPORTSMANAGER_CUP_ROUND_GENERATION="Generate cup round"
COM_SPORTSMANAGER_GENERATE_GROUP_GAME="Generate group games" COM_SPORTSMANAGER_GENERATE_GROUP_GAME="Generate group games"
COM_SPORTSMANAGER_Import_GROUP_GAME="Import group games"
COM_SPORTSMANAGER_Import_GROUP_GAME2="Group games: Import"
COM_SPORTSMANAGER_IMPORT_GROUP_GAME_IMPORTED="matches were imported"
COM_SPORTSMANAGER_IMPORT_GROUP_GAME_CREATED="matches were created"
COM_SPORTSMANAGER_REMOVE_ALL_ENCOUNTERS="Do you really want to remove all matches?" COM_SPORTSMANAGER_REMOVE_ALL_ENCOUNTERS="Do you really want to remove all matches?"
COM_SPORTSMANAGER_REMOVE_ALL_MATCHES="Remove all matches" COM_SPORTSMANAGER_REMOVE_ALL_MATCHES="Remove all matches"
COM_SPORTSMANAGER_HOME_TEAM="Home team" COM_SPORTSMANAGER_HOME_TEAM="Home team"
@@ -694,6 +715,7 @@ COM_SPORTSMANAGER_NUMBER_DAYS="%d days"
COM_SPORTSMANAGER_CALENDAR_WEEK="Calendar week" COM_SPORTSMANAGER_CALENDAR_WEEK="Calendar week"
COM_SPORTSMANAGER_CALENDAR_WEEK_SHORTCUT="CW" COM_SPORTSMANAGER_CALENDAR_WEEK_SHORTCUT="CW"
COM_SPORTSMANAGER_PAIRING="Fixture" COM_SPORTSMANAGER_PAIRING="Fixture"
COM_SPORTSMANAGER_SETTING="Setting"
COM_SPORTSMANAGER_PAIRINGS="Fixtures" COM_SPORTSMANAGER_PAIRINGS="Fixtures"
COM_SPORTSMANAGER_INTERMITTENT="Skipping" COM_SPORTSMANAGER_INTERMITTENT="Skipping"
COM_SPORTSMANAGER_MAXIMUM_SETS="Maximum sets" COM_SPORTSMANAGER_MAXIMUM_SETS="Maximum sets"
@@ -770,6 +792,7 @@ COM_SPORTSMANAGER_FEDERAL_STATES="State"
COM_SPORTSMANAGER_STATES="Countries" COM_SPORTSMANAGER_STATES="Countries"
COM_SPORTSMANAGER_YEAR="Year" COM_SPORTSMANAGER_YEAR="Year"
COM_SPORTSMANAGER_ADDITION="Addition" COM_SPORTSMANAGER_ADDITION="Addition"
COM_SPORTSMANAGER_LOCATION="Location"
COM_SPORTSMANAGER_STATE="Germany" COM_SPORTSMANAGER_STATE="Germany"
COM_SPORTSMANAGER_FEDERAL_="Federal " COM_SPORTSMANAGER_FEDERAL_="Federal "
COM_SPORTSMANAGER_INFO="Info" COM_SPORTSMANAGER_INFO="Info"
@@ -827,7 +850,6 @@ COM_SPORTSMANAGER_REMOVE_STATE_REALLY="Do you really want to remove the country?
COM_SPORTSMANAGER_DATES_STATE="Appointments country" COM_SPORTSMANAGER_DATES_STATE="Appointments country"
COM_SPORTSMANAGER_RENAME_APPOINTMENTS_STATE="Rename appointments with the preset country" COM_SPORTSMANAGER_RENAME_APPOINTMENTS_STATE="Rename appointments with the preset country"
COM_SPORTSMANAGER_FINAL_RANKING="FINAL RANKING" COM_SPORTSMANAGER_FINAL_RANKING="FINAL RANKING"
COM_SPORTSMANAGER_HOME_TEAM2="Home team"
COM_SPORTSMANAGER_RESULTS2="Result" COM_SPORTSMANAGER_RESULTS2="Result"
COM_SPORTSMANAGER_NO_GAMES="No games" COM_SPORTSMANAGER_NO_GAMES="No games"
COM_SPORTSMANAGER_END_GAME="Final" COM_SPORTSMANAGER_END_GAME="Final"
@@ -921,3 +943,69 @@ COM_SPORTSMANAGER_NON_SMOKING_PROTECTION_MARK_NO=" (Kein Nichtraucherschutz)"
COM_SPORTSMANAGER_POINTS_TABLE="Points table" COM_SPORTSMANAGER_POINTS_TABLE="Points table"
COM_SPORTSMANAGER_EVALUATION="Auswertung" COM_SPORTSMANAGER_EVALUATION="Auswertung"
COM_SPORTSMANAGER_FUNCTION_DESCRIPTION="Variables: n = number of participants, p = place, m = multiplier of rating and in doubles possibly additionally reduced rating<br />Functions: +, -, *, /, round(x), pow(x), if(a > b, x, y), min(x, y), max(x, y), log(x), ln(x), logn(b, x)<br />VerteilungR(r, p, n, m) := max(round((((m * r - 1) * (-log(p / n) * (1 - (p / n)))) / (-log(1 / n) * (1 - (1 / n)))) + 1), 1)<br />Verteilung(r, p, n, m) := max(round(m * round((((r - 1) * (-log(p / n) * (1 - (p / n)))) / (-log(1 / n) * (1 - (1 / n)))) + 1)), 1)<br /><br />The functions VerteilungR() and Verteilung() distribute points for place 1 (r) descending to the individual places (p) of the number of participants (n).<br />VerteilungR() applies the multiplier (m) to the points for 1st place and then distributes down to 1 point for the last place.<br />Verteilung() applies the multiplier (m) to the points after the calculation, i.e. the last place receives 1 * m points." COM_SPORTSMANAGER_FUNCTION_DESCRIPTION="Variables: n = number of participants, p = place, m = multiplier of rating and in doubles possibly additionally reduced rating<br />Functions: +, -, *, /, round(x), pow(x), if(a > b, x, y), min(x, y), max(x, y), log(x), ln(x), logn(b, x)<br />VerteilungR(r, p, n, m) := max(round((((m * r - 1) * (-log(p / n) * (1 - (p / n)))) / (-log(1 / n) * (1 - (1 / n)))) + 1), 1)<br />Verteilung(r, p, n, m) := max(round(m * round((((r - 1) * (-log(p / n) * (1 - (p / n)))) / (-log(1 / n) * (1 - (1 / n)))) + 1)), 1)<br /><br />The functions VerteilungR() and Verteilung() distribute points for place 1 (r) descending to the individual places (p) of the number of participants (n).<br />VerteilungR() applies the multiplier (m) to the points for 1st place and then distributes down to 1 point for the last place.<br />Verteilung() applies the multiplier (m) to the points after the calculation, i.e. the last place receives 1 * m points."
COM_SPORTSMANAGER_LIZENZ="License"
COM_SPORTSMANAGER_ARIA_LABEL_MATCHDAY_SELECT="Choose a match day"
COM_SPORTSMANAGER_ARIA_LABEL_PROPOSAL_DAY="Choose the day of the match proposal"
COM_SPORTSMANAGER_ARIA_LABEL_PROPOSAL_MONTH="Choose the month of the match proposal"
COM_SPORTSMANAGER_ARIA_LABEL_PROPOSAL_YEAR="Choose the year of the match proposal"
COM_SPORTSMANAGER_ARIA_LABEL_PROPOSAL_HOUR="Choose the hour of the match proposal"
COM_SPORTSMANAGER_ARIA_LABEL_PROPOSAL_MINUTE="Choose the minute of the match proposal"
COM_SPORTSMANAGER_ARIA_LABEL_SPECIAL_FILTER="Advanced Filter"
COM_SPORTSMANAGER_ARIA_LABEL_PLACE="Location"
COM_SPORTSMANAGER_ARIA_LABEL_ELIGIBLE_CLUB="Choose eligible club"
COM_SPORTSMANAGER_ARIA_LABEL_TOURNAMENT_START_MONTH="Month of tournament start"
COM_SPORTSMANAGER_ARIA_LABEL_TOURNAMENT_START_YEAR="Year of tournament start"
COM_SPORTSMANAGER_ARIA_LABEL_TOURNAMENT_END_MONTH="Month of tournament end"
COM_SPORTSMANAGER_ARIA_LABEL_TOURNAMENT_END_YEAR="Year of tournament end"
COM_SPORTSMANAGER_ARIA_LABEL_ELIGIBLE_USER="Choose eligible user"
COM_SPORTSMANAGER_ARIA_LABEL_POINTS_GUEST="Points away"
COM_SPORTSMANAGER_ARIA_LABEL_POINTS_HOME="Points home"
COM_SPORTSMANAGER_ARIA_LABEL_PLAYER_GUEST="Player away"
COM_SPORTSMANAGER_ARIA_LABEL_PLAYER_HOME="Player home"
COM_SPORTSMANAGER_ARIA_LABEL_SCHEDULE_DATE_MONTH="Choose a Month"
COM_SPORTSMANAGER_ARIA_LABEL_SCHEDULE_DATE_YEAR="Choose a Year"
COM_SPORTSMANAGER_ARIA_LABEL_SCHEDULE_DATE_HOUR="Choose an Hour"
COM_SPORTSMANAGER_ARIA_LABEL_SCHEDULE_DATE_MINUTE="Choose a Minute"
COM_SPORTSMANAGER_ARIA_LABEL_GAME_NUMBER_GUEST="Game away"
COM_SPORTSMANAGER_ARIA_LABEL_GAME_NUMBER_HOME="Game home"
COM_SPORTSMANAGER_ARIA_LABEL_GAME_LINK_DOUBLE="Game link double"
COM_SPORTSMANAGER_ARIA_LABEL_GAME_LINK_SINGLE="Game link single"
COM_SPORTSMANAGER_ARIA_LABEL_PLACEMENT_MIN="Placement min."
COM_SPORTSMANAGER_ARIA_LABEL_PLACEMENT_MAX="Placement max."
COM_SPORTSMANAGER_ARIA_LABEL_PARTICIPANT_MIN="Participant min."
COM_SPORTSMANAGER_ARIA_LABEL_PARTICIPANT_MAX="Participant max."
COM_SPORTSMANAGER_ARIA_LABEL_RANKING_START_MONTH="Month of ranking start"
COM_SPORTSMANAGER_ARIA_LABEL_RANKING_START_YEAR="Year of ranking start"
COM_SPORTSMANAGER_ARIA_LABEL_RANKING_END_MONTH="Month of ranking end"
COM_SPORTSMANAGER_ARIA_LABEL_RANKING_END_YEAR="Year of ranking end"
COM_SPORTSMANAGER_ARIA_LABEL_MAXIMUM_EVALUATED_COUNT="Maximum number of evaluated participations"
COM_SPORTSMANAGER_ARIA_LABEL_STATISTICS_START_MONTH="Month of statistics start"
COM_SPORTSMANAGER_ARIA_LABEL_STATISTICS_START_YEAR="Year of statistics start"
COM_SPORTSMANAGER_ARIA_LABEL_STATISTICS_END_MONTH="Month of statistics end"
COM_SPORTSMANAGER_ARIA_LABEL_STATISTICS_END_YEAR="Year of statistics end"
COM_SPORTSMANAGER_ARIA_LABEL_ELIGIBLE_ORGANIZER="Choose eligible organizer"
COM_SPORTSMANAGER_ARIA_LABEL_EVENT_START_MONTH="Month of event start"
COM_SPORTSMANAGER_ARIA_LABEL_EVENT_START_YEAR="Year of event start"
COM_SPORTSMANAGER_ARIA_LABEL_EVENT_END_MONTH="Month of event end"
COM_SPORTSMANAGER_ARIA_LABEL_EVENT_END_YEAR="Year of event end"
COM_SPORTSMANAGER_ARIA_LABEL_FIRST_ROUND="First round"
COM_SPORTSMANAGER_ARIA_LABEL_FIRST_ROUND_TYPE="First round type"
COM_SPORTSMANAGER_ARIA_LABEL_FIRST_ROUND_PLACE="First round place"
COM_SPORTSMANAGER_ARIA_LABEL_LAST_ROUND="Last round"
COM_SPORTSMANAGER_ARIA_LABEL_LAST_ROUND_TYPE="Last round type"
COM_SPORTSMANAGER_ARIA_LABEL_LAST_ROUND_PLACE="Last round place"
COM_SPORTSMANAGER_ARIA_LABEL_ROUND_TYPE="round type"
COM_SPORTSMANAGER_ARIA_LABEL_ROUND_PLACE="round place"
COM_SPORTSMANAGER_HOME_POINTS="Home points"
COM_SPORTSMANAGER_GUEST_POINTS="Guest points"
COM_SPORTSMANAGER_ARIA_LABEL_ENCOUNTER_YEAR="Year of encounter"
COM_SPORTSMANAGER_ARIA_LABEL_PAIRING_TEAM="Team for fixture"
COM_SPORTSMANAGER_ARIA_LABEL_ELIGIBLE_COMPETITION="Choose eligible user"
COM_SPORTSMANAGER_ARIA_LABEL_RANKING_EVALUATION="Ranking evaluation"
COM_SPORTSMANAGER_ARIA_LABEL_LASTNAME="Lastname"
COM_SPORTSMANAGER_ARIA_LABEL_FIRSTNAME="Firstname"
COM_SPORTSMANAGER_ARIA_LABEL_CLUB="Club"
COM_SPORTSMANAGER_NUM_REQUESTED_SHIFTS="Shifts"
COM_SPORTSMANAGER_NUM_REQUESTED_SHFITS_TOOLTIP="Game shifts caused by this team"
COM_SPORTSMANAGER_GAME_RESULT_DELAYS="Delay"
@@ -1,58 +1,60 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/component-install.dtd"> <extension type="component" version="5.0" method="upgrade">
<extension type="component" version="3.0" method="upgrade"> <name>Sports manager</name>
<name>Sports manager</name> <creationDate>2025-03-12</creationDate>
<creationDate>2020-09-30</creationDate> <author>Deutscher Tischfußball Verband</author>
<author>Sven Nickel</author> <authorEmail>it@dtfb.de</authorEmail>
<authorEmail>sven.nickel@gmail.com</authorEmail> <copyright>All rights reserved</copyright>
<copyright>All rights reserved</copyright> <license>GNU/GPL</license>
<license>GNU/GPL</license> <version>DEV</version>
<version>1.7.1</version> <description>Verwaltung von Spielern und Vereinen in Mannschafts- und Individualwettbewerben</description>
<description>Verwaltung von Spielern und Vereinen in Mannschafts- und Individualwettbewerben</description> <namespace path="src">Dtfb\Component\com_sportsmanager</namespace>
<files folder="site"> <files folder="site">
<filename>index.html</filename> <filename>index.html</filename>
<filename>admin.php</filename> <filename>admin.php</filename>
<filename>api.php</filename> <filename>api.php</filename>
<filename>controller.php</filename> <filename>sportsmanager.php</filename>
<filename>database.php</filename> <filename>mathparser.php</filename>
<filename>sportsmanager.php</filename> <filename>tools.php</filename>
<filename>mathparser.php</filename> <filename>js/jquery.min.js</filename>
<filename>tools.php</filename> <folder>database</folder>
<filename>js/jquery.min.js</filename> <folder>images</folder>
<folder>images</folder> <folder>models</folder>
<folder>models</folder> <folder>src</folder>
<folder>views</folder> <folder>util</folder>
</files> <folder>views</folder>
<languages folder="site"> </files>
<language tag="en-GB">language/en-GB/en-GB.com_sportsmanager.ini <languages folder="site">
</language> <language tag="en-GB">language/en-GB/en-GB.com_sportsmanager.ini
<language tag="de-DE">language/de-DE/de-DE.com_sportsmanager.ini </language>
</language> <language tag="de-DE">language/de-DE/de-DE.com_sportsmanager.ini
<language tag="nl-NL">language/nl-NL/nl-NL.com_sportsmanager.ini </language>
</language> <language tag="nl-NL">language/nl-NL/nl-NL.com_sportsmanager.ini
</languages> </language>
<scriptfile>install.php</scriptfile> </languages>
<administration> <scriptfile>script.php</scriptfile>
<files folder="admin"> <administration>
<filename>access.xml</filename> <files folder="admin">
<filename>sportsmanager.php</filename> <filename>access.xml</filename>
<filename>controller.php</filename> <filename>index.html</filename>
<filename>index.html</filename> <filename>RELEASE_NOTES.md</filename>
<folder>views</folder> <folder>services</folder>
</files> <folder>src</folder>
<languages folder="admin"> <folder>tmpl</folder>
<language tag="en-GB">language/en-GB/en-GB.com_sportsmanager.ini </files>
</language> <languages folder="admin">
<language tag="en-GB">language/en-GB/en-GB.com_sportsmanager.sys.ini <language tag="en-GB">language/en-GB/en-GB.com_sportsmanager.ini
</language> </language>
<language tag="de-DE">language/de-DE/de-DE.com_sportsmanager.ini <language tag="en-GB">language/en-GB/en-GB.com_sportsmanager.sys.ini
</language> </language>
<language tag="de-DE">language/de-DE/de-DE.com_sportsmanager.sys.ini <language tag="de-DE">language/de-DE/de-DE.com_sportsmanager.ini
</language> </language>
<language tag="nl-NL">language/nl-NL/nl-NL.com_sportsmanager.ini <language tag="de-DE">language/de-DE/de-DE.com_sportsmanager.sys.ini
</language> </language>
<language tag="nl-NL">language/nl-NL/nl-NL.com_sportsmanager.sys.ini <language tag="nl-NL">language/nl-NL/nl-NL.com_sportsmanager.ini
</language> </language>
</languages> <language tag="nl-NL">language/nl-NL/nl-NL.com_sportsmanager.sys.ini
</administration> </language>
</extension> </languages>
</administration>
</extension>