2

Drupal を介して AJAX を使用して次のフォーム ステップをプルするステップ バイ ステップ フォームを構築するにはどうすればよいでしょうか?

例えば、

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 はまだ使用したことがありません。役立つと思われるものがいくつか存在することは知っていますが、ここに誰かがそれを行ったかどうか、そして彼らがどのようにアプローチしたかを知りたいと思いました.

4

4 に答える 4

1

AHAH ヘルパー モジュールを参照してください。

于 2010-05-01T17:56:13.467 に答える
1

通常、フィールドセットを使用して完全なフォームを作成し、jquery で手動で制御します。
drupal にはすぐに使えるモジュールがたくさんあると思いますが、そのうちのいくつか:
http://drupal.org/project/conditional_fields / http://drupal.org/project/multistep
また: http://www.google.ru /search?q=drupal+multistep+ajax+form

于 2010-05-01T00:13:34.150 に答える
0

コードを書きたくない場合、および入力したデータを drupal ノードにする必要がない場合は、webform モジュールを使用することをお勧めします。フォームを作成するための非常にシンプルな UI を備えており、条件付きフィールドを使用して複数ページのフォームを作成できます。その後、結果を CSV としてエクスポートしたり、メールで送信したりできます。

于 2012-10-26T00:41:17.337 に答える
0

私は drupal 7 でこの問題を解決しました。最初に要求されたように Ajax で解決しました (誰かがこれを drupal6 に変換したい場合)。そのため、状態を使用して下部のソリューションも作成しました。

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;
}
于 2016-04-30T14:19:28.157 に答える