Question

Comment feriez-vous construire une forme étape par étape qui utilise AJAX par Drupal pour tirer la prochaine étape du formulaire?

Par exemple,

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

Lorsque cette personne clique sur aime ou Do not Like, je veux utiliser AJAX pour reconnaître et tirer la partie suivante de la forme, supprimer / cacher la première section depuis sa non 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 Drupal formulaire? Je sais comment construire des formes et des modules, mais je ne l'ai jamais encore utilisé AJAX. Je sais que quelques choses existent là-bas qui sont censés aider, mais je voulais savoir si quelqu'un ici a fait et comment ils ont approché.

Était-ce utile?

La solution

Vous pouvez donner un coup d'oeil à la AHAH aide le module .

Autres conseils

Je suis généralement créer pleine forme avec fieldsets, puis les contrôler manuellement par jquery.
je suppose qu'il ya beaucoup de prêts à aller modules drupal, certains d'entre eux:
http://drupal.org/project/conditional_fields / http://drupal.org/project/multistep
aussi: http://www.google.ru/search?q= drupal + + multi-étapes + Ajax forme

Si vous ne voulez pas écrire de code, et ne pas besoin des données saisies pour être des noeuds Drupal, je suggère d'utiliser le module webform. Il a une interface assez simple pour des formes de construction, et vous permet faire faire des formes avec des champs conditionnels multipages. Vous pouvez ensuite exporter les résultats au format CSV, les envoyer par courriel, etc.

J'ai fait à des solutions à ce problème en premier 7. drupal je résous avec Ajax comme il a été demandé (si quelqu'un veut que je peux convertir en drupal6), mais il devrait être préférable de résoudre cela en utilisant #states d'attribut. Ainsi, a également fait une solution dans le fond en utilisant les é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'];
}

Voici la solution à l'aide #states (La meilleure façon de le 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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top