2010-04-12 75 views
3

我们正在建立一个小型子站点,在首页上有一个用户可以提交的输入框表单。从那里,他们被带到一个页面,其中有更多关联的表单字段(添加更多细节,标记等),并且第一个主表单字段已经填充。迄今为止,这非常出色。如何在Drupal中的“访问被拒绝”页面持续表单数据?

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

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

回答

1

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

假设你正在使用的表单API来创建表单,而且必须生成形式的功能叫做“字段名”字段:

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的(S)提交处理您的形式:

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,或设置一个短的到期时间,以便自动清理它们。

+0

但是,如何触发Drupal中的保存和检索? – 2010-04-19 14:43:57

+0

谢谢。这是一个很好的答案! – 2010-04-20 14:53:30

+0

没问题。但我会第一个承认,在我想出这样一个解决方法之后,我会找到一个Drupal对象(或者数据库表或函数),它完全符合我的需求。祝你好运! – flamingLogos 2010-04-20 16:08:39

0

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

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