Drupal multi-form loses state on the update page

I have a multi-page form. Go to page 1, page 2 and then on page 3. Press Refresh (f5) and the form will return to page 2.

This is with drupal-6. The problem is similar to this http://drupal.org/node/1060290 .

We delve into the problem using the form_cache database table. Both pages 1 and 2 appear. In the debugger, php looks like a new form_id has been created. i.e. storage_form-1add3819cbea88139679819935a69686 is the key in the database cache table, and form-bcf9556f57f5352a57dfbba4c2120ee7 is the "form_id" when updating.

What does my form code look like?

Main form function:

function myform_online(&$form_state) { // $form_state['storage']['step'] keeps track of what page we're on. // start at step 1 if no storage has been set if (!isset($form_state['storage']['step'])) { $form_state['storage']['step'] = 1; } // If we are saving the form data we should submit rather than display the details. // At least look at saving the step. // Don't lose our old data when returning to a page with data already typed in. $default_values = array(); if (isset($form_state['storage']['values'][$form_state['storage']['step']])) { $default_values = $form_state['storage']['values'][$form_state['storage']['step']]; } switch ($form_state['storage']['step']) { case 1: // Your Details module_load_include('inc', 'join_online', 'includes/step1'); 

And we process submit:

 function join_online_submit($form, &$form_state) { //Save the values for the current step into the storage array. //dsm($form_state); $form_state['storage']['values'][$form_state['storage']['step']] = $form_state['values']; # ahah - bail. if ($form_state['ahah_submission']) { return; } // How do we work out if this was a refresh? It currently does start with 1 and think that the step is #2. //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. //We must do this or the form will rebuild instead of refreshing. unset($form_state['storage']); //Go to this page after completing the form. $form_state['redirect'] = 'join_online/form/thank-you'; } } 
+7
source share
1 answer

If you use $ form_state ['rebuild'] = TRUE in the _submit function, the state of the form is saved and can be used for default values.

Check out this example: http://www.ferolen.com/blog/how-to-create-multistep-form-in-drupal-6-tutorial/

+1
source

All Articles