如何解决为什么我的drupalv6多步骤表单会重置?
| 我有一个多步骤表单(共6步)。如果我说的是第3步,并且在等待下一个或上一个之前要等待几分钟(约3分钟),则表单会将我发送回第1步,并且所有数据都会丢失。为什么会发生这种情况,我该如何制止呢? 编辑:这是表单代码(我取出了一些不相关的部分,例如每个步骤的所有表单字段,没有什么特别的地方):function display_job_application_form($form_state,$jobid)
{
$form[\'#multistep\'] = TRUE;
$jobappid = get_job_app_id($jobid);
$last_step = get_application_step($jobappid);
if($last_step >= 7)
{
drupal_set_message(\"You have already applied for this job.\",\"error\");
}
if (!isset($form_state[\'storage\'][\'step\']))
{
if($last_step >= 0)
{
$form_state[\'storage\'][\'step\'] = ($last_step >= 6) ? $last_step : $last_step + 1;
}
else
{
$form_state[\'storage\'][\'step\'] = $_GET[\'page\']?$_GET[\'page\']:1;
}
}
$db_data = decrypt_data($jobid,\"data_step\".$form_state[\'storage\'][\'step\']);
$default_value = \'\';
if (isset($form_state[\'storage\'][\'values\'][$form_state[\'storage\'][\'step\']])) {
$default_value = $form_state[\'storage\'][\'values\'][$form_state[\'storage\'][\'step\']];
}
else if(is_array($db_data) && count($db_data) > 0)
{
$default_value = $db_data;
}
$form[\'step\'] = array(
\'#type\' => \'hidden\',\'#value\' => $form_state[\'storage\'][\'step\'] + 1,);
$form[\'jobid\'] = array(
\'#type\' => \'hidden\',\'#value\' => $jobid,);
switch($form_state[\'storage\'][\'step\']){
case 1:
//page 1 form fields
break;
case 2:
//page 2 form fields
break;
case 3:
//page 3 form fields
break;
case 4:
//page 4 form fields
break;
case 5:
//page 5 form fields
break;
case 6:
//page 6 form fields
break;
}
if ($form_state[\'storage\'][\'step\'] > 1)
{
$form[\'previous\'] = array(
\'#type\' => \'submit\',\'#value\' => t(\'<< Previous\'),);
}
if ($form_state[\'storage\'][\'step\'] != 6)
{
$form[\'next\'] = array(
\'#type\' => \'submit\',\'#value\' => t(\'Continue >>\'),);
}
else {
$form[\'finish\'] = array(
\'#type\' => \'submit\',\'#value\' => t(\'Finish\'),);
}
$form[\'#theme\'] = \'theme_display_job_application_form_form\';
return $form;
}
function display_job_application_form_submit($form,&$form_state)
{
global $user;
$form_state[\'storage\'][\'values\'][$form_state[\'storage\'][\'step\']] = $form_state[\'values\'];
$jobid = $form_state[\'values\'][\'jobid\'];
$id = get_job_app_id($jobid);
if($form_state[\'storage\'][\'step\'] == 1 && $id < 0)
{
//INSERT INTO DB
}
else
{
//UPDATE DB FOR EACH STEP
}
if ($form_state[\'clicked_button\'][\'#id\'] == \'edit-previous\')
{
$form_state[\'storage\'][\'step\']--;
}
elseif ($form_state[\'clicked_button\'][\'#id\'] == \'edit-next\')
{
$form_state[\'storage\'][\'step\']++;
}
elseif ($form_state[\'clicked_button\'][\'#id\'] == \'edit-finish\' && $form_state[\'storage\'][\'values\'][6][\'checkbox\'])
{
//UPDATE DB,SEND EMAIL
unset($form_state[\'storage\']);
$form_state[\'redirect\'] = \'\';
}
}
解决方法
一些观察
在Drupal 6中,
#multistep
消失了:http://drupal.org/node/144132#multistep
使用hidden
元素不会保护您的值。最好使用value
元素。只是不要混淆value
和#value
。第一个是表单元素的类型,第二个是元素的值。
例如。 $form[\'secret\'] = array( \'#type\' => \'value\',\'#value\' => 123)
提交表格时:$form_state[\'values\'][\'secret\'] = 123
我对确定您要采取的多种情况感到有些困惑。特别是因为您调用了一个外部函数,而我在这个函数上与Henrik在一起。在那里可能会发生某些事情,但我不确定让表单的步骤由另一个函数确定是否是个好主意。您应该知道自己在哪一步。因此,这部分代码应该更简单:
$step = isset($form_state[\'storage\'][\'step\']) ? (int) $form_state[\'storage\'][\'step\'] : 0;
然后确保增加步数(我不会在Submit函数中执行此操作,这意味着验证是可以的,我们可以继续进行下一步/返回,而不做决定):
$form_state[\'storage\'][\'step\'] = $step + 1
(我宁愿避免可能会使我感到困惑的增量运算符。)
试试看,看看它们是否可以解决您的问题:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。