'multistep', 'page callback' => 'drupal_get_form', 'page arguments' => array('multistep_simple'), 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); $items['multistep-confirm'] = array( 'title' => 'multistep', 'page callback' => 'drupal_get_form', 'page arguments' => array('multistep_confirm_example'), 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); $items['multistep'] = array( 'title' => 'multistep', 'page callback' => 'drupal_get_form', 'page arguments' => array('multistep_form'), 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); return $items; } function multistep_simple($form, &$form_state) { // Check if storage contains a value. A value is set only after the form is submitted and we return here. if (!empty($form_state['storage']['myvalue'])) { // Display a message with the submitted value. drupal_set_message(t("You submitted: @name", array('@name' => $form_state['storage']['myvalue']))); } $form['name'] = array( '#type' => 'textfield', '#title' => t('Name'), '#description' => t('Enter your name'), '#required' => TRUE, ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Submit'), ); return $form; } // Our submit handler for multistep_simple. function multistep_simple_submit($form, &$form_state) { // Tell FAPI to rebuild. $form_state['rebuild'] = TRUE; // Store submitted value. $form_state['storage']['myvalue'] = $form_state['values']['name']; } function multistep_confirm_example($form, &$form_state) { if (empty($form_state['delete'])) { $form['data'] = array( '#type' => 'textarea', '#title' => t('Survey response'), '#description' => t('Enter your response.'), '#required' => TRUE, ); $form['delete'] = array( '#type' => 'checkbox', '#title' => t('Delete previous'), '#description' => t('Delete all previous responses.'), ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Submit'), ); } else { $form = multistep_confirm_example_delete_confirm($form, $form_state); } return $form; } function multistep_confirm_example_submit($form, &$form_state) { $values = $form_state['values']; if (!empty($values['confirm'])) { // User submitted confirm form. // Delete all responses. drupal_set_message(t('Deleted all older responses.')); } else { if (!empty($values['delete'])) { $form_state['rebuild'] = TRUE; $form_state['delete'] = TRUE; } // Save this response. // [...] drupal_set_message(t('Your response has been saved.')); } } function multistep_confirm_example_delete_confirm($form, &$form_state) { // Specify our step submit callback. $form['step_submit'] = array('#type' => 'value', '#value' => 'queue_ui_delete_submit'); return confirm_form($form, t('Are you sure you want to older responses?'), 'multistep-confirm', t('All older survey responses will be deleted.'), t('Delete'), t('Cancel') ); } /** * Start advanced example using variable functions. */ /** * Primary form builder. */ function multistep_form($form, &$form_state) { // Initialize. if ($form_state['rebuild']) { // Don't hang on to submitted data in form state input. $form_state['input'] = array(); } if (empty($form_state['storage'])) { // No step has been set so start with the first. $form_state['storage'] = array( 'step' => 'multistep_form_start', ); } // Return the form for the current step. $function = $form_state['storage']['step']; $form = $function($form, $form_state); return $form; } /** * Primary validate handler. */ function multistep_form_validate($form, &$form_state) { // Call step validate handler if it exists. if (function_exists($form_state['storage']['step'] . '_validate')) { $function = $form_state['storage']['step'] . '_validate'; $function($form, $form_state); } return; } /** * Primary submit handler. */ function multistep_form_submit($form, &$form_state) { $values = $form_state['values']; if (isset($values['back']) && $values['op'] == $values['back']) { // Moving back in form. $step = $form_state['storage']['step']; // Call current step submit handler if it exists to unset step form data. if (function_exists($step . '_submit')) { $function = $step . '_submit'; $function($form, $form_state); } // Remove the last saved step so we use it next. $last_step = array_pop($form_state['storage']['steps']); $form_state['storage']['step'] = $last_step; } else { // Record step. $step = $form_state['storage']['step']; $form_state['storage']['steps'][] = $step; // Call step submit handler if it exists. if (function_exists($step . '_submit')) { $function = $step . '_submit'; $function($form, $form_state); } } return; } function multistep_form_start($form, &$form_state) { $form['musician'] = array( '#type' => 'radios', '#title' => t('Choose a musician'), '#options' => array( 'davis' => t('Miles Davis'), 'coltrane' => t('John Coltrane'), 'corea' => t('Chick Corea'), 'brubeck' => t('Dave Brubeck'), 'other' => t('Other') ), '#default_value' => isset($form_state['storage']['musician']) ? $form_state['storage']['musician'] : NULL, ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Next'), ); return $form; } function multistep_form_start_submit($form, &$form_state) { // Trigger multistep, there are more steps. $form_state['rebuild'] = TRUE; $values = $form_state['values']; if (isset($values['back']) && $values['op'] == $values['back']) { // User is moving back from this form, clear our storage. $form_state['storage']['musician'] = NULL; } else if ($form_state['values']['musician'] == 'other') { // Set the next step. $form_state['storage']['musician'] = NULL; // Clear out because of our default_value use. $form_state['storage']['step'] = 'multistep_form_define_musician'; } else { // We might do something with the values here... $form_state['storage']['musician'] = $form_state['values']['musician']; // Set the next step. $form_state['storage']['step'] = 'multistep_form_songs'; } } function multistep_form_define_musician($form, &$form_state) { $form['musician'] = array( '#type' => 'textfield', '#title' => t('Musician'), '#default_value' => isset($form_state['storage']['musician']) ? $form_state['storage']['musician'] : NULL, ); $form['back'] = array( '#type' => 'submit', '#value' => t('Back'), ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Next'), ); // Pretend this step is another, to trigger its submit handler. $form_state['storage']['step'] = 'multistep_form_start'; return $form; } function multistep_form_songs($form, &$form_state) { $form['song'] = array( '#type' => 'textfield', '#title' => t('Favorite recording?'), '#default_value' => isset($form_state['storage']['song']) ? $form_state['storage']['song'] : NULL, ); $form['unknown'] = array( '#type' => 'checkbox', '#title' => t("I don't know"), ); $form['back'] = array( '#type' => 'submit', '#value' => t('Back'), ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Next'), ); return $form; } function multistep_form_songs_submit($form, &$form_state) { $values = $form_state['values']; $form_state['rebuild'] = TRUE; if (isset($values['back']) && $values['op'] == $values['back']) { // User is moving back from this form, clear our storage. $form_state['storage']['song'] = NULL; } else if ($values['unknown']) { // Skip to confirm step. $form_state['storage']['step'] = 'multistep_form_confirm'; } else { $form_state['storage']['song'] = $form_state['values']['song']; // Set the next step. $form_state['storage']['step'] = 'multistep_form_heard'; } } function multistep_form_heard($form, &$form_state) { $form['heard'] = array( '#type' => 'textfield', '#title' => t('When did you first hear !musician', array('!musician' => $form_state['storage']['musician'])), '#default_value' => isset($form_state['storage']['heard']) ? $form_state['storage']['heard'] : NULL, ); $form['back'] = array( '#type' => 'submit', '#value' => t('Back'), ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Next'), ); return $form; } function multistep_form_heard_submit($form, &$form_state) { $values = $form_state['values']; $form_state['rebuild'] = TRUE; if (isset($values['back']) && $values['op'] == $values['back']) { // User is moving back from this form, clear our storage. $form_state['storage']['heard'] = NULL; } else { $form_state['storage']['heard'] = $form_state['values']['heard']; // Set the next step. $form_state['storage']['step'] = 'multistep_form_confirm'; } } function multistep_form_confirm($form, &$form_state) { $description = t('Submit your response?'); $form['back'] = array( '#type' => 'submit', '#value' => t('Back'), '#weight' => 10, ); return confirm_form($form, t('Ready to submit?'), 'multistep', $description, t('Submit'), t('Cancel') ); } function multistep_form_confirm_submit($form, &$form_state) { $values = $form_state['values']; if (isset($values['back']) && $values['op'] == $values['back']) { // Only rebuild if moving back. $form_state['rebuild'] = TRUE; } else { // Do something with all this data. // Don't rebuild. drupal_set_message(t('Form complete!')); } }