FormContainer: Wie füge ich die aktuelle Zeit quasi als "hidden"-Input hinzu?

  • Hey liebe Community,

    ich lese mich aktuell etwas in die WoltLab-Docs ein und versuche mich in die Entwicklung von Plugins einzuarbeiten.

    In der Tutorial Series - Part 1 gibt es folgende Klasse:

    Das ganze Formular wird diesbezüglich ja gar nicht durch "meinen" (im Tutorial) Code validiert, weshalb ich da auch nichts bearbeiten könnte. Ich möchte aber gerne die Erstellungszeit mit in der Datenbank speichern und da wäre das naheliegendste für mich ein "hidden"-Inputfeld einzubauen. Laut den Docs gibt es sowas im FormBuilder aber nicht.

    Einen Hinweis und/oder ein Code-Beispiel wie ich das am besten umsetzen könnte wären super. Beim FormBuilder blicke ich wirklich noch nicht so durch.

    Liebe Grüße

    Managed Webhosting, hochwertige Plugins und individuelle Auftragsarbeiten:

    Julian-Pfeil.de

    • Offizieller Beitrag

    Hallo,

    alternativ die gewünschten Werte durch einen Data Processor ergänzen: https://docs.woltlab.com/5.5/php/api/fo…rmdataprocessor oder direkt in der PersonAction, wenn der Timestamp fehlt. Typischerweise wird ein Timestamp ohnehin erst bei der tatsächlichen Erstellung generiert und nicht schon beim Öffnen des Formulars.

    Fehlt nur leider in der Doku

    Danke: https://github.com/WoltLab/docs.woltlab.com/issues/287. PRs nehme ich gerne an.

  • Danke euch beiden. Mit dem Timestamp hast du recht, der sollte natürlich nicht schon beim Aufruf des Formulars gesetzt werden.

    alternativ die gewünschten Werte durch einen Data Processor ergänzen: https://docs.woltlab.com/5.5/php/api/fo…rmdataprocessor

    Ich hab mir die gesamte FormBuilder-Doc durchgelesen, aber ohne Beispiele verstehe ich die ganzen I*** und sonstwas Klassen, die da alle voneinander erben leider nicht direkt.


    direkt in der PersonAction, wenn der Timestamp fehlt.

    Hättest du da ein Codebeispiel für mich, in welcher Funktion ich das verpacken sollte und wie ich da den Wert dann mitliefern kann?

    Managed Webhosting, hochwertige Plugins und individuelle Auftragsarbeiten:

    Julian-Pfeil.de

    • Offizieller Beitrag

    Hallo,

    Hättest du da ein Codebeispiel für mich, in welcher Funktion ich das verpacken sollte und wie ich da den Wert dann mitliefern kann?

    der FormBuilder durch die create()-Methode deiner PersonAction (wenn man bei dem Beispiel oben bleibt) auf, dort kannst du dann die übergebenen Daten nach Belieben verändern bzw. erweitern.

    Beispiel:

    WCF/UnfurlUrlAction.class.php at 6f706ee13f34a7a36a9a73c75f66e6fd43428111 · WoltLab/WCF
    WoltLab Suite Core (previously WoltLab Community Framework) - WCF/UnfurlUrlAction.class.php at 6f706ee13f34a7a36a9a73c75f66e6fd43428111 · WoltLab/WCF
    github.com
  • Das war sicher ein guter Tipp. Ich hab daraus folgendes gezogen:

    PHP: PersonAction.class.php
    public function create()
        {
            if (!isset($this->parameters['creationDate']) || $this->parameters['creationDate'] == false || empty($this->parameters['creationDate']))
                $this->parameters['creationDate'] = TIME_NOW;
    
            $object = parent::create();
    
            return $object;
        }

    Aber am Ende bleibt creationDate NULL. Mir fehlt bisher wohl das Wissen der Klassen und Funktionen, weshalb ein weiterer Tipp gut wäre :saint:

    Dankeschön!

    Managed Webhosting, hochwertige Plugins und individuelle Auftragsarbeiten:

    Julian-Pfeil.de

  • In einem meiner ersten Pakete habe ich es mal so gemacht (komplett ohne HiddenField) in derFooAddForm.class.php

    Code
    public function readFormParameters()
        {
            parent::readFormParameters();
    
            if ($this->formAction == 'create') {
                $this->additionalFields = [
                    'creationDate' => TIME_NOW
                ];
            }

    Ob man es so machen sollte, weiß ich nicht - hat aber gefunzt damals ^^

    if ($this->formAction == 'create') stellt sicher, dass das creationDate nur beim Erstellen des Eintrags in die Datenbank geschrieben wird und beim Editieren nicht mehr überschrieben wird.

    5 Mal editiert, zuletzt von itsmeJAY (14. Juli 2022 um 15:38)

    • Offizieller Beitrag

    Mich hatte letztes Jahr schon interessiert: Tim Düsterhus spricht etwas gegen die Lösung?

    Diese Fälle gehören in die DatabaseObjectAction, so dass das Verhalten immer konsistent ist, egal ob der Controller verwendet wird oder nicht. Genau dort gehört so eine Form der Logik hin und wird von uns auch so praktiziert. Andernfalls ist man beim Aufruf der Action gezwungen, den Parameter explizit zu belegen, obwohl du grundsätzlich einen Standardwert vorgesehen hast.

  • Diese Fälle gehören in die DatabaseObjectAction, so dass das Verhalten immer konsistent ist, egal ob der Controller verwendet wird oder nicht. Genau dort gehört so eine Form der Logik hin und wird von uns auch so praktiziert. Andernfalls ist man beim Aufruf der Action gezwungen, den Parameter explizit zu belegen, obwohl du grundsätzlich einen Standardwert vorgesehen hast.

    Könntest du mir dann verraten, was an obigem Code (in meiner DOA-Klasse) falsch ist?

    Managed Webhosting, hochwertige Plugins und individuelle Auftragsarbeiten:

    Julian-Pfeil.de

  • Könntest du mir dann verraten, was an obigem Code (in meiner DOA-Klasse) falsch ist?

    Okay, ich beantworte es mir selbst:

    da gehört $this->parameters['data']['creationDate'] statt $this->parameters['creationDate'] hin. ?(

    Siehe übrigens auch folgendes im Tutorial (was mir jetzt erst auffiel):

    docs.woltlab.com/PersonInformationAction.class.php at 5.5 · WoltLab/docs.woltlab.com
    Contribute to WoltLab/docs.woltlab.com development by creating an account on GitHub.
    github.com

    Managed Webhosting, hochwertige Plugins und individuelle Auftragsarbeiten:

    Julian-Pfeil.de

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!