2010-04-30 8 views
2

Comment allez-vous construire un formulaire étape par étape qui utilise AJAX via Drupal pour passer à l'étape suivante?AJAX dans les formulaires Drupal?

Par exemple,

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

Lorsque cette personne clique sur aime ou aime pas, je veux utiliser AJAX pour reconnaître et tirer la partie suivante de la forme, enlever/masquer la première section depuis ce n'est pas nécessaire, et présente la section suivante.

Exemple:

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


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

Quelle est la meilleure façon de le faire via l'API Form Drupal? Je sais comment construire les formulaires et les modules, mais je n'ai jamais utilisé AJAX. Je sais qu'il y a quelques choses qui sont supposées aider, mais je voulais savoir si quelqu'un ici l'a fait et comment ils l'ont abordé.

Répondre

0

Si vous ne voulez pas écrire de code et n'avez pas besoin que les données saisies soient des nœuds drupal, je suggère d'utiliser le module webform. Il a une interface utilisateur assez simple pour créer des formulaires, et vous permet de faire des formulaires multipages avec des champs conditionnels. Vous pouvez ensuite exporter les résultats au format CSV, les envoyer par e-mail, etc.

0

J'ai fait des solutions à ce problème dans drupal 7. Tout d'abord je le résous avec Ajax comme demandé (si quelqu'un veut, je peux le convertir en drupal6), cependant il devrait être préférable de résoudre ceci en utilisant l'attribut #states. Donc aussi fait une solution dans le fond en utilisant des états.

Comment résoudre ce en utilisant 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']; 
} 

est la solution ici en utilisant #states (La façon préférée de résoudre):

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; 
} 
Questions connexes