为什么我的drupal(v6)多步形式重置?

时间:2011-06-14 12:46:52

标签: drupal

我有一个多步形式(总共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'] = '';
    }
}

1 个答案:

答案 0 :(得分:0)

一些观察

  • Drupal 6 #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

  • 我对确定你迈出的许多条件感到有点困惑。特别是因为你调用了一个外部函数,而且我和Henrik在这个函数上。那里可能会发生一些事情,我不确定让表格的步骤由另一个功能决定是个好主意。你应该知道你在哪一步。所以这部分代码应该更简单:

$step = isset($form_state['storage']['step']) ? (int) $form_state['storage']['step'] : 0;

  • 然后确保你增加你的步数(我不会在提交功能中这样做,此时它意味着验证是正常的,我们可以继续下一步/返回,而不是做出决定) :

$form_state['storage']['step'] = $step + 1(我更愿意避免让我迷惑的增量运算符。)

尝试一下,看看它们是否解决了你的问题:)