Ajax в Drupal формы?
-
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 __________
Какой лучший способ сделать это через API Drupal Form? Я знаю, как построить формы и модули, но я еще никогда не использовал Ajax. Я знаю, что несколько вещей существуют там, которые должны помочь, но я хотел знать, если кто-нибудь здесь сделал, и как они приблизились к нему.
Решение
Вы можете захотеть посмотреть на Ахах помощник модуля.
Другие советы
Обычно я создаю полную форму с помощью LiveSets, затем контролируйте их вручную jQuery.
Я предполагаю, что много готовых к модулям в Друпале, некоторые из них:
http://drupal.org/project/Conditional_fields. / http://drupal.org/project/multistep.
также: http://www.google.ru/search?q=drupal+multistep+ajax+form.
Если вы не хотите писать какой-либо код, и не нужны введенные данные, чтобы быть узлами Drupal, я предлагаю с помощью модуля WebForm. Он имеет довольно простые пользовательские интерфейсы для форм здания, и позволяет вам делать умноженные формы с условными полями. Затем вы можете экспортировать результаты как 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;
}