【问题标题】:AJAX in Drupal Forms?Drupal 表单中的 AJAX?
【发布时间】:2010-04-30 15:37:01
【问题描述】:

您将如何构建一个通过 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。我知道有些事情应该会有所帮助,但我想知道这里是否有人做过,以及他们是如何做到的。

【问题讨论】:

    标签: drupal drupal-6 drupal-fapi drupal-forms drupal-ajax


    【解决方案1】:

    您可能想看看AHAH helper module

    【讨论】:

      【解决方案2】:

      通常我用字段集创建完整的表单,然后通过 jquery 手动控制它们。
      我认为 drupal 中有很多准备就绪的模块,其中一些:
      http://drupal.org/project/conditional_fields / http://drupal.org/project/multistep
      还有:http://www.google.ru/search?q=drupal+multistep+ajax+form

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          我已经在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;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-02-13
            • 1970-01-01
            • 2016-04-10
            相关资源
            最近更新 更多