【问题标题】:How do I persist form data across an "access denied" page in Drupal?如何在 Drupal 的“拒绝访问”页面中保留表单数据?
【发布时间】:2010-04-12 21:25:31
【问题描述】:

我们正在构建一个小型子站点,该站点的首页上有一个用户可以提交的输入框表单。从那里,他们被带到一个页面,其中包含更多相关的表单字段(添加更多详细信息,标记它等),第一个主表单字段已经填写。到目前为止,这非常有效。

问题出现在未登录的用户身上。当他们提交第一个表单时,他们会被带到允许他们登录的(基于LoginToboggan 的)登录页面。登录后,他们重定向到第二个表单页面,但第一个主表单字段没有填写——换句话说,表单数据没有持久化。

我们如何存储这些数据并让它在拒绝访问页面中持续存在?

【问题讨论】:

    标签: drupal drupal-6


    【解决方案1】:

    您可以将数据保存在 cookie 中,该 cookie 将在登录页面后传递到页面。

    假设您正在使用 Form API 创建表单,并且您在函数中有一个名为“fieldname”的字段来生成表单:

    function my_form() {
      $form['fieldname'] = array (
        '#type'          => 'textfield',
        '#title'         => 'Some fieldname'
      );
    
      // Second field if you need to save another
      $form['fieldname2'] = array (
        '#type'          => 'textfield',
        '#title'         => 'Some other fieldname'
      );
    }
    

    在表单的提交处理程序中设置 cookie:

    function my_form_submit($form, &$form_state) {
      // Set the cookie with their data before they are redirected to login
      // Use the array syntax if you have one than one related cookie to save,
      //   otherwise just use setcookie("fieldname",...
    
      setcookie("saved_data[fieldname]", $form_state['values']['fieldname']);
    
      // Your other code
    }
    

    在他们登录并被重定向到表单的第二页后,您可以读取 cookie 的值,如果存在,将它们插入到字段的默认值中:

    function my_form() {
      if (isset($_COOKIE['saved_data[fieldname]'])) {
        $default_fieldname = $_COOKIE['saved_data[fieldname]'];
      }
      else {
        $default_fieldname = '';
      }
    
      // Same check for the second field
      if (isset($_COOKIE['saved_data[fieldname2]']))...
    
      $form['fieldname'] = array (
        '#type'          => 'textfield',
        '#title'         => 'Some fieldname',
        '#default_value' => $default_fieldname
      );
    
      // Second field if used
      $form['fieldname2'] = array (
        '#type'          => 'textfield',
        '#title'         => 'Some other fieldname',
        '#default_value' => $default_fieldname2
      );
    }
    

    cookie 将在设置后的每个页面加载时显示,因此无论是几次登录尝试失败或中间有其他页面浏览都无关紧要。您可能应该在使用 cookie 后将其删除或设置较短的过期时间以便自动清理它们。

    【讨论】:

    • 但是如何在 Drupal 中触发保存和检索?
    • 没问题。但是我会第一个承认,在我想出这样的解决方法之后,我会找到一个 Drupal 对象(或 DB 表或函数),它完全可以满足我的需要。祝你好运!
    【解决方案2】:

    我不知道在 Drupal 中是否有一种从两种完全不同的表单传输表单数据的好方法,尤其是在访问被拒绝的情况下。我能找到的最佳选择是:

    • 使用 url 发送字段数据。
    • 您也可以将数据保存在数据库中,但再次提取数据可能有点棘手。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多