重定向后保留 Zend Form 对象
Posted
技术标签:
【中文标题】重定向后保留 Zend Form 对象【英文标题】:Persist Zend Form object after redirect 【发布时间】:2010-09-30 09:56:04 【问题描述】:所以问题是我在页面 A 中有一个表单,该表单正在页面 B 中提交。 在页面 B 验证表单后,它应该重定向回页面 A 并显示可能发生的错误的表单。
实现这一目标的最佳方法是什么?将整个表单对象临时放入会话中是否明智?还是有更优雅的解决方案?
【问题讨论】:
【参考方案1】:为什么不在页面 A 上验证它,如果有效则转发到页面 B?这样你就不必做任何丑陋的黑客攻击了。
【讨论】:
页面 A 是一个包含未登录时不可用的功能的页面,因此登录表单嵌入在该页面上。该表单的实际验证是在页面 B 上处理的。对我来说,处理相同表单的 2 个操作似乎有点不对。【参考方案2】:正确的方法是将表单提交到同一页面,并且只有当它有效时,才通过Location:
标头重定向到下一页。
【讨论】:
【参考方案3】:在我看来,页面 A 是这里的罪魁祸首。
您可以在会话中保存页面 A 的 url,然后重定向到(唯一!)登录页面(页面 B,对吗?),而不是在用户未登录时在页面 A 上呈现登录表单,由 AuthController::loginAction()
之类的东西处理。
在验证失败时,您将他留在登录页面上,显示验证错误和表单。成功验证/登录后,您检查会话以查看那里是否有保存的 url。如果是这样,请把他送到那里。如果没有,请将他发送到您选择的某个位置,他的个人资料页面或主页或某种祝贺您已登录的页面。
明白我的意思吗?
【讨论】:
我知道你的意思,但如果验证失败,我真的不希望用户离开该页面。用户可能不理解。 这是一个非常常见的工作流程:“抱歉,首先需要登录。”然后重定向到登录页面;我怀疑用户会理解。但是,如果您必须在页面 A 上显示表单,即使验证失败,那么我认为您仍然坚持您已经注意到的方法。但它们都让我觉得有点笨拙,需要控制器检查会话变量或表单处理。如果您在两个动作中进行表单处理,那么您至少可以使用动作助手来保持该代码有点DRY。 更新:对此有另一个想法。如果您真的想在两个不同的控制器中处理处理以使他保持在他发布表单的页面上,至少将该表单处理提取到action helper 中。这样,您至少可以保留表单处理DRY。见similar discussion。【参考方案4】:Zend_Form
有getMessages
、getErrorMessages
和setErrors
、setErrorMessages
等方法。您可以尝试这样做 - 从未尝试过,但理论上应该可行:
-
验证失败后在页面 B 上存储会话中的验证消息。
重定向到页面 A。
在渲染表单之前,检查会话中是否有消息,如果有,设置为表单。
渲染表单 - 如果设置了消息,它们将由
Errors
装饰器生成。
【讨论】:
以上是关于重定向后保留 Zend Form 对象的主要内容,如果未能解决你的问题,请参考以下文章