2

我有一种情况,如果我的表单没有验证,我需要它从 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 值,但无济于事。

有什么建议么?

4

2 回答 2

1

你把自己置于一个糟糕的境地。AFAIK,你不能在不丢失 $form_state 的情况下重定向。除非提交表单,否则重定向将不起作用,因此只要表单不验证您就不会走得太远。

我不知道您如何设置代码,但在我看来,您将有更好的运气设置变量$form_state并使用它来确定是否应该隐藏/显示结果。

An alternative option would be to save the $form_state in the global $_SESSION['batch_form_state'], to have it used when the form is initiated. I haven't tried it before and it's a bit hackish, but it should work.

于 2010-06-23T19:12:11.423 回答
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....
于 2010-06-23T18:28:48.760 回答