Repository navigation
Schreibseite - #32
Closed
tombrain wants to merge 309 commits into
Closed
Schreibseite#32tombrain wants to merge 309 commits into
tombrain wants to merge 309 commits into
Conversation
Die oeffentliche Spielerstatistik (lmo-statshow.php) und die Druckansicht (lmo-statprint.php) uebernahmen sort, begin, direction und team ungeprueft aus der Anfrage: - begin=abc fuehrte unter PHP 8 zu einem Fatal Error (Unsupported operand types: string + string). - Eine unbekannte oder nicht-numerische Sortierspalte (sort=99, sort=abc) erzeugte Warnungen beim Sortieren. Jetzt wird in diesem Fall nach der ersten Spalte sortiert; das gilt auch fuer eine unpassende Standardsortierung aus der Konfiguration. - Die Werte wurden unmaskiert in Links und in die Ueberschrift der Druckansicht geschrieben (Cross-Site-Scripting). Die Zahlen werden jetzt als Zahlen behandelt, die Mannschaft wird maskiert. - Die Druckansicht warnte beim Oeffnen, wenn es zur Liga keine Statistik gibt. Jetzt erscheint nur die vorgesehene Meldung.
Spielerstatistik: Spieler und Spalten anlegen und loeschen, Werte eintragen, Formelspalten (auch Division durch 0, unvollstaendige und eingeschleuste Formeln), oeffentliche Seite und Druckansicht mit Sortierung und unpassenden Parametern, kein Aendern ohne Anmeldung.
Seit b0e3dba liest die classlib die Werte einer Partie unabhaengig von der Zeilenreihenfolge in der Ligadatei. Dadurch aendert sich fuer golden/special.l98 die "Bewertung der Restprogramme" auf der Statistikseite (Punkte der Gegner aus der classlib-Tabelle). Die beiden Snapshots hielten noch die Werte von vor dem Fix fest und liessen die GitHub Action scheitern.
actions/checkout@v4 und actions/cache@v4 laufen auf Node.js 20, das auf den GitHub-Runnern abgekuendigt ist; v5 nutzt Node.js 24. ubuntu-latest wechselt ab 19.10.2026 auf Ubuntu 26. Die Snapshot-Tests haengen von der Umgebung ab (faketime, PHP-Pakete), deshalb ist der Runner jetzt fest auf ubuntu-24.04 gestellt und aendert sich nicht von selbst.
Bei gleichen Punkten, Minuspunkten und Toren hing die Reihenfolge der classlib-Tabelle vom Vergleich der ganzen Tabellenzeilen ab und war damit praktisch zufaellig. lmo-calctable.php stellt in diesem Fall das Team mit der hoeheren Nummer nach vorn. liga::sortTable() sortiert jetzt genauso, Minitabelle und Statistik zeigen damit dieselben Plaetze wie die Haupttabelle. Sichtbar z.B. in der Beispielliga 1l_2024-25 ohne Ergebnisse: Die Plaetze der Gegner im Restprogramm der Statistikseite aendern sich, die Snapshots sind entsprechend aktualisiert.
Die classlib kannte die Option HandS nicht: Minitabelle und Statistik zeigten bei Ligen mit Handicap eine andere Reihenfolge als die Haupttabelle. liga::calcTable() wendet die Reihenfolge jetzt wie lmo-calctable.php an, nur in der Gesamttabelle: Der Wert HS des Spieltags enthaelt je Platz der errechneten Tabelle den neuen Platz; bei gleichen Angaben stehen die Teams in umgekehrter Reihenfolge der errechneten Tabelle. Fuer die Tabelle der ganzen Saison gilt die Reihenfolge des aktuellen Spieltags (Actual), sonst die des angegebenen Spieltags. Nicht nachgebildet sind zwei Sonderfaelle des Kerns, die von der URL abhaengen (Aufruf mit st=... oder mit ausdruecklichem endtab des letzten Spieltags): dort nimmt der Kern die Reihenfolge des letzten Spieltags.
Der Vergleich Kern gegen classlib und der Test der Minitabelle nehmen voelligen Gleichstand und Handicap nicht mehr aus. Dazu Unit-Tests fuer die Reihenfolge bei Gleichstand und fuer die Handicap-Reihenfolge.
Unter Windows (core.autocrlf) lag docker/run-tests.sh mit CRLF in der Arbeitskopie. Ein neu gebautes Test-Image startete damit nicht: "exec /usr/local/bin/run-tests: no such file or directory". .gitattributes legt fuer *.sh jetzt LF fest.
lmo/composer.json und README nennen PHP 8.0 bis 8.4, getestet wurde nur 8.3. Die Action laeuft jetzt mit der aeltesten, der neuesten und der Version, mit der die Snapshots aufgezeichnet wurden. Unter PHP 8.4 laeuft die Suite unveraendert. Unter PHP 8.0 wichen sieben Snapshots nur in versionsabhaengigen Texten ab: Deprecated- Meldungen, die es erst ab 8.1 gibt, Wortlaut einzelner Warnungen, Liste der Zeitzonen und der Apostroph, den htmlspecialchars() erst ab 8.1 maskiert. Der Snapshot-Vergleich gleicht diese Unterschiede unter PHP < 8.1 auf beiden Seiten aus; die Snapshots selbst bleiben unveraendert.
PHP 8.5 ist veroeffentlicht, die README nennt aber 8.4 als hoechste Version. Der Lauf zeigt, ob LMO und die Snapshots unter 8.5 bestehen; fail-fast ist aus, die anderen Versionen laufen unabhaengig davon.
Im Web-Container der Entwicklungsumgebung brach "Liga per E-Mail" mit 'Class "ZipArchive" not found' ab: Die PHP-Erweiterung zip fehlte im Image. Danach waere der Versand trotzdem gescheitert, weil es im Container kein Mailprogramm gibt. - web.Dockerfile installiert zip. mail() liefert an den neuen Dienst "mail" (Mailpit); dessen Postfach ist unter http://localhost:8025/ erreichbar, nach draussen geht nichts. - composer.json nennt ext-zip neben ext-gd als empfohlene Erweiterung. - docker/README.md beschreibt fuer Entwickler die Dienste, Adressen, Volumes und Einstellungen.
Die mitgelieferten Ligen haben keine Ergebnisse, und die Addons liessen sich nur ueber von Hand gebaute Adressen ausprobieren. http://localhost:8082/demo/ zeigt Minitabelle, Mini-Spielplan, Viewer (nach Spieltag und nach Datum), Ticker und Spielerstatistik eingebettet und mit direktem Link, umschaltbar zwischen zwei Beispielligen: 1. Bundesliga 2025/26 (beendet) und 2026/27 (Stand 5. Spieltag). Ergebnisse aus den OpenLigaDB-Daten der Tests, Termine erfunden. Seite und Daten liegen in docker/demo und werden nicht mit LMO ausgeliefert. Der Container kopiert fehlende Beispieldateien beim Start in die Volumes und ueberschreibt nichts.
lmo/includes/PHPMailer.php war eine veraenderte Kopie von PHPMailer 6.9.2 ohne Namespace, ohne SMTP- und ohne Exception-Klasse. Die Bibliothek kommt jetzt wie die Template-Klasse ueber Composer (phpmailer/phpmailer ^7.1) und wird ueber lmo/vendor/autoload.php geladen; die Kopie ist entfernt. Alle fuenf Versandstellen (Liga per E-Mail, Tippspiel: Rundmail, Passwort vergessen, Freischaltung, Benachrichtigung) erzeugten PHPMailer im Ausnahme-Modus, werteten aber den Rueckgabewert von send() aus. Schlug der Versand fehl, endete die Seite mit einem Fatal Error; bei der Rundmail brach schon eine ungueltige Adresse den ganzen Lauf ab. Die neue Funktion lmo_mailer() liefert ein vorbereitetes Objekt ohne Ausnahmen: send() gibt false zurueck, der Grund steht in ErrorInfo und wird als Meldung ausgegeben. Entfernt ist ausserdem der Rueckfall auf ein direktes mail() in lmo-tippemail.php: Er benutzte Variablen, die es nicht gibt, und wurde nie erreicht.
Die Mails des Tippspiels bauten ihre Links aus $_SERVER['REQUEST_SCHEME']. Diese Variable setzt nicht jeder Webserver; dann gab es eine Warnung und einen Link ohne Protokoll. Die neue Funktion lmo_request_origin() ermittelt das Protokoll in diesem Fall ueber $_SERVER['HTTPS']. "Passwort vergessen" und die Freischaltung haengten ausserdem REQUEST_URI an, also die Adresse samt Parametern der aktuellen Anfrage, und danach noch einmal "?action=tipp". Bei einer Anfrage mit Parametern entstand so ein Link mit zwei Fragezeichen. Jetzt wird wie bei der Rundmail PHP_SELF verwendet.
…ruch Ohne die Erweiterung zip endete der Versand mit 'Class "ZipArchive" not found'. Jetzt erscheint die Meldung, dass die Mail nicht gesendet werden konnte, mit dem Hinweis auf die fehlende Erweiterung. Die temporaere Zip-Datei wird nur noch geloescht, wenn sie angelegt wurde (sonst PHP-Warnung).
Die Testumgebung faengt Mails ueber sendmail_path als Dateien in der Testinstanz ab und kann einen fehlgeschlagenen Versand nachstellen. Geprueft werden "Liga per E-Mail" (Zip-Anhang, Versandfehler, fehlende zip-Erweiterung, kein Versand ohne Anmeldung) und "Passwort vergessen" im Tippspiel (neues Passwort, Link, Versandfehler, unbekannter Name). Die GitHub Action laedt dafuer zusaetzlich die Erweiterung zip.
Rief ein Hilfsadmin ohne erweiterte Rechte die Mannschaftsverwaltung (st=-2) oder die Spielanzahl (st=-3) auf, fiel lmo-adminmain.php in den Ergebnis-Editor und dieser arbeitete mit dem "Spieltag -2": Dutzende PHP-Warnungen und ein unbrauchbares Formular. Unter PHP 8.5 kam die Meldung "Using null as an array offset is deprecated" dazu, wodurch der Snapshot helper_roles nur dort abwich. lmo-adminedit.php oeffnet bei einem Spieltag ausserhalb der Liga jetzt den aktuellen Spieltag. Der Snapshot zeigt an dieser Stelle den normalen Editor ohne Warnungen.
- admin_without_login: Zeilennummer einer bestehenden Warnung in lmo-functions.php (dort sind lmo_mailer() und lmo_request_origin() dazugekommen) - todo=tippemail: die Warnung zu REQUEST_SCHEME entfaellt
Der Mini-Spielplan zeigt die Zeit bis zum Spiel. Die Testuhr (faketime) laeuft waehrend des Aufrufs weiter: Dauert er ueber die volle Sekunde hinaus, ist eine Minute weniger uebrig, und der Snapshot wich ab (in der GitHub Action unter PHP 8.5 aufgetreten, aber nicht von der PHP-Version abhaengig). Die Minutenzahl wird vor dem Vergleich durch einen Platzhalter ersetzt.
…rdner lmo-admindownload.php brach ohne die PHP-Erweiterung zip mit 'Class "ZipArchive" not found' ab. Jetzt erscheint eine Fehlermeldung. Das Archiv wurde als ligen.zip im Programmverzeichnis angelegt, das nicht beschreibbar sein muss; es entsteht jetzt im Ausgabeordner. Eine Liganummer, die es nicht gibt (down=99), erzeugte eine PHP-Warnung; sie liefert jetzt einfach nichts.
"Spalte loeschen" mit einer Nummer, die es in der Statistik nicht gibt, erzeugte eine PHP-Warnung und schrieb die Datei trotzdem neu. Die Aktion wird jetzt nur fuer vorhandene Spalten ausgefuehrt.
AdminDownloadTest: einzelne Liga, unbekannte Nummer, alle Ligen als Zip, fehlende zip-Erweiterung, kein Download ohne Anmeldung.
Die GitHub Action ist unter PHP 8.5 gruen. README, TESTING.md und der Changelog nennen jetzt PHP 8.0 bis 8.5.
Dateien wie lmo-adminsubnavi.php oder lmo-savehtml.php sind nur dazu da, von lmo.php, lmoadmin.php oder einem Addon eingebunden zu werden. Direkt im Browser aufgerufen liefen sie ohne Konfiguration und ohne Rechtepruefung los: PHP-Warnungen, Bruchstuecke der Seite und in mehreren Faellen ein Fatal Error mit Dateipfaden. Alle 131 Dateien in lmo/ und den Addons, die init.php nicht selbst laden, pruefen jetzt am Anfang, ob PATH_TO_LMO definiert ist, und beenden sich sonst ohne Ausgabe. Die Konstante setzt init.php als Erstes, im normalen Betrieb greift die Pruefung also nie. Unveraendert bleiben die Einstiegsseiten (lmo.php, lmoadmin.php, Minitabelle, Viewer, Download ...), lmo-setup.php, index.php und die classlib. Der Snapshot direct_include_access zeigt fuer die geprueften Dateien jetzt eine leere Antwort.
getLangSelector() griff ungeprueft auf $_SESSION['lmouserlang'] zu. Im Admin-Bereich ohne Anmeldung gab es dafuer je Sprache eine PHP-Warnung. Fehlt der Wert, gilt jetzt keine Sprache als gewaehlt.
Wird eine Liga aus einer Vorlage mit mehr Mannschaften angelegt, enthaelt der Spielplan Partien mit Mannschaftsnummern, die es in der neuen Liga nicht gibt. lmo-zustat.php warnte dafuer je Partie und zaehlte sie als ausstehende Spiele mit. Solche Partien werden jetzt uebersprungen; im Snapshot sinkt die Zahl der gezaehlten Partien dadurch von 30 auf 21.
Snapshot neu: eigene Bezeichnungen fuer Punkte und Tore bleiben leer, die Auswahl der Fieberkurve wird gleich beim Speichern bereinigt.
Snapshots neu: Torkorrektur und Strafbeginn wandern beim Loeschen mit der Mannschaft, eine neue Mannschaft hat sofort Kurz- und Mittelnamen, im Pokal laeuft das Loeschen ohne Warnungen.
Aufgezeichnet mit dem bisherigen Code. Im Pokal bricht die Seite der zweiten Runde dabei mit einem Fatal Error ab (gewinn() in lmo-functions.php rechnet mit "_"), wenn in der Runde davor nur das Rueckspiel einer Paarung gespielt ist; deshalb fehlt dort das Formular.
Zehn Snapshots neu: [News] bleibt ohne Zeilen leer (kein NC=0), die Seite einer Pokalrunde bricht nicht mehr ab, nach dem Speichern zeigt die Seite den gespeicherten Stand (Auswahl des Zusatzes).
…atistikdatei nicht von der PHP-Version abhaengt
… mit eigenen Hilfsvariablen Vier Snapshots neu: eine neue Liga hat sofort Mittelnamen und die leeren Eintraege namePkt/nameTor.
…e Bruecke Nichts im Programm benutzt $ligaDaten mehr; init.php bindet die alten Einzelvariablen nicht mehr an.
Geloescht: src/Liga/LigaDaten.php, lmo/lmo-ligadaten.php, lmo/lmo-savefile.php und die Tests der Bruecke (LigaDatenTest, die Vergleichstests gegen sie). Die alten Einzelvariablen einer geladenen Liga gibt es damit nicht mehr; das Test-Hilfsskript calc.php liest die Spieltage aus $lmo_liga.
fix(phpstan): Tore in Tabelle::werte() als lokale Werte
Keine Seite braucht die Uebersetzung in die alten Tabellenfelder mehr. Die Datei liegt jetzt unter tests/GoldenMaster/bin/calctable.php; CalculationTest und die Tests, die ueber calc.php rechnen, halten die Tabelle weiter in dieser Form fest.
Druckausgabe
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.