AJAX в формах Drupal? - PullRequest
       39

AJAX в формах Drupal?

2 голосов
/ 30 апреля 2010

Как бы вы пошли на создание пошаговой формы, которая использует 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. Я знаю, что существует несколько вещей, которые должны помочь, но я хотел знать, делал ли кто-то здесь это и как они к этому приблизились.

Ответы [ 4 ]

1 голос
/ 01 мая 2010

Возможно, вы захотите взглянуть на вспомогательный модуль AHAH .

1 голос
/ 01 мая 2010

обычно я создаю полную форму с наборами полей, а затем управляю ими вручную с помощью jquery.
Я предполагаю, что в Drupal есть много готовых модулей, некоторые из них:
http://drupal.org/project/conditional_fields / http://drupal.org/project/multistep
также: http://www.google.ru/search?q=drupal+multistep+ajax+form

0 голосов
/ 30 апреля 2016

Я принял решение для этой проблемы в 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;
}
0 голосов
/ 26 октября 2012

Если вы не хотите писать какой-либо код и не хотите, чтобы введенные данные были узлами drupal, я предлагаю использовать модуль webform. Он имеет довольно простой пользовательский интерфейс для создания форм и позволяет создавать многостраничные формы с условными полями. Затем вы можете экспортировать результаты в формате CSV, отправить их по электронной почте и т. Д.

...