Drupal 6多步骤表单:提交时form_state值为空



我在从多步骤表单中获取要插入数据库的值时遇到问题。我得到的只是每个字段的空值。

这是代码:

  function multistep_profile_menu() {
  $items['multistep_profile'] = array(
 'title' => t('Multistep Profile'),
 'page callback' => 'drupal_get_form',
 'page arguments' => array('multistep_profile'),
 'type' => MENU_NORMAL_ITEM,
 'access arguments' => array('access content'),
 );
 return $items;
 }

 function multistep_profile(&$form_state) {
 // $form_state['storage']['step'] keeps track of what page we're on.
 if (!isset($form_state['storage']['step'])) {
 $form_state['storage']['step'] = 1;
 }
 //stores form data and carries it between steps
 $default_value = '';
 if (isset($form_state['storage']['values'][$form_state['storage']['step']])) {
  $default_value = $form_state['storage']['values'][$form_state['storage']['step']];
 }
 switch ($form_state['storage']['step']) {
 // Step 1 of Form
 case 1:
  $form['step_one'] = array(
    '#title' => t('Step 1'),
    '#type' => 'fieldset',
    '#description' => t('Just getting started.'),
  );
  // Full Name
  $form['step_one']['full_name'] = array(
    '#title' => t('Full Name'),
    '#type' => 'textfield',
    '#description' => t('Please enter your name.'),
    '#required' => TRUE,
    '#default_value' => isset($default_value['full_name']) ? $default_value['full_name'] :       '',
  );
  // College/University/Organization
  $form['step_one']['college'] = array(
    '#type' => 'textfield',
    '#title' => t('College/University/Organization'),
    '#default_value' => isset($default_value['college']) ? $default_value['college'] : '',
  );
  // Academic Disciplines
  $form['step_one']['academic'] = array(
    '#type' => 'textfield',
    '#title' => t('Academic Disciplines'),
    '#default_value' => isset($default_value['academic']) ? $default_value['academic'] : '',
    );
  break;
// Step 2 of Form
case 2:
  $form['step_two'] = array(
    '#title' => t('Step 2'),
    '#type' => 'fieldset',
    '#description' => t('Almost done.'),
  );
  // Job Title
  $form['step_two']['job_title'] = array(
    '#title' => t('Job Title'),
    '#type' => 'textfield',
    '#description' => t('Please enter your job title.'),
    '#default_value' => isset($default_value['job_title']) ? $default_value['job_title'] : '',
  );
  // Department
  $form['step_two']['department'] = array(
    '#type' => 'textfield',
    '#title' => t('Department'),
    '#default_value' => isset($default_value['department']) ? $default_value['department'] : '',
  );
  break;
// Step 3 of Form  
case 3:
  $form['step_three'] = array(
    '#title' => t('Step 3'),
    '#type' => 'fieldset',
    '#description' => t('Almost done, part 3.')
  );
  // Q1
  $form['step_three']['q1'] = array(
    '#title' => t('Why do you want to develop a globally networked course?'),
    '#type' => 'textarea',
    '#description' => t(''),
  );
  break;
//Confirmation  
case 4:
  $form['thanks'] = array(
    '#value' => '<p>'. t('Your Profile is complete.') .'</p>',
  );
  break;
  }
  //programmatically display buttons
 if ($form_state['storage']['step'] > 1) {
  $form['previous'] = array(
  '#type' => 'submit',
  '#value' => t('<< Previous'),
  );
 }
 if ($form_state['storage']['step'] != 4) {
 $form['next'] = array(
  '#type' => 'submit',
  '#value' => t('Continue >>'),
 );
 }
 else {
 $form['finish'] = array(
  '#type' => 'submit',
  '#value' => t('Finish'),
 );
 }
  return $form;
  }

 function multistep_profile_submit($form, &$form_state) {
 //Save the values for the current step into the storage array.
 $form_state['storage']['values'][$form_state['storage']['step']] = $form_state['values'];
 //Check the button that was clicked and change the 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') {
//You should store the values from the form in the database here.

 dpm($form_state);
 // INSERT into DB
 $full_name = $form_state['values']['full_name'];
 $college = $form_state['values']['college']; 
 $academic = $form_state['values']['academic']; 
 $job_title = $form_state['values']['job_title'];
 $department = $form_state['values']['department'];
 $q1 = $form_state['values']['q1'];
 db_query("INSERT INTO {multistep_profile} (full_name, college, academic, job_title,    department, q1, created) VALUES
    ('%s', '%s', '%s', '%s', '%s', '%s', %d)", $full_name, $college, $academic, $job_title, $department, $q1, time());
  drupal_set_message(t('Your profile has been saved.'));

unset($form_state['storage']);
//Go to this page after completing the form.
//$form_state['redirect'] = 'node';
 }
 }

进入数据库的唯一值是"创建"日期时间戳。

我运行了一个DPM来检查这些值是否在表单步骤之间传递,而且确实如此,我只是不知道如何将它们插入数据库。有什么帮助吗?

查看您的提交函数,您(正确地)将在$form_state['storage']['values'][<step_number>]下的不同步骤上收集的值存储起来。这与您发布的DPM输出相匹配,即值显示在$form_state['storage']['values'][1]...$form_state['storage']['values'][2]...等下面。

但在您的最终提交处理中,您尝试在$form_state['values'][...]下访问它们,就像这是一个单步表单一样。由于您的最后一步没有发布任何值,因此您在那里找不到任何内容。

因此,看起来您只需要更改最终的值收集逻辑,就可以从之前放置值的存储(子)阵列中获取值:)

例如:

$full_name = $form_state['values']['full_name'];

需要

$full_name = $form_state['storage']['values'][1]['full_name'];

对于其他值,依此类推。

最新更新