Take the 2-minute tour ×
Drupal Answers is a question and answer site for Drupal developers and administrators. It's 100% free, no registration required.

I am building a multistep form using ctools, basically following this approach. Now I want the following behaviour:

  • user is at step 1
  • enters data for step 1
  • clicks continue and gets to step 2
  • enters data for step 2
  • clicks back and gets to step 1
  • sees the data he entered previously (works already)
  • clicks continue and gets to step 2
  • sees the data he entered previously (works not yet)

To show the previously entered data after clicking continue, I simply set $form[$name]['#default_value'] with values from $form_state['values'] (with a detour via ctools object cache). So this works already.

The problem is with clicking back: After clicking back, $form_state['values'] does not contain any entered values. So I don't have the values to populate $form[$name]['#default_value'] and this is my current problem.

So I wonder: How can I send entered values with the back button submit?

share|improve this question
add comment

3 Answers

As far as I am aware there is not a built in way to achieve this within cTools with the wizard code you are probably playing with (the sub modules that came with cTools inside its plugins folder).

You'll have to use session storage on the server side or localstorage on the client side (javascript) to have the values saved in the manner you describe.

For instant results, install Multi-step forms module and browse to http://your-install.com/mforms/example/session to see a working example of what you describe. The corresponding code is inside of Multi-step forms, which is made for developers to utilize.

share|improve this answer
    
Thanks for your answer and the hint to mforms. I've tried it out but it's not really convincing me, as there's no "native" back button (it seems you have to add it to the forms by yourself). Additionally, its currently pretty low popularity scares me off a bit. So I decided to keep using ctools and postpone the desired feature - and in case I'll need it once, I think using the $_POST var could be a working hack. –  Georg Jähnig Dec 20 '12 at 2:44
add comment

I am able to solve the problem. Actually in my case $form_state['rebuild'] = TRUE; is causing the problem. This actually refresh the form and $form_state['values'] is set to null. So I have created an array which will hold $form_state['values'] before it get refreshed and store it in each step storage form. A bit of code to explain you better.

function form_user_registration_previous_submit($form, &$form_state) {
    $current_step = &$form_state['step'];    
    $formvalue_array=$form_state['values'];
    $form_state['step_information'][$current_step]['stored_values'] = $formvalue_array;
    if ($current_step > 1) {
      $current_step--;
      $form_state['values'] = $form_state['step_information'][$current_step]['stored_values'];
    }
    $form_state['rebuild'] = TRUE;   
  }

function form_user_registration_next_submit($form, &$form_state) {
    $current_step = &$form_state['step'];
    $formvalue_array=$form_state['values'];    
    $form_state['step_information'][$current_step]['stored_values'] = $formvalue_array;
    if ($current_step < count($form_state['step_information'])) {
      $current_step++;
      if (!empty($form_state['step_information'][$current_step]['stored_values'])) {
        $form_state['values'] = $form_state['step_information'][$current_step]['stored_values'];
      }
      else {
        $form_state['values'] = array();
      }
      $form_state['rebuild'] = TRUE;  // Force rebuild with next step.      
      return;
    }
  }
share|improve this answer
add comment

I've the same problem while using cTools for building multi-step form.

I'm using drupal 7.26 and ctools 1.3.

I don't even have rebuild statement in my form.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.