我有一种情况,如果我的表单没有验证,我需要删除除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值但无效。
有什么建议吗?
答案 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....