Drupal形式的Ajax?
-
02-10-2019 - |
题
您将如何构造逐步的逐步表单,该逐步形式使用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。我知道那里有一些应该有帮助的事情,但是我想知道这里是否有人做到了以及他们如何处理。
解决方案
您可能想看看 啊,助手模块.
其他提示
通常,我会用字段组创建完整的表单,然后通过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中解决了解决此问题的解决方案。首先,我按照要求(如果有人想要我可以将其转换为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;
}
不隶属于 StackOverflow