2010-06-23 190 views
1

我有一種情況,如果我的表單不驗證我需要它從網址中除去第一個參數。原因是因爲我的表單的結果顯示在內容區域的表單下方。如果表單不確認我需要刪除任何以前的結果。驗證失敗時重定向表單

我已經在我的form_validate函數中嘗試了以下內容。

// Check if there were any errors. 
$errors = form_set_error(); 
if (!empty($errors)) { 
    drupal_goto(arg(0)); 
} 

目標頁面顯然是相同的,除了第一個,除了第一個,所有的參數被剝離。問題是Drupal忘記了form_validate函數引發的以前的表單狀態和錯誤。

我也嘗試改變我的form_validate函數中的#redirect值,但無濟於事。

有什麼建議嗎?

回答

1

後,您已經把自己放在一個糟糕的情況。 AFAIK,你不能丟失$ form_state而重定向。重定向不會工作,除非表單被提交,所以只要表單不驗證你不會走得太遠。

我不知道你如何設置你的代碼,但在我看來,你會有更好的運氣設置$form_state中的一個變量,並用它來確定是否應該隱藏/顯示結果。

另一種選擇是將$form_state保存在全局$_SESSION['batch_form_state']中,以便在表單啓動時使用它。我以前沒有嘗試過,它有點駭人聽聞,但它應該工作。

0

如果表格數據不是很大,您可以在$_SESSION中存儲表格數據。然後檢查重定向後是否存在。

我不熟悉Drupal,但您必須能夠訪問過濾的表單值。因此,您不需要驗證$_POST字段,而是使用存儲的$_SESSION值進行驗證。

簡單的例子

session_start(); 

// ... Previous Validation 

// Check if there were any errors. 
$errors = form_set_error(); 
if (!empty($errors)) { 
    $_SESSION['form_state'] = $form_state; 
    drupal_goto(arg(0)); 
} 

重定向

session_start(); 

$form_state = $_SESSION['form_state']); 
unset($_SESSION['form_state']); 

// The rest of the script.... 
+1

在自定義PHP網站中,您的方法可行。但是,Drupal擁有自己的表單處理API。真的,這更像是一個Drupal問題,而不是PHP甚至表單驗證問題。 – Icode4food 2010-06-23 18:57:15

+0

API文檔的快速掃描,它提到$ form_state ['values']數組,我猜是你所有的過濾表單值,但你是對的,它乍看起來似乎不是一種解析除了$ _ POST。爲什麼不將$ form_state存儲在會話中,然後假裝表單已被驗證,並用會話值覆蓋$ form_state – gawpertron 2010-06-23 19:09:55