Drupal Ctools 块中的表单向导

发布于 2024-09-01 13:29:05 字数 8966 浏览 9 评论 0原文

我创建了一个具有 Ctools 多步骤表单的自定义模块。它基本上是 http:// /www.nicklewis.org/using-chaos-tools-form-wizard-build-multistep-forms-drupal-6

该表格有效。如果我到达我为其创建的网址,我就可以看到它。

对于我的一生,我无法让多步骤表单显示在一个块中。

有什么线索吗?

/**
* 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;

}

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;

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

_蜘蛛 2024-09-08 13:29:05

假设您已从管理员启用该阻止。要快速检查该块是否确实在您正在查看的页面上呈现,请尝试从块回调中返回测试字符串以及呈现的表单。

如果这不起作用,请尝试从admin/settings/performance中清除缓存,然后重试。如果我没记错的话,块默认是被缓存的。让我们看看它是否会出现。

Am assuming you have enabled the block from admin. To do a quick check that the block is indeed getting rendered on the page you are looking at, try returning a test string along with your rendered form, from your block callback.

If that doesn't work, try clearing your cache from admin/settings/performance and try again. If I am not wrong, blocks are cached by default. Let us see if it shows up then.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文