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

通常我用字段集创建完整的表单,然后通过 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 回答
1

您可能想看看AHAH 辅助模块

于 2010-05-01T17:56:13.467 回答
0

如果你不想写任何代码,并且不需要输入的数据是drupal节点,我建议使用webform模块。它有一个用于构建表单的非常简单的 UI,并允许您使用条件字段创建多页表单。然后,您可以将结果导出为 CSV、通过电子邮件发送等。

于 2012-10-26T00:41:17.337 回答
0

我已经在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;
}
于 2016-04-30T14:19:28.157 回答