UploadFormField erkennt gelöschte Dateien nicht

  • Hallo zusammen,

    ich stoße gerade auf folgendes Problem:

    Ich habe in einem meiner Formulare ein UploadFormField hinzugefügt. Soweit so gut. Wenn ich jetzt Dateien darin hochlade werden diese auch erfolgreich verarbeitet, also im entsprechenden Ordner gespeichert und in der Datenbank angelegt.

    Wenn ich jetzt die Seite bearbeite und eine Datei lösche, soll sie laut Dokumentation im parameters-Array erscheinen:

    Quote

    Also it registers the removed files as an array of wcf\system\file\upload\UploadFile\UploadFile into the $parameters array directly using the object property with the suffix _removedFiles as the array key.

    In der entsprechenden Action-Klasse wollte ich nun schauen, wie das Objekt genau aussieht, wenn eine Datei gelöscht wird, allerdings ist das entsprechende Array in den Parametern leer.

    Gleichzeitig taucht die Datei aber auch nicht in den files im Parameter-Array auf.

    Die Dateien lege ich beim erstellen in den Ordner WCF_DIR . 'media/test-files/' . $filename. Den Filename speichere ich in der Datenbank.

    Die DatabaseObject-Klasse habe ich um die Funktion public function getTestAttachmentUploadFileLocations() erweitert, die hier einfach die entsprechenden Filenames aus der Datenbank ausliest und mit dem Ordner-Präfix WCF_DIR . 'media/test-files/' versieht. In Anbetracht dessen, dass mir die Dateien auch richtig angezeigt werden, wenn ich die "Bearbeiten"-Seite lade, vermute ich aber mal, dass das alles soweit auch funktioniert.

    Das FormField wurde wie folgt gebuildet:

    PHP
    UploadFormField::create("testAttachment")
                            ->maximum(5)
                            ->maximumFilesize(20000000)
                            ->objectProperty("testAttachment")

    Folgende Antwort (gekürzter, wichtiger Teil der Ausgabe) erhalte ich bei einem wcfDebug auf die Parameter im update meiner Action-Klasse:

    Neben der DJI_0066-HDR.jpg existiert im Formular, als auch im Ordner als auch in der DB noch die Datei DJI_0074-HDR.jpg für das entsprechende Objekt. Lösche ich die Datei nicht im Formular steht sie auch entsprechend in der Ausgabe:

    Daher wäre jetzt meine abschließende Frage, ob ich noch etwas tun muss, sodass meine gelöschten Dateien in testAttachment_removedFiles erscheinen.

    Gruß

    ilou

  • Als Zusatz:
    Ergänzt man im UploadFormField.class.php hinter dem Setzen der removed Files ein wcfDebug($parameters) erhält man auch das entsprechende Array mit den entsprechenden removed Files, wie gewünscht.

    Ich weiß allerdings nach wie vor nicht so ganz, weshalb - und insb. jetzt hier - in der update-Methode die removedFiles nicht in den Parametern angezeigt werden, in der populate-Methode im Debug allerdings schon.

    Habe mich im großen und ganzen eigentlich an ReactionTypeAction und ReactionTypeAddForm orientiert und da klappt es, bei mir irgendwie nicht.

    // EDIT: Anscheinend hängt es damit zusammen, dass ich in meiner save()-Funktion in der AddForm bereits zum Setzen von Additional Fields (HTMLInputProcessor)

    Code
    $this->form->getData()

    ausführe. Das berechnet anscheinend jedes Mal die gelöschten Dateien neu, erkennt die aber ab dem 2. Aufruf von getData() nicht mehr. Kann das sein?

    PHP
            var_dump($this->form->getData()["testAttachment_removedFiles"]); // enthält die gelöschte Datei
            $this->htmlInputProcessor = $this->form->getData()["message_htmlInputProcessor"];
            die(var_dump($this->form->getData()["testAttachment_removedFiles"])); // leer

    Wie kann ich das Problem umgehen? Oder ist es sogar ein Fehler im WSC?

    Edited 3 times, last by ilou (November 25, 2020 at 8:47 PM).

  • Ich verarbeite die entsprechenden Daten jetzt einfach in der create(), bzw update()-Methode meiner Action-Klasse, ist aber unschön, weil man jetzt beispielsweise den Inhalt aus dem Wysiwyg-Feld danach noch über nen DatabaseEditor ändern muss, da er nicht von vorne rein in den additionalFields drin steht.

    Aber dann ist das wohl so.

    Damit ist das Thema erledigt.

  • Tatsächlich nicht. Manchmal suche ich nach zu komplizierten Lösungen. Wäre aber auch sicherlich eine Ergänzung in der Dokumentation wert.

    Andererseits muss ich aber auch sagen, dass es im Nachhinein betrachtet nicht verkehrt ist, das Verhalten auch nahezu komplett in der entsprechenden create-, bzw. update-Funktion zu implementieren, damit die entsprechend räumlich getrennt sind. Die haben ja auch teilweise unterschiedliche Verhaltensweisen, die davor abhängig von der FormAction implementiert wurden.

  • Das berechnet anscheinend jedes Mal die gelöschten Dateien neu, erkennt die aber ab dem 2. Aufruf von getData() nicht mehr. Kann das sein?

    Ich hatte das Problem eben auch. Bei mir war es so, dass ein FormField bei mir einen Validator hat, in dessen Funktion auch $this->form->getData() aufgerufen wurde. Dadurch kamen gelöschte Dateien bei mir nicht mehr in der DatabaseAction an. Ich bin nun auf $this->form->getRequestData() umgestiegen, damit scheint es zu funktionieren.

Participate now!

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