【问题标题】:Dynamically added form fields are lost when save is failed due to some validation由于某些验证导致保存失败时,动态添加的表单字段会丢失
【发布时间】:2012-03-06 16:31:11
【问题描述】:

有两种模型,假设 A 和 B 具有 A hasMany B 关系。用户可以在创建 A 时关联任意数量的 B 行。该应用程序允许用户使用 JQuery 动态添加和删除 B 行,更特别的是遵循此示例 - http://jsfiddle.net/mjaric/tfFLt/

一切都很好,除非保存(使用 saveAll)由于服务器端验证而失败。在这种情况下,提交时页面刷新,所有动态添加的字段都会丢失,用户必须从头开始重新创建所有行。

有什么办法,使用 JQuery 动态添加的字段都不会丢失并保留它们的旧值(与 Ca​​ke 的默认行为相同)?可能发出 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) 字段。我无法理解我在这里做错了什么。

标签: jquery cakephp dom


【解决方案1】:

正如所指出的,在验证失败时渲染视图时,您可以静态放置所有字段。

无法通过 AJAX 上传文件,因为您无法从 JS 读取文件。不过,有一个完善的解决方法:您可以暂时将表单放入不可见的 iframe 中,以本机方式提交,然后触发回调,因为它会是 AJAX 响应。

jQuery form plugin 非常擅长以 AJAX 方式提交表单,并且在遇到文件字段时透明地执行后者。

【讨论】:

    猜你喜欢
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 2018-02-25
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多