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']),
);
我正在使用 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']),
);