Drupal AJAX没有更改下拉列表

时间:2015-11-13 16:12:36

标签: php ajax forms drupal drupal-7

我正在使用Drupal 7的Form API处理具有依赖下拉列表的代码.ajax请求看起来像它的工作(返回状态200)并且我知道我的选项方法正在返回正确的数组但它仍然不是更改列表......这是我的代码

$m1 = drupal_map_assoc(
        array(
                7,
            )
    );
$selected;
if(isset($form_state['values']['program'])){
    $m2 = drupal_map_assoc(
        array(
            (int)$form_state['values']['program'],
        )
    );
    $selected = key($m2); 
}else{
    $selected = key($m1);
}
$form['infocollect']['program'] = array(

        '#type' => 'select',
        '#title' => t('Program'),
        '#required' => TRUE,
        '#options' => array(
            0 => t('Option 1'),
            1 => t('Option 2'),
            2 => t('Option 3'),
            3 => t('Option 4'),
            4 => t('Option 5'),
            5 => t('Option 6'),
            6 => t('Option 7'),
        ),
        '#ajax' => array(
                'callback' => 'deposit_campus_dropdown_callback',
                'wrapper' => 'dropdown-campus-replace',
                'method' =>'replaceWith',
                ),
        '#prefix' => '<tr><td>',
        '#suffix' => '</td></tr>',

);
    $form['infocollect']['campus'] = array(
        '#type' => 'select',
        '#title' => t('Campus'),
        '#required' => TRUE,
        '#prefix' => '<tr><td><div id="dropdown-campus-replace">',
        '#suffix' => '</div></td></tr></table><br />',
        '#options' => _deposit_get_campus_options($selected),
);

...

function deposit_campus_dropdown_callback($form, $form_state) {
  return $form['campus'];
}

function _deposit_get_campus_options($key='') {
   dpm($key);

   $options = array(
    0 => drupal_map_assoc(
    array(
      t('Option 1'),
    )
    ),
    1 => drupal_map_assoc(
    array(
      t('Option 1'),
    )
    ),
    6 => drupal_map_assoc(
    array(
      t('Option 1'),
    )
    ),
    4 => drupal_map_assoc(
    array(
      t('Option 1'),
      t('Option 2'),
      t('Option 3'),
      t('Option 4'),
    )
    ),
    5 => drupal_map_assoc(
    array(
      t('Option 1'),
      t('Option 2'),
      t('Option 3'),
      t('Option 4'),
    )
    ),    
    3 => drupal_map_assoc(
    array(
      t('Option 1'),
      t('Option 2'),
      t('Option 3'),
    )
    ),
    2 => drupal_map_assoc(
    array(
      t('Option 1'),
      t('Option 2'),
      t('Option 3'),
    )
    ),
    7 => drupal_map_assoc(
    array(
      t('none'),
    )
    ),
  );
  if (isset($options[$key])) {
    dpm($options[$key]);
    return $options[$key];
  }
  else {
    return array();
  }
}

更新: 我已经发现问题在于回调函数deposit_campus_dropdown_callback,它没有找到$ form [&#39;校园&#39;]或$ form [&#39; infocollect&#39;] [&#39;校园&# 39;]导致ajax不起作用,有没有办法解决这个问题?

3 个答案:

答案 0 :(得分:0)

您需要在回调中使用drupal_get_form。所以这个:

function deposit_campus_dropdown_callback($form, $form_state) { return $form['campus']; }

应该是这样的:

function deposit_campus_dropdown_callback($form, $form_state) { return drupal_get_form('campus'); }

答案 1 :(得分:0)

drupal_get_form返回表单。在ajaxcall中,我们必须返回整个表单状态值,因此您应该更改代码,如下所示:

function deposit_campus_dropdown_callback($form, &$form_state) {
  return drupal_get_form('campus');
}

答案 2 :(得分:0)

我找到了答案,我将我的回调函数修改为

  $form['infocollect']['campus'] = array(
            '#type' => 'select',
            '#title' => t('Campus'),
            '#name' => 'campus',
            '#required' => TRUE,
            '#prefix' => '<div id="dropdown-campus-replace">',
            '#suffix' => '</div>',
            '#options' => _deposit_get_campus_options($form_state['values']['program']),
    );