【问题标题】:Redirect form in validation fail验证中的重定向表单失败
【发布时间】:2010-06-23 17:57:24
【问题描述】:

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

有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      如果表单数据不大,您可以将其存储在$_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....
      

      【讨论】:

      • 在自定义 PHP 网站中,您的方法可以使用。但是,Drupal 有自己的表单处理 API。实际上,这更像是一个 Drupal 问题,而不是 PHP 甚至表单验证问题。
      • 快速浏览 API 文档,它提到了 $form_state['values'] 数组,我猜这是您过滤后的所有表单值,但您是对的,乍一看,它似乎不是,一种解析除 $_POST 之外的任何内容的方法。为什么不将 $form_state 存储在会话中,然后假装表单已被验证并用会话值覆盖 $form_state
      猜你喜欢
      • 2013-11-05
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多