Drupalのajax?
-
02-10-2019 - |
質問
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をまだ使用したことはありません。私は助けてくれるはずのいくつかのことがそこに存在することを知っていますが、ここで誰かがそれをやったかどうか、そして彼らがどのようにそれに近づいたかを知りたかったのです。
解決
あなたはを見てみたいかもしれません AHAHヘルパーモジュール.
他のヒント
通常、私はフィールドセットで完全なフォームを作成し、jQueryによって手動でそれらを制御します。
Drupalのモジュールに行く準備ができていることがたくさんあると思います。これらのいくつかは次のとおりです。
http://drupal.org/project/conditional_fields / http://drupal.org/project/multistep
また: http://www.google.ru/search?q = drupal+multistep+ ajax+form
コードを書きたくなく、入力されたデータをDrupalノードにする必要がない場合は、WebFormモジュールを使用することをお勧めします。フォームを構築するための非常にシンプルなUIがあり、条件付きフィールドを備えたマルチページフォームを実行できます。その後、結果をCSV、電子メールなどとしてエクスポートできます。
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;
}