Symfony2表单:表单无效时显示已上载的文件

jay*_*ayv 7 php forms file-upload symfony

我正在构建一个复杂的文件上传表单.此表单包含普通数据和一组4种文件类型,每种类型可能有多个文件上载.

  • ReportForm
    • 附件
      • 报告(UploadedFile实体的集合)
      • 照片(UploadedFile实体的集合)

UploadedFile实体有文件名,描述等.

使用案例:现在,我正在提交包含4张照片和2份报告的表单,所有6个文件都可以.但是表单中还有一些其他错误.我想再次显示上传的文件,以便用户不必再次重新上载它们.这些文件已经保留,因此当我使用GET返回同一页面时,文件会正确显示.

我已经做过/尝试过的事情:

  • 在绑定请求之前,我克隆了现有的上传文件
  • 绑定表单后,我上传所有新文件(如果有的话)并保留它们
  • 之后,我重新添加现有的上传文件(来自克隆对象).我创建了具有现有文件ID的表单输入,因此我可以识别现有项目.

这一切都很好,但是因为我在绑定之后更改了我的报告和附件,所以在帖子之后显示的数据无法更改.我无法在提交的表单上执行setData($ report).

因此,现有文件不再显示,因为表单数据仍然是旧的报表对象(来自帖子).

当我执行页面的正常GET时,将从数据库中检索$ report并正确显示.但是在已经上传文件的POST之后,数据库数据是正确的,但是表单视图不知道有关已更改数据的任何信息(在绑定之后).

有任何想法吗?或者更好的方法吗?

jay*_*ayv 3

好吧,经过几天的尝试和错误,我找到了一个匹配的解决方案。

简而言之,这就是我所做的。

在 UploadedFile 实体中,我添加了 2 个新字段:fileuniqueId。这些字段未映射到 ORM 中,因为我只需要在表单中使用它们。

提交表单时,我在特定会话变量中添加新上传的文件,并为它们分配一个唯一的 ID(因为我需要能够删除它们并且需要一个标识符)。我还将文件上传到新位置。

如果表单有效,我会将在会话中保存的集合添加到保存该集合的实体中。

如果表单无效,则会显示文件,因为我从会话中检索了此特定集合。即使当我使用 GET 重新访问该页面时,也会显示所有上传的文件。

如果我删除视图中的文件,我会将已删除的唯一 ID 的列表放入输入字段中。因此,在提交后,我检查应该从数组中删除哪些文件。

我认为我的答案和我的问题一样不清楚:)