Fix for Fix for Multipage User Registration

  1. <?php
  2. /**
  3. * Implementation of hook_menu()
  4. */
  5. function multipage_register_menu(){
  6.         $items['add/user'] = array(
  7.                 'title' => 'Add a user',
  8.                 'page callback' => 'multipage_register_wizard',
  9.                 'access arguments' => array('access content'),
  10.         );
  11.         return $items;
  12. }
  13.  
  14. /**
  15. *       PART I CTOOLS WIZARD IMPLEMENTATION
  16. */
  17. /**
  18. * menu callback for the multistep form
  19. * step is whatever arg one is -- and will refer to the keys listed in
  20. * $form_info['order], and $form_info['forms'] arrays.
  21. */
  22. function multipage_register_wizard(){
  23.         $step = arg(1);
  24.         //required includes for wizard
  25.         ctools_include('wizard');
  26.         ctools_include('object-cache');
  27.        
  28.         //SETUP ARRAY multistep setup
  29.         $form_info = array(
  30.                 'id' => 'multistep_register_basic',
  31.                 'path' => 'add/user/%step',
  32.                 'show trail' => TRUE,
  33.                 'show back' => TRUE,
  34.                 'show cancel' => true,
  35.                 'show return' => false,
  36.                 'next text' => 'Proceed to next step',
  37.                 'next callback' => 'multipage_register_basic_add_subtask_next',
  38.                 'finish callback' => 'multipage_register_basic_add_subtask_finish',
  39.                 'return callback' => 'multipage_register_basic_add_subtask_finish',
  40.                 'cancel callback' => 'multipage_register_basic_add_subtask_cancel',
  41.                 'order' => array(
  42.                         'create' => t('Step 1: Basic Information'),
  43.                         'profile' => t('Step 2: User profile'),
  44.                 ),
  45.                 'forms' => array(
  46.                         'create' => array(
  47.                                 'form_id' => 'multipage_register_user_form'
  48.                         ),
  49.                         'profile' => array(
  50.                                 'form_id' => 'multipage_register_profile_form'
  51.                         ),     
  52.                 ),
  53.         );
  54.        
  55.         // Setting the form up for multistep
  56.         $form_state = array(
  57.                 'cache name' => NULL,
  58.         );
  59.         // no matter which step, you will load your values from the callback page
  60.         $multipage_register = multipage_register_basic_get_page_cache(NULL);
  61.         if(!$multipage_register){
  62.                 // set form to first step -- there is no data
  63.                 $step = current(array_keys($form_info['order']));
  64.                 $multipage_register = new stdClass();
  65.        
  66.                 // set the storage object so its ready for whatever comes next
  67.                 ctools_object_cache_set('multipage_register_basic', $form_state['cache name'], $multipage_register);
  68.         }
  69.         // this is where we store all form data
  70.         $form_state['multipage_register_obj'] = $multipage_register;
  71.        
  72.         // this is magic that makes it work
  73.         $output - ctools_wizard_multistep_form($form_info, $step, $form_state);
  74.         return $output;
  75. }
  76.  
  77. /**
  78. *       ---------------------------- Part 2, regular Form API -------------------------------
  79. */
  80. function multipage_register_user_form(&$form, &$form_state){
  81.         $multipage_register = &$form_state['multipage_register_obj'];
  82.         $form['username'] = array(
  83.                 '#type' => 'textfield',
  84.                 '#required' => 1,
  85.                 '#title' => 'Username',
  86.                 '#default_value' => $multipage_register->username,
  87.         );
  88.         $form['employee'] = array(
  89.                 '#type' => 'radios',
  90.                 '#options' => array(
  91.                         0 => 'Yes',
  92.                         1 => 'No',
  93.                 ),
  94.                 '#required' => 1,
  95.                 '#title' => 'Is this user an employee?',
  96.                 '#default_value' => $multipage_register->employee,
  97.         );
  98.         $form['dealer'] = array(
  99.                 '#type' => 'radios',
  100.                 '#options' => array(
  101.                         0 => 'Yes',
  102.                         1 => 'No',
  103.                 ),
  104.                 '#required' => 1,
  105.                 '#title' => 'Is this user a Dealer?',
  106.                 '#default_value' => $multipage_register->employee,
  107.         );
  108.         $form_state['no buttons'] = TRUE;
  109. }
  110. /**
  111. * Note that this validate callback operates exactly like it does in the regular form api
  112. */
  113. function multipage_register_user_form_validate(&$form, &$form_state){
  114.         if(!isset($form_state['values']['username'])){
  115.                 form_set_error('username', 'You did not enter a username');
  116.         }
  117. }
  118.  
  119. function multipage_register_user_form_submit(&$form, &$form_state){
  120.         $submitted = $form_state['values'];
  121.         $save_values = array('username', 'employee', 'dealer');
  122.         foreach($save_values as $value){
  123.                 // set it in cstorage, the voodoo in part 3 will take care of the rest magically
  124.                 $form_state['multipage_register_obj']->$value = $submitted[$value];
  125.         }
  126. }
  127.  
  128. function multipage_register_profile_form(&$form, &$form_state){
  129.         $multipage_register = &$form_state['multipage_register_obj'];
  130.         $form['fname'] = array(
  131.                 '#type' => 'textfield',
  132.                 '#title' => 'First Name',
  133.                 '#required' => 1,
  134.                 '#default_value' => $multipage_register->fname,
  135.         );
  136.         $form['lname'] = array(
  137.                 '#type' => 'textfield',
  138.                 '#title' => 'Last Name',
  139.                 '#required' => 1,
  140.                 '#default_value' => $multipage_register->lname,
  141.         );
  142.         if($multipage_register->employee == 0 && $multipage_register->dealer == 1){
  143.                 $form['department'] = array(
  144.                         '#type' => 'textfield',
  145.                         '#title' => 'Department',
  146.                         '#required' => 1,
  147.                         '#default_value' => $multipage_register->department,
  148.                 );
  149.         }
  150.         elseif($multipage_register->dealer == 0 && $multipage_register->employee == 1){
  151.                 $form['company'] = array(
  152.                         '#type' => 'textfield',
  153.                         '#title' => 'Company',
  154.                         '#required' => 1,
  155.                         '#default_value' => $multipage_register->company,
  156.                 );
  157.         }
  158.         $form_state['no buttons'] = TRUE;
  159. }
  160.  
  161. function multipage_register_profile_form_submit(&$form, &$form_state){
  162.         $submitted = $form_state['values'];
  163.         $save_values = array('fname', 'lname','department','company');
  164.         foreach($save_values as $value){
  165.                 $form_state['multipage_register_obj']->$value = $submitted[$value];
  166.         }
  167. }
  168.  
  169.  
  170. /**
  171. *       ---------------------------- Part 3, Ctools Menu Callbacks -------------------------------
  172. */
  173. function multipage_register_basic_add_subtask_finish(&$form_state){
  174.         $multipage_register = &$form_state['multipage_register_obj'];
  175.         drupal_set_message('Wombat: '.$multipage_register->username.' First Name: '.$multipage_register->fname);
  176.         // Clear cache
  177.         ctools_object_cache_clear('multipage_register_basic',$form_state['cache name']);
  178.         $form_state['redirect'] = 'add/user';
  179. }
  180.  
  181. //callback for proceed step
  182. function multipage_register_basic_add_subtask_next(&$form_state){
  183.         $multipage_register = &$form_state['multipage_register_obj'];
  184.         $cache = ctools_object_cache_set('multipage_register_basic', $form_state['cache name'], $multipage_register);
  185. }
  186.  
  187. //callback for cancel, all it does is clear the cache
  188. function multipage_register_basic_add_subtask_cancel(&$form_state){
  189.         //Update the cache with changes.
  190.         ctools_object_cache_clear('multipage_register_basic', $form_state['cache name']);
  191.         $form_state['redirect'] = 'add/user';
  192.         drupal_set_message('You cancelled.');
  193. }
  194.  
  195. /**
  196. *       ---------------------------- Part 4, Ctools Form Storage Handlers -------------------------------
  197. */
  198. //remove an item from the object cache
  199. function multipage_register_basic_clear_page_cache($name){
  200.         ctools_object_cache_clear('multipage_register_basic', $name);
  201.         return $cache;
  202. }
  203. //get the cached changes to a given task handler
  204. function multipage_register_basic_get_page_cache($name){
  205.         $cache = ctools_object_cache_get('multipage_register_basic', $name);
  206.         return $cache;
  207. }
  208.  
  209. function d($in) {
  210.   print '<pre>';
  211.   print_r($in);
  212.   print '</pre>';
  213. }

Submit Fix

Any tags you'd like to associate with your code, delimitered by commas (example: Views, CCK, Module, etc).
Select the syntax highlighting mode to use.