Ich stehe derzeit vor einer Herausforderung mit SonataAdminBundle, Eins-zu-Viele-Beziehungen und Datei-Uploads. Ich habe eine Entität namens Client
und eine namens ExchangeFile
. Ein Client
kann mehrere ExchangeFile
s haben, daher haben wir hier eine 1: n-Beziehung. Ich verwende die VichUploaderBundle für Datei-Uploads.
Dies ist die Klasse Client
:
und das ist die Klasse ExchangeFile
:
In meiner Klasse ClientAdmin
habe ich das Feld exchangeFiles
folgendermaßen hinzugefügt:
Dies ermöglicht die Inline-Bearbeitung verschiedener Austauschdateien im Client-Bearbeitungsformular. Und es funktioniert soweit gut: .
Das Problem
Aber es gibt ein ceveat: Wenn ich einmal das grüne "+" Zeichen (fügen Sie eine neue Exchange-Datei Formularzeile), dann wählen Sie eine Datei in meinem Dateisystem , dann drücken Sie das "+" Zeichen erneut (eine neue Formularzeile wird über Ajax angehängt), wählen Sie eine andere Datei und klicken Sie dann auf "Aktualisieren" (speichern Sie den aktuellen Client), dann wird die erste Datei nicht beibehalten . Nur die zweite Datei kann in der Datenbank und im Dateisystem gefunden werden.
Soweit ich das herausfinden konnte, hat das folgenden Grund: Wenn das grüne "+" Zeichen ein zweites Mal angeklickt wird, ist das aktuelle Formular Post an den Webserver inklusive der aktuell im Formular befindlichen Daten (Client und alle Austauschdateien). Ein neues Formular wird erstellt und die Anfrage wird in das Formular eingebunden (dies geschieht in der Klasse AdminHelper
in Sonata\AdminBundle\Admin
):
Damit wird das gesamte Formular gebunden, eine Formularzeile wird angehängt, das Formular wird an den Browser zurückgesendet und das gesamte Formular wird durch das neue Formular überschrieben. Da jedoch die Dateieingaben ( <input type="file" />
) aus Sicherheitsgründen nicht vorbelegt werden können, ist die erste Datei verloren. Die Datei wird nur im Dateisystem gespeichert, wenn die Entity persistent ist (ich denke, VichUploaderBundle
verwendet Doctrine prePersist
dafür), aber dies geschieht noch nicht, wenn eine Formularfeldzeile angehängt wird.
Meine erste Frage ist : Wie kann ich dieses Problem lösen, oder in welche Richtung soll ich gehen? Ich möchte, dass der folgende Anwendungsfall funktioniert: Ich möchte einen neuen Client erstellen und weiß, dass ich drei Dateien hochladen werde. Ich klicke auf "Neuer Client", gebe die Kundendaten ein, klicke einmal auf den grünen "+" - Button, wähle die erste Datei aus. Dann drücke ich erneut auf das "+" Zeichen und wähle die zweite Datei aus. Gleiches gilt für die dritte Datei. Alle drei Dateien sollten beibehalten werden.
Zweite Frage : Warum postet Sonata Admin das gesamte Formular, wenn ich nur eine einzelne Formularzeile in einer Eins-zu-viele-Beziehung hinzufügen möchte? Ist das wirklich notwendig? Das bedeutet, dass, wenn ich Dateieingaben habe, alle Dateien, die im Formular vorhanden sind, jedes Mal hochgeladen werden, wenn eine neue Formularzeile hinzugefügt wird.
Vielen Dank im Voraus für Ihre Hilfe. Wenn Sie irgendwelche Details benötigen, lassen Sie es mich wissen.
Neben meinem Kommentar zu SonataMediaBundle ...
Wenn Sie diese Route verwenden, sollten Sie eine neue Entität erstellen, die der folgenden ähnelt:
%Vor%Dann in Ihrer Client-Entität:
%Vor%... und die configureFormFields Ihres ClientAdmin:
%Vor%... und nicht zuletzt Ihre ClientHasFileAdmin-Klasse:
%Vor%Ich habe viele verschiedene Ansätze und Workarounds ausprobiert und am Ende fand ich heraus, dass die beste Lösung in dem hier beschriebenen Ссылка
Sie müssen nur alle unnötigen Listen- / Löschtasten um die Dateiauswahl verstecken, wenn sie nicht benötigt werden.
In allen anderen Fällen mit Dateiauswahl direkt im Formular werden Sie früher oder später mit anderen Problemen konfrontiert - mit Formularüberprüfung, Formularvorschau usw. In allen diesen Fällen werden Eingabefelder gelöscht.
So ist die Verwendung von media bundle und sonata_type_model_list wahrscheinlich die sicherste Option, trotz einer Menge Overhead.
Ich poste es für den Fall, dass jemand nach der Lösung sucht, so wie ich gesucht habe.
Ich habe auch eine Java-Script-Problemumgehung für genau dieses Problem gefunden. Es funktionierte im Prinzip die Namen der Dateieingaben, wenn Sie die "+" - Taste drücken und dann wieder zurücksetzten.
In diesem Fall bleibt Ihnen immer noch das Problem, das Formular erneut anzuzeigen, wenn eine Validierung fehlschlägt usw., daher empfehle ich definitiv einen Medienbündelansatz.
Tags und Links php symfony sonata-admin symfony-sonata