2010-04-30 3 views
2

Как вы собираетесь создавать пошаговую форму, которая использует AJAX через Drupal, чтобы вытащить следующий шаг формы?AJAX в форматах Drupal?

Например,

Step 1: 
    I like Baseball 
    I don't like Baseball. 

Когда этот человек нажимает на любом нравится или не нравится, я хочу использовать AJAX для распознавания и вытаскивать следующую часть формы, удалить/скрыть первый раздел, так его не нужно, и представить следующий раздел.

Пример:

Step 1: 
    I like Baseball 
    *click 
(fade out) 


Step 2: 
    My favorite team is __________ 
    The player I like most is __________ 

Что такое лучший способ сделать это через Drupal Form API? Я знаю, как создавать формы и модули, но я еще не использовал AJAX. Я знаю, что существует несколько вещей, которые должны помочь, но я хотел знать, сделал ли кто-нибудь здесь это и как они подошли к нему.

ответ

0

Если вы не хотите писать какой-либо код и не нужны введенные данные, чтобы быть узлами drupal, я предлагаю использовать модуль webform. Он имеет довольно простой интерфейс для создания форм и позволяет делать многостраничные формы с условными полями. Затем вы можете экспортировать результаты в CSV, отправить их по электронной почте и т. Д.

0

Я решил решить эту проблему в Drupal 7. Сначала я решил ее с помощью Ajax, как было запрошено (если кто-то хочет, я могу преобразовать это в drupal6), однако лучше решить это, используя атрибут #states. Так же было сделано решение в нижней части с использованием состояний.

Как решить это с помощью Ajax:

function ajax_in_drupal_form($form, &$form_state) 
{ 
    $baseball = array(
     'like' => t('I like Baseball'), 
     'unlike' => t('I don\'t like Baseball') 
    ); 

    $form['step'] = array(
     '#prefix' => '<div id="baseball-wrapper">', 
     '#suffix' => '</div>', 
    ); 

    if ($form_state['values']['baseball'] == 'like') { 
     $form['step']['team'] = array(
      '#type' => 'textfield', 
      '#title' => t('My favorite team is'), 

     ); 
     $form['step']['player'] = array(
      '#type' => 'textfield', 
      '#title' => t('The player I like most is'), 
     ); 
    } 
    else if ($form_state['values']['baseball'] == 'unlike') { 
     $form['step']['other'] = array(
      '#type' => 'textfield', 
      '#title' => t('What do you like'), 
     ); 
    } 
    else { 
     $form['step']['baseball'] = array(
      '#type' => 'radios', 
      '#options' => $baseball, 
      '#title' => t('Select your option'), 
      '#ajax' => array(
       'callback' => 'ajax_update_step_callback', 
       'wrapper' => 'baseball-wrapper', 
      ), 
     ); 
    } 

    return $form; 
} 

function ajax_update_step_callback($form, $form_state) { 
    return $form['step']; 
} 

Вот решение с использованием #states (предпочтительный способ ее решения):

function states_in_drupal_form($form, &$form_state) 
{ 
    $baseball = array(
     'like' => t('I like Baseball'), 
     'unlike' => t('I don\'t like Baseball') 
    ); 

    // step 1 
    $form['step']['baseball'] = array(
     '#type' => 'radios', 
     '#options' => $baseball, 
     '#title' => t('Select your option'), 
     '#states' => array(
      'invisible' => array(':input[name="baseball"]' => array('checked' => TRUE), 
      ), 
     ) 

    ); 

    // step 2 like baseball 
    $form['step']['team'] = array(
     '#type' => 'textfield', 
     '#title' => t('My favorite team is'), 
     '#states' => array(
      'visible' => array(':input[name="baseball"]' => array('checked' => TRUE)), 
      'visible' => array(':input[name="baseball"]' => array('value' => 'like')), 
     ) 
    ); 
    $form['step']['player'] = array(
     '#type' => 'textfield', 
     '#title' => t('The player I like most is'), 
     '#states' => array(
      'visible' => array(':input[name="baseball"]' => array('checked' => TRUE)), 
      'visible' => array(':input[name="baseball"]' => array('value' => 'like')), 
     ) 
    ); 

    // step 2 I don't like baseball 
    $form['step']['other'] = array(
     '#type' => 'textfield', 
     '#title' => t('What do you like'), 
     '#states' => array(
      'visible' => array(':input[name="baseball"]' => array('checked' => TRUE)), 
      'visible' => array(':input[name="baseball"]' => array('value' => 'unlike')), 
     ) 
    ); 

    return $form; 
} 
Смежные вопросы