<?php
/**
* Implementation of hook_menu()
*/
function multipage_register_menu(){
$items['add/user'] = array(
'title' => 'Add a user',
'page callback' => 'multipage_register_wizard',
'access arguments' => array('access content'),
);
return $items;
}
/**
* PART I CTOOLS WIZARD IMPLEMENTATION
*/
/**
* menu callback for the multistep form
* step is whatever arg one is -- and will refer to the keys listed in
* $form_info['order], and $form_info['forms'] arrays.
*/
function multipage_register_wizard(){
$step = arg(1);
//required includes for wizard
ctools_include('wizard');
ctools_include('object-cache');
//SETUP ARRAY multistep setup
$form_info = array(
'id' => 'multistep_register_basic',
'path' => 'add/user/%step',
'show trail' => TRUE,
'show back' => TRUE,
'show cancel' => true,
'show return' => false,
'next text' => 'Proceed to next step',
'next callback' => 'multipage_register_basic_add_subtask_next',
'finish callback' => 'multipage_register_basic_add_subtask_finish',
'return callback' => 'multipage_register_basic_add_subtask_finish',
'cancel callback' => 'multipage_register_basic_add_subtask_cancel',
'order' => array(
'create' => t('Step 1: Basic Information'),
'profile' => t('Step 2: User profile'),
),
'forms' => array(
'create' => array(
'form_id' => 'multipage_register_user_form'
),
'profile' => array(
'form_id' => 'multipage_register_profile_form'
),
),
);
// Setting the form up for multistep
$form_state = array(
'cache name' => NULL,
);
// no matter which step, you will load your values from the callback page
$multipage_register = multipage_register_basic_get_page_cache(NULL);
if(!$multipage_register){
// set form to first step -- there is no data
$step = current(array_keys($form_info['order']));
$multipage_register = new stdClass();
// set the storage object so its ready for whatever comes next
ctools_object_cache_set('multipage_register_basic', $form_state['cache name'], $multipage_register);
}
// this is where we store all form data
$form_state['multipage_register_obj'] = $multipage_register;
// this is magic that makes it work
$output - ctools_wizard_multistep_form($form_info, $step, $form_state);
return $output;
}
/**
* ---------------------------- Part 2, regular Form API -------------------------------
*/
function multipage_register_user_form(&$form, &$form_state){
$multipage_register = &$form_state['multipage_register_obj'];
$form['username'] = array(
'#type' => 'textfield',
'#required' => 1,
'#title' => 'Username',
'#default_value' => $multipage_register->username,
);
$form['employee'] = array(
'#type' => 'radios',
'#options' => array(
0 => 'Yes',
1 => 'No',
),
'#required' => 1,
'#title' => 'Is this user an employee?',
'#default_value' => $multipage_register->employee,
);
$form['dealer'] = array(
'#type' => 'radios',
'#options' => array(
0 => 'Yes',
1 => 'No',
),
'#required' => 1,
'#title' => 'Is this user a Dealer?',
'#default_value' => $multipage_register->employee,
);
$form_state['no buttons'] = TRUE;
}
/**
* Note that this validate callback operates exactly like it does in the regular form api
*/
function multipage_register_user_form_validate(&$form, &$form_state){
if(!isset($form_state['values']['username'])){
form_set_error('username', 'You did not enter a username');
}
}
function multipage_register_user_form_submit(&$form, &$form_state){
$submitted = $form_state['values'];
$save_values = array('username', 'employee', 'dealer');
foreach($save_values as $value){
// set it in cstorage, the voodoo in part 3 will take care of the rest magically
$form_state['multipage_register_obj']->$value = $submitted[$value];
}
}
function multipage_register_profile_form(&$form, &$form_state){
$multipage_register = &$form_state['multipage_register_obj'];
$form['fname'] = array(
'#type' => 'textfield',
'#title' => 'First Name',
'#required' => 1,
'#default_value' => $multipage_register->fname,
);
$form['lname'] = array(
'#type' => 'textfield',
'#title' => 'Last Name',
'#required' => 1,
'#default_value' => $multipage_register->lname,
);
if($multipage_register->employee == 0 && $multipage_register->dealer == 1){
$form['department'] = array(
'#type' => 'textfield',
'#title' => 'Department',
'#required' => 1,
'#default_value' => $multipage_register->department,
);
}
elseif($multipage_register->dealer == 0 && $multipage_register->employee == 1){
$form['company'] = array(
'#type' => 'textfield',
'#title' => 'Company',
'#required' => 1,
'#default_value' => $multipage_register->company,
);
}
$form_state['no buttons'] = TRUE;
}
function multipage_register_profile_form_submit(&$form, &$form_state){
$submitted = $form_state['values'];
$save_values = array('fname', 'lname','department','company');
foreach($save_values as $value){
$form_state['multipage_register_obj']->$value = $submitted[$value];
}
}
/**
* ---------------------------- Part 3, Ctools Menu Callbacks -------------------------------
*/
function multipage_register_basic_add_subtask_finish(&$form_state){
$multipage_register = &$form_state['multipage_register_obj'];
drupal_set_message('Wombat: '.$multipage_register->username.' First Name: '.$multipage_register->fname);
// Clear cache
ctools_object_cache_clear('multipage_register_basic',$form_state['cache name']);
$form_state['redirect'] = 'add/user';
}
//callback for proceed step
function multipage_register_basic_add_subtask_next(&$form_state){
$multipage_register = &$form_state['multipage_register_obj'];
$cache = ctools_object_cache_set('multipage_register_basic', $form_state['cache name'], $multipage_register);
}
//callback for cancel, all it does is clear the cache
function multipage_register_basic_add_subtask_cancel(&$form_state){
//Update the cache with changes.
ctools_object_cache_clear('multipage_register_basic', $form_state['cache name']);
$form_state['redirect'] = 'add/user';
drupal_set_message('You cancelled.');
}
/**
* ---------------------------- Part 4, Ctools Form Storage Handlers -------------------------------
*/
//remove an item from the object cache
function multipage_register_basic_clear_page_cache($name){
ctools_object_cache_clear('multipage_register_basic', $name);
return $cache;
}
//get the cached changes to a given task handler
function multipage_register_basic_get_page_cache($name){
$cache = ctools_object_cache_get('multipage_register_basic', $name);
return $cache;
}
function d($in) {
print '<pre>';
print_r($in);
print '</pre>';
}