Php Symfony2表单:一个表单中有多个上传小部件:There';这是一个很大的潜在问题,我只能';特警

Php Symfony2表单:一个表单中有多个上传小部件:There';这是一个很大的潜在问题,我只能';特警,php,forms,symfony,upload,doctrine,Php,Forms,Symfony,Upload,Doctrine,在我开始发布一些代码之前,我将公开这个问题。问题是大量的代码是广泛的,所以在第一次我想听到的线索,我可以调查 这是我的问题,我正在写一个表单编辑器来制作文章类型的页面。 它是建立在一个三级收集。。。 由我有链接的部分组成的组件集合(或多或少的列)。 文章实体有两个“横幅”属性,允许用户向网站添加多栏图片。(在顶部和底部)它们是具有$image属性的“图片”实体 这些部分基本上是带有文本的标题,但也可以用于显示图像。他们也有带有图片的链接。 Picture、Section和SectionLink具

在我开始发布一些代码之前,我将公开这个问题。问题是大量的代码是广泛的,所以在第一次我想听到的线索,我可以调查

这是我的问题,我正在写一个表单编辑器来制作文章类型的页面。 它是建立在一个三级收集。。。 由我有链接的部分组成的组件集合(或多或少的列)。 文章实体有两个“横幅”属性,允许用户向网站添加多栏图片。(在顶部和底部)它们是具有$image属性的“图片”实体

这些部分基本上是带有文本的标题,但也可以用于显示图像。他们也有带有图片的链接。 Picture、Section和SectionLink具有$image属性以及相应的setter和getter。该属性是链接的图像实体和链接图像实体,它们都扩展了“我的文件”实体

因为它们是集合,所以组件可以在1到8之间,每个组件的节0到4。链接类似于0到8

考虑到所有可能有大量图像的项目。一切都进行得很顺利(不,我开玩笑说,这是一个痛苦的被困在上面大约一个月)上传是正常进行的,然后我意识到有些事情是错误的,因为我尝试在setImage方法中为每个级别添加一些代码

好的,当我上传一个映像来替换另一个映像时,我不希望旧映像留在服务器上,所以我在setImage方法中添加了一些代码,以便在替换本地属性$image之前删除硬盘上的旧文件

我很快意识到,上传图片会删除文章中其他地方的文件,而不是删除我要替换的旧文件。例如,用组件0第2部分中的另一个替换图像将删除组件4第4部分中的图像。通常它会删除第一个横幅图像

我做了一些调试,我意识到使用文件上传小部件并没有调用正确的方法。 在节中使用文件上载将调用Picture::setImage 或者它可以调用SectionLink::setImage。在setImage中显示Image::getName将显示与所混淆的部分对应的文件名

在询问之前,所有这些字段都有单独的ID和name html表单属性 对于section和sectionlink,它们是通过原型生成的,显然没有错误

类似地,上传窗口小部件在细枝中生成,如下所示:

{{form_行(form.topBanner.image.file)}{{ {{form_widget(section.image.file)}}///当然是多层次的“for-in”

我应该补充一点,如果我不使用“删除”使用上载小部件的代码确实将图像设置在了正确的位置。当我在上载之前尝试访问当前图像中的数据时,才会产生这样的结果。我必须说,我在调试时非常生疏,并且我仍然在使用die/var_dump。我会对我的代码应该放在哪些区域感兴趣。表单、实体、控制器、我我到处都找了,我完全不知道发生了什么事。 或者,如果有人能想出一个更好的替代方案,请分享。然而,我非常非常好奇,想知道Symfony的内部工作情况(除非只是我像往常一样忽略了一些显而易见的事情


我希望有人能帮助我……谢谢!

好的,没有bug。似乎所有的文件小部件都会触发setter,不管它们是否被使用。 因此,使用setImage实现功能是个坏主意。 我最终选择在一个控制器中进行,这毕竟是有道理的。
删除未使用的图像文件。在处理表单之前,我对文件图像路径进行了数组收集。刷新数据后,我用新数据创建了一个新数组。我比较两个数组,并取消与第二个数组中不存在的文件的链接。

我将根据需要共享更多的文件。但是大小非常大,仅javascript就超过400行。问问你是否需要一些具体的东西。