【问题标题】:Drupal AJAX not changing dropdown listDrupal AJAX 不改变下拉列表
【发布时间】:2016-02-15 06:59:52
【问题描述】:

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

$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 中,它没有找到导致 ajax 无法工作的 $form['campus'] 或 $form['infocollect']['campus'] ,有没有解决这个问题的方法?

【问题讨论】:

    标签: php ajax forms drupal drupal-7


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 好的,我尝试添加这个,但它似乎使 php 崩溃,因为校园选项消失了,虽然我已经找到了另一个解决方案
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-15
        • 1970-01-01
        • 2015-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多