2010-06-23 139 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