2010-09-30 44 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裝飾來生成。