Включить выпадающий список с помощью вызова 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'];
}
 2
Author: AjitS, 2012-12-24

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 по-прежнему считает, что ваш выпадающий список отключен, и откажется обрабатывать ваш ввод, просто игнорируя это и использование по умолчанию. Если вы сможете воспроизвести это, прокомментируйте этот ответ, и я обновлю этот пост решением этой проблемы.

 3
Author: Amarnath Ravikumar, 2012-12-24 15:26:33