【发布时间】:2012-03-06 16:31:11
【问题描述】:
有两种模型,假设 A 和 B 具有 A hasMany B 关系。用户可以在创建 A 时关联任意数量的 B 行。该应用程序允许用户使用 JQuery 动态添加和删除 B 行,更特别的是遵循此示例 - http://jsfiddle.net/mjaric/tfFLt/
一切都很好,除非保存(使用 saveAll)由于服务器端验证而失败。在这种情况下,提交时页面刷新,所有动态添加的字段都会丢失,用户必须从头开始重新创建所有行。
有什么办法,使用 JQuery 动态添加的字段都不会丢失并保留它们的旧值(与 Cake 的默认行为相同)?可能发出 Ajax 请求是一种选择,因此页面不会在服务器端验证失败时重新加载,但对我来说这不是一种选择,因为表单也有一个文件上传,而且据我所知,Ajax 请求不支持文件 trsnafer?
【问题讨论】:
-
通过 ajax 调用上传文件就像一个魅力,只是方法有点不同。您需要在保存表单之前上传文件,并在成功上传后将一些值存储在隐藏字段中。
-
@JulianHollmann 感谢您的意见。我正在考虑使用 JsHelper 进行 ajax 表单提交但是 CakePHP 文档说 JsHelper 不支持通过 ajax 上传文件所以我想我首先需要使用 ajax 上传文件(没有帮助程序)然后使用帮助程序提交表单?另一个问题是我正在使用 CakePHP 媒体助手进行文件上传(附件模式),这使得像我这样的新手更难以按照您的建议进行更改。
-
您可以再次创建所有 B 行,因为您需要的所有信息都在
$this->data中。我有很多相同格式的应用程序。对于上传文件,只需在保存/上传之前验证所有字段。 -
@PauloRodrigues 谢谢!重用 $this->data 数组应该可以工作。
-
@PauloRodrigues 我正在尝试重用 $this->data 数组,但是我遇到了一个问题。如上所述,我有 A hasMany B 关系,并且在服务器端验证失败的情况下,我计算总 B 字段(包括动态生成的字段)的数量并重新创建那么多字段。现在正确显示了字段数,但是当我提供诸如(B.0.fieldname、B.1.fieldname 等)之类的字段名称时,它会将它们转换为 A.0、A.1 等。本质上,它假定它们是父模型 (A) 字段。我无法理解我在这里做错了什么。