Drupal Ctools Form Wizard in a Block
Posted
by Iamjon
on Stack Overflow
See other posts from Stack Overflow
or by Iamjon
Published on 2010-05-13T12:26:43Z
Indexed on
2010/05/13
12:34 UTC
Read the original article
Hit count: 285
Hi everyone I created a custom module that has a Ctools multi step form. It's basically a copy of http://www.nicklewis.org/using-chaos-tools-form-wizard-build-multistep-forms-drupal-6.
The form works. I can see it if I got to the url i made for it.
For the life of me I can't get the multistep form to show up in a block.
Any clues?
/** * Implementation of hook_block() * */
function mycrazymodule_block($op='list', $delta=0, $edit=array()) { switch ($op) { case 'list': $blocks[0]['info'] = t('SFT Getting Started'); $blocks[1]['info'] = t('SFT Contact US'); $blocks[2]['info'] = t('SFT News Letter'); return $blocks; case 'view': switch ($delta){ case '0': $block['subject'] = t('SFT Getting Started Subject'); $block['content'] = mycrazymodule_wizard(); break; case '1': $block['subject'] = t('SFT Contact US Subject'); $block['content'] = t('SFT Contact US content'); break; case '2': $block['subject'] = t('SFT News Letter Subject'); $block['content'] = t('SFT News Letter cONTENT'); break; } return $block;
} }
/** * Implementation of hook_menu(). */ function mycrazymodule_menu() { $items['hellocowboy'] = array( 'title' => 'Two Step Form', 'page callback' => 'mycrazymodule_wizard', 'access arguments' => array('access content') ); return $items; }
/** * 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 mycrazymodule_wizard() { $step = arg(1); // required includes for wizard $form_state = array(); ctools_include('wizard'); ctools_include('object-cache');
// The array that will hold the two forms and their options $form_info = array( 'id' => 'getting_started', 'path' => "hellocowboy/%step", 'show trail' => FALSE, 'show back' => FALSE, 'show cancel' => false, 'show return' =>false, 'next text' => 'Submit', 'next callback' => 'getting_started_add_subtask_next', 'finish callback' => 'getting_started_add_subtask_finish', 'return callback' => 'getting_started_add_subtask_finish', 'order' => array( 'basic' => t('Step 1: Basic Info'), 'lecture' => t('Step 2: Choose Lecture'), ), 'forms' => array( 'basic' => array( 'form id' => 'basic_info_form' ), 'lecture' => array( 'form id' => 'choose_lecture_form' ), ), );
$form_state = array(
'cache name' => NULL,
);
// no matter the step, you will load your values from the callback page
$getstart = getting_started_get_page_cache(NULL);
if (!$getstart) {
// set form to first step -- we have no data
$step = current(array_keys($form_info['order']));
$getstart = new stdClass();
//create cache
ctools_object_cache_set('getting_started', $form_state['cache name'], $getstart);
//print_r($getstart);
}
//THIS IS WHERE WILL STORE ALL FORM DATA
$form_state['getting_started_obj'] = $getstart;
// and this is the witchcraft that makes it work $output = ctools_wizard_multistep_form($form_info, $step, $form_state); return $output; }
function basic_info_form(&$form, &$form_state){
$getstart = &$form_state['getting_started_obj'];
$form['firstname'] = array(
'#weight' => '0',
'#type' => 'textfield',
'#title' => t('firstname'),
'#size' => 60,
'#maxlength' => 255,
'#required' => TRUE,
);
$form['lastname'] = array( '#weight' => '1', '#type' => 'textfield', '#title' => t('lastname'), '#required' => TRUE, '#size' => 60, '#maxlength' => 255, );
$form['phone'] = array( '#weight' => '2', '#type' => 'textfield', '#title' => t('phone'), '#required' => TRUE, '#size' => 60, '#maxlength' => 255, );
$form['email'] = array( '#weight' => '3', '#type' => 'textfield', '#title' => t('email'), '#required' => TRUE, '#size' => 60, '#maxlength' => 255, );
$form['newsletter'] = array( '#weight' => '4', '#type' => 'checkbox', '#title' => t('I would like to receive the newsletter'), '#required' => TRUE, '#return_value' => 1, '#default_value' => 1, ); $form_state['no buttons'] = TRUE; }
function basic_info_form_validate(&$form, &$form_state){ $email = $form_state['values']['email']; $phone = $form_state['values']['phone']; if(valid_email_address($email) != TRUE){ form_set_error('Dude you have an error', t('Where is your email?')); } //if (strlen($phone) > 0 && !ereg('^[0-9]{1,3}-[0-9]{3}-[0-9]{3,4}-[0-9]{3,4}$', $phone)) { //form_set_error('Dude the phone', t('Phone number must be in format xxx-xxx-nnnn-nnnn.')); //} }
function basic_info_form_submit(&$form, &$form_state){ //Grab the variables $firstname =check_plain ($form_state['values']['firstname']); $lastname = check_plain ($form_state['values']['lastname']); $email = check_plain ($form_state['values']['email']); $phone = check_plain ($form_state['values']['phone']); $newsletter = $form_state['values']['newsletter'];
//Send the form and Grab the lead id $leadid = send_first_form($lastname, $firstname, $email,$phone, $newsletter);
//Put into form $form_state['getting_started_obj']->firstname = $firstname; $form_state['getting_started_obj']->lastname = $lastname; $form_state['getting_started_obj']->email = $email; $form_state['getting_started_obj']->phone = $phone; $form_state['getting_started_obj']->newsletter = $newsletter; $form_state['getting_started_obj']->leadid = $leadid;
}
function choose_lecture_form(&$form, &$form_state){
$one = 'event 1' $two = 'event 2' $three = 'event 3' $getstart = &$form_state['getting_started_obj'];
$form['lecture'] = array( '#weight' => '5', '#default_value' => 'two', '#options' => array( 'one' => $one, 'two' => $two, 'three' => $three, ), '#type' => 'radios', '#title' => t('Select Workshop'), '#required' => TRUE, );
$form['attendees'] = array( '#weight' => '6', '#default_value' => 'one', '#options' => array( 'one' => t('I will be arriving alone'), 'two' =>t('I will be arriving with a guest'), ), '#type' => 'radios', '#title' => t('Attendees'), '#required' => TRUE, );
$form_state['no buttons'] = TRUE; }
/** * Same idea as previous steps submit * */ function choose_lecture_form_submit(&$form, &$form_state) {
$workshop = $form_state['values']['lecture']; $leadid = $form_state['getting_started_obj']->leadid; $attendees = $form_state['values']['attendees'];
$form_state['getting_started_obj']->lecture = $workshop; $form_state['getting_started_obj']->attendees = $attendees;
send_second_form($workshop, $attendees, $leadid); }
/*----PART 3 CTOOLS CALLBACKS -- these usually don't have to be very unique ---------------------- */
/** * Callback generated when the add page process is finished. * this is where you'd normally save. */ function getting_started_add_subtask_finish(&$form_state) { dpm($form_state); $getstart = &$form_state['getting_started_obj'];
drupal_set_message('mycrazymodule '.$getstart->name.' successfully deployed' ); //Get id // Clear the cache ctools_object_cache_clear('getting_started', $form_state['cache name']); $form_state['redirect'] = 'hellocowboy'; }
/** * Callback for the proceed step * */ function getting_started_add_subtask_next(&$form_state) { dpm($form_state); $getstart = &$form_state['getting_started_obj']; $cache = ctools_object_cache_set('getting_started', $form_state['cache name'], $getstart);
}
/*----PART 4 CTOOLS FORM STORAGE HANDLERS -- these usually don't have to be very unique ---------------------- */
/** * Remove an item from the object cache. */ function getting_started_clear_page_cache($name) { ctools_object_cache_clear('getting_started', $name); }
/** * Get the cached changes to a given task handler. */ function getting_started_get_page_cache($name) { $cache = ctools_object_cache_get('getting_started', $name); return $cache; }
//Salesforce Functions function send_first_form($lastname, $firstname,$email,$phone, $newsletter){ $send = array("LastName" => $lastname , "FirstName" => $firstname, "Email" => $email ,"Phone" => $phone , "Newsletter__c" =>$newsletter ); $sf = salesforce_api_connect(); $response = $sf->client->create(array($send), 'Lead'); dpm($response); return $response->id;
}
function send_second_form($workshop, $attendees, $leadid){
$send = array("Id" => $leadid , "Number_Of_Pepole__c" => "2" );
$sf = salesforce_api_connect();
$response = $sf->client->update(array($send), 'Lead');
dpm($response, 'the final response');
return $response->id;
}
© Stack Overflow or respective owner