验证中的重定向表单失败

时间:2010-06-23 17:57:24

标签: php drupal redirect drupal-fapi drupal-forms

我有一种情况,如果我的表单没有验证,我需要删除除url中的第一个参数以外的所有参数。原因是我的表单结果显示在内容区域的表单下方。如果表单未验证,我需要删除任何以前的结果。

我在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值但无效。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

你把自己置于糟糕的境地。 AFAIK,你不能在不丢失$ form_state的情况下重定向。除非提交表单,否则重定向将无法工作,因此只要表单无法验证您将无法实现远程。

我不知道你是如何设置代码的,但在我看来,你会在$form_state中设置一个变量,并使用它来确定是否应该隐藏/显示结果。< / p>

另一种选择是将$form_state保存在全局$_SESSION['batch_form_state']中,以便在启动表单时使用它。我之前没有尝试过它,它有点hackish,但它应该工作。

答案 1 :(得分: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....