Drupal AJAX 未更改下拉列表

Drupal AJAX not changing dropdown list

我正在使用 Drupal 7 的表单 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['campus'] 或 $form['infocollect']['campus'] 这是导致 ajax 无法正常工作,有什么办法可以解决这个问题吗?

您需要在回调中使用 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'); }

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

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

我已经找到答案了,我把我的回调函数修改成这个

  $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']),
    );