Почему моя многоступенчатая форма drupal (v6) сбрасывается? - PullRequest
2 голосов
/ 14 июня 2011

У меня многоэтапная форма (всего 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 голосов
/ 01 августа 2011

Некоторые наблюдения

  • В 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

  • I 'Я немного сбит с толку из-за множества условий, которые определяют ваш шаг.Тем более, что вы вызываете внешнюю функцию, а я с Хенриком об этом.Там может что-то случиться, и я не уверен, что это хорошая идея, чтобы шаг формы определялся другой функцией.Вы должны знать, на каком этапе вы находитесь.Так что эта часть кода должна быть проще:

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

  • И затем убедитесь, что вы увеличиваете номер шага (я бы не стал делать это при отправкефункция, в этот момент это означает, что проверка была в порядке, и мы можем перейти к следующему шагу / назад, не принимая решения):

$form_state['storage']['step'] = $step + 1 (я предпочитаю избегать дополнительных операторов, которые могли быСмути меня.)

Попробуйте и посмотрите, решат ли они вашу проблему:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...