我有一个多步形式(总共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'] = '';
}
}
答案 0 :(得分:0)
一些观察
#multistep
已消失:http://drupal.org/node/144132#multistep hidden
元素不会保护您的值。最好使用value
元素。只是不要将value
与#value
混淆。 First是一种表单元素,第二种是元素的值。 E.g。 $form['secret'] = array( '#type' => 'value', '#value' => 123)
提交表单时:$form_state['values']['secret'] = 123
$step = isset($form_state['storage']['step']) ? (int) $form_state['storage']['step'] : 0;
$form_state['storage']['step'] = $step + 1
(我更愿意避免让我迷惑的增量运算符。)
尝试一下,看看它们是否解决了你的问题:)