Включить выпадающий список с помощью вызова Ajax
Как указано в приведенном ниже коде, я попытался включить список выбора $form['answer']['answer1']
через обратный вызов AJAX, текстовое поле заполняется значением, где, поскольку выпадающий список не включается. Есть какая-нибудь помощь?
function mymodule_search_block_form($form, &$form_state) {
$options = array();
$options['key1'] = t('value1');
$options['key2'] = t('value2');
$options['key3'] = t('value3');
$options['key4'] = t('value4');
$form['profiles'] = array(
'#type' => 'select',
'#title' => 'Profiles',
'#options' => $options,
'#ajax' => array(
'callback' => 'ajax_select_callback',
'wrapper' => 'profile-wrapper',
'event' => 'change',
),
);
$form['answer']['profile_name'] = array(
'#prefix' => '<div id="profile-wrapper">',
'#type' => 'textfield',
'#title' => 'Profile Name1',
);
$form['answer']['profile_name2'] = array(
'#type' => 'textfield',
'#title' => 'Profile Name2',
);
$form['answer']['answer1'] = array(
'#type' => 'select',
'#disabled' => 1,
'#title' => 'Profiles',
'#options' => $options,
'#suffix' => '</div></br>',
);
return $form;
}
function ajax_select_callback($form, $form_state) {
$form['answer']['profile_name']['#value'] = 'Profile 1';
$form['answer']['profile_name2']['#value'] = 'Profile 2';
$form['answer']['answer1']['#disabled'] = 0;
return $form['answer'];
}
1 answers
Интересный вопрос. Как я вижу, на самом деле в этом есть две части. Это первый, конечно, ваш актуальный вопрос, и его можно легко решить:
// Your code in ajax_select_callback().
unset($form['answer']['answer1']['#attributes']['disabled']);
$form['answer']['answer1']['#disabled'] = 0;
// More of your code in ajax_select_callback().
Когда вы устанавливаете для свойства #disabled
элемента формы значение TRUE
, Drupal просто добавляет атрибут disabled
к элементу и позволяет визуализатору (т.Е. drupal_render()
) выполнять свою работу. В вашем обратном вызове AJAX переданный массив $form
является массивом отрисованной формы. Это означает, что ваш выпадающий элемент уже имеет disabled
атрибут на нем. Поэтому, когда он отображается снова, он по-прежнему отображается отключенным. Поэтому, чтобы предотвратить это, мы просто удаляем атрибут.
Однако вы могли бы заметить, что при отправке формы после этого значение выпадающего списка отключено (в $form_state['values']
) может отличаться от значения, выбранного вами после "включения". Это связано с тем, что ваша форма не перестраивается на сервере, что означает, что Drupal по-прежнему считает, что ваш выпадающий список отключен, и откажется обрабатывать ваш ввод, просто игнорируя это и использование по умолчанию. Если вы сможете воспроизвести это, прокомментируйте этот ответ, и я обновлю этот пост решением этой проблемы.