2010-09-30 43 views
0

所以事情是我有一个页面一个形式在页面B. 提交在B页面验证表单后,它应该回到重定向到一个页面,并显示与形式发生的可能的错误。坚持Zend的窗体对象后重定向

达到此目的的最佳方法是什么?临时将整个表单对象放在会话中是否明智?还是有更优雅的解决方案?

回答

1

正确的方法是将表单提交到相同的页面,且仅当它是有效的,你通过Location:头到下一个页面重定向。

3

,如果它是有效的,为什么不对其进行验证网页A上,再往前到网页B?这样你就不必做任何丑陋的黑客。

+0

第一个是包含功能性,因此登录表单网页内嵌的未登录时不可用的页面。该表单的实际验证在页面B上进行处理。 这似乎是错误的我有2处理相同的形式的行动。 – sander 2010-09-30 10:18:58

0

听起来对我来说,页面A是这里的罪魁祸首。

而不是呈现在网页A的登录表单,当用户没有登录,你可以保存在网页A链接的会话,然后重定向到(唯一!)登录页面(B,对吧?) ,由类似AuthController::loginAction()的东西处理。

在验证失败,你让他在那里的登录页面上,显示的验证错误和形式。验证/登录成功后,您会检查会话以查看是否存在已保存的网址。如果是这样,请把他送到那里。如果没有,请将他发送到您选择的某个地方,或者是他的个人资料页面或主页,或者是某种您已登录的祝福页面。

明白我的意思?

+0

我知道你的意思,但如果验证失败,我真的不希望用户离开那个页面。用户可能不理解它。 – sander 2010-10-01 12:44:20

+0

这是一个非常常见的工作流程:“对不起,首先需要登录。”然后重定向到登录页面;我怀疑用户会理解。但是,如果您必须在A页上显示表格,即使验证失败,我认为您仍然坚持您已经注意到的方法。但他们对我来说都感觉有点笨拙,需要控制器检查会话变量或表单处理。如果你在两个动作中进行表单处理,那么你至少可以使用一个动作助手来保持这个代码[DRY](http://en.wikipedia.org/wiki/Don%27t_repeat_yourself)。 – 2010-10-02 00:29:52

+0

**更新**:在此有另一个想法。如果你真的想要在两个不同的控制器中处理这个处理,以便将他保存在他发布表单的页面上,那么至少要将表单处理提取到[action helper]中(http://framework.zend.com) /manual/en/zend.controller.actionhelpers.html)。这样,您至少可以保留表单处理[DRY](http://en.wikipedia.org/wiki/Don%27t_repeat_yourself)。参见[类似讨论](http://stackoverflow.com/questions/3876877/zend-framework-post-to-different-action-then-return-to-original-action-if-fails/3878814#3878814)。 – 2010-10-07 06:10:53

0

Zend_Form有一个像getMessagesgetErrorMessagessetErrorssetErrorMessages等方法。你可以尝试这样做 - 从来没有尝试过,但理论上应该工作:

  1. 在页面B后验证存储验证消息在会话中。
  2. 重定向到页面A
  3. 在呈现表单之前,检查会话中是否有消息,如果是,则将它们设置为表单。
  4. 渲染形式 - 如果消息被设置时,它们将被Errors装饰来生成。