DateFormField speichert Minuten und Sekunden bei $supportsTime = false

  • Affected Version
    WoltLab Suite 5.4
    Affected App
    WoltLab Suite Core

    Hallo zusammen,

    Ich habe eine einfache AbstractFormBuilderForm, im Wesentlichen:

    Damit nutze ich implizit DateFormField::supportsTime = false.

    Die Ausgabe ist auch korrekt:

    Allerdings landen in der Datenbank fünfstellige Zahlen in dem Feld, wenn das Feld NICHT befüllt wird, konkret die aktuelle Minute und Sekunden (z.B. 32132).

    Damit ist das Feld aber nicht 0, sondern es wird erkannt, das ein Datum da ist und 01.01.1970 - 09:55:32 ausgegeben.

    Ich habe spontan keinen Fehler in DateFormField gesehen, aber das Verhalten scheint ja nicht zu stimmen. Ideen?

    VG

    Fr33chen

  • Setz das Feld nullable(). ;)

    Das funktioniert natürlich, erfordert aber auch ein Null-fähiges DB-Feld.

    Das Datenbankfeld ist aber eigentlich INT(10) NOT NULL DEFAULT 0, wie Woltlab das auch durchgängig für alle Timestamp-Felder verwendet.

    VG

    Fr33chen

  • Das ist zugegebenermaßen eine einleuchtende Argumentation.

    Dann werde ich zukünftig hier auf nullable Felder setzen, danke für die Anregung!

    VG

    Fr33chen

  • Ich denke, dass WoltLab das irgendwann (wenn vielleicht doch mal der FormBuilder überall genutzt wird) auch für händisch gesetzte Felder umstellen wird - zumindest für solche, in denen ein Wert optional ist. Ich hab vorhin gerade ein paar time-Felder durch geschaut und war der Meinung, dass überwiegend eigentlich ein Default obsolete ist, weil immer ein Wert gesetzt werden sollte. Aber lassen wir uns überraschen. ^^

    Übrigens, wenn du 0 in der DB speicherst und den Datensatz dann bearbeiten willst, hast du (zumindest bei Zeit-Support) kein leeres Feld. Falls du dich da mal wundern solltest oder historisch irgendwo 0 gesetzt ist, im Zweifelsfall via CustomFormDataProcessor einfach nullen oder unset-ten.

  • Übrigens, wenn du 0 in der DB speicherst und den Datensatz dann bearbeiten willst, hast du (zumindest bei Zeit-Support) kein leeres Feld. Falls du dich da mal wundern solltest oder historisch irgendwo 0 gesetzt ist, im Zweifelsfall via CustomFormDataProcessor einfach nullen oder unset-ten.

    Deswegen ist es mir aufgefallen und hatte ich in einer alten EA auch so überschrieben. Null ist aber viel besser, danke!

    VG

    Fr33chen

  • Hallo,

    Das Datenbankfeld ist aber eigentlich INT(10) NOT NULL DEFAULT 0, wie Woltlab das auch durchgängig für alle Timestamp-Felder verwendet.

    stimmt nicht, in wcf1_user_multifactor_backup (und generell neueren Tabellen wie wcf1_flood_control) ist das korrekt modelliert

    Ansonsten hat MysteryCode hier schon Recht: In den meisten Fällen sollte vermutlich besser der DEFAULT-Wert weg, weil der Zeitpunkt immer bekannt sein sollte – und das eigentlich nicht nur bei den Zeit-Spalten.

  • Hallo,

    ich habe mir das hier jetzt mal näher angesehen. Die eigentliche Ursache ist, dass PHPs DateTime die Uhrzeit mit der aktuellen Uhrzeit vorbelegt, wenn man also nur ein Datum über das Y-m-d-Format einliest, dann hängt da implizit eine Uhrzeit mit dran (jetzt aktuell wäre das etwa 09:22 UTC).

    Die Uhrzeit könnte man potentiell nullen, am Ende hat man aber das Problem, dass das Feld standardmäßig einen Unix-Timestamp als Ausgabe-Format nutzt und der enthält nun einmal per Definition „Sekunden“. Egal was für einen Timestamp man rausgibt: In jedem Fall werden da Informationen aus „thin air“ generiert.

    Jetzt könnte man natürlich eine explizite Angabe eines Ausgabe-Formats verpflichtend machen. Das wäre ein kleiner breaking change, aber in WoltLab Suite 6.0 vertretbar. Aber dann gibt es noch das Problem, dass das Feld intern komplett mit DateTime statt DateTimeImmutable arbeitet und die DateTimes auch nach außen exponiert und an dem Punkt frage ich mich, ob es nicht sinnvoller wäre, einen sauber entworfenen Ersatz zu implementieren und das alte Feld zu deprecaten.

  • Tim Düsterhus July 11, 2023 at 3:16 PM

    Added the Label Future fix

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!