我们正在构建一个小型子站点,在首页上有一个用户可以提交的输入框表单。从那里,他们被带到一个页面,其中包含更多相关的表单字段(添加更多详细信息,标记它等),并且第一个主要表单字段已经填写。到目前为止,这非常有效。
问题出现在没有登录的用户身上。当他们提交第一个表单时,他们会被带到(LoginToboggan)登录页面,允许他们登录。登录后,他们会重定向到第二个表单页面,但第一个主表单字段未填写 - 换句话说,表单数据不会持续存在。
我们如何存储这些数据并将其保留在访问被拒绝的页面中?
答案 0 :(得分: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后删除它们,或设置一个较短的过期时间,以便自动清理它们。
答案 1 :(得分:0)
我不知道是否有一种很好的方法可以在Drupal中从两种完全不同的形式传输表单数据,尤其是在访问被拒绝的情况下。我能找到的最佳选择是: