Каскадный список выбора как настраиваемое поле с использованием hook_field_widget_form в drupal 7

проблема

Я написал специальный модуль Drupal для настраиваемого поля. Поле содержит три каскадных списка выбора. Я заполняю списки, используя javascript.

Теперь мне нужно заполнить его внутри hook_field_widget_form.

Мой hook_field_widget_form выглядит следующим образом:

/** * Implements hook_field_widget_form(). */ function custom_select_list_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) { $node = menu_get_object(); $division = isset($node->field_division_custom_select['und'][0]['division']) ? $node->field_division_custom_select['und'][0]['division'] : ''; $district = isset($node->field_division_custom_select['und'][0]['district']) ? $node->field_division_custom_select['und'][0]['district'] : ''; $thana = isset($node->field_division_custom_select['und'][0]['thana']) ? $node->field_division_custom_select['und'][0]['thana'] : ''; drupal_add_js(array('custom_select_list' => array('division' => $division, 'district' => $district, 'thana' => $thana )), array('type' => 'setting')); switch ($instance['widget']['type']) { case 'custom_field_widget' : $element['custom_select_field'] = array( '#type' => 'fieldset', '#title' => $element['#title'], '#tree' => TRUE, ); $element['custom_select_field']['division'] = array( '#type' => 'select', '#title' => t('Division'), '#default_value' => isset($items[$delta]['division']) ? $items[$delta]['division'] : isset($node->field_division_custom_select['und'][0]['division']) ? $node->field_division_custom_select['und'][0]['division'] : '', '#required' => $element['#required'], '#id' => 'division-select-list', '#attributes' => array('class' => array('selectpicker'), 'title' => t('Thana') ), ); $element['custom_select_field']['district'] = array( '#type' => 'select', '#title' => t('District'), '#default_value' => isset($items[$delta]['district']) ? $items[$delta]['district'] : isset($node->field_division_custom_select['und'][0]['district']) ? $node->field_division_custom_select['und'][0]['district'] : '', '#required' => $element['#required'], '#id' => 'district-select-list', '#attributes' => array( 'class' => array('selectpicker'), 'title' => t('Thana') ), ); $element['custom_select_field']['thana'] = array( '#type' => 'select', '#title' => t('Thana'), '#default_value' => isset($items[$delta]['thana']) ? $items[$delta]['thana'] : isset($node->field_division_custom_select['und'][0]['thana']) ? $node->field_division_custom_select['und'][0]['thana'] : '', '#required' => $element['#required'], '#id' => 'thana-select-list', '#attributes' => array('class' => array('selectpicker'), 'title' => t('Thana') ), ); break; } return $element; } 

Поскольку я заполняю списки выбора с помощью javascript, в каждом элементе $ нет '#options'.

Я много искал, как заполнять каскадные списки выбора внутри метода hook.

Пока у меня есть метод обратного вызова AJAX для заполнения списков избранного. Но я не мог понять этот метод.

Предположим, у меня есть 2 списка выбора с именем «post» и «bynavn». для этих 2 списков выбора я должен написать следующее в методе hook:

 $element['post'] = array( '#type' => 'select', '#title' => t('post'), '#default_value' => isset($items[$delta]['post']) ? $items[$delta]['post'] : NULL, '#options' => array( '1' => 'One', '2' => 'Two', ), '#ajax' => array( 'callback' => 'dad_test_callback', 'wrapper' => 'test-div', ), ); $element['bynavn'] = array( '#type' => 'select', '#title' => t('Bynavn'), '#prefix' => '<div id="test-div">', '#suffix' => '</div>', '#default_value' => isset($items[$delta]['bynavn']) ? $items[$delta]['bynavn'] : NULL, ); 

и функция обратного вызова выглядит следующим образом:

 function dad_test_callback($form, $form_state) { $field_name = $form_state['custom_select_list']['field_data']['field_name']; $delta = $form_state['custom_select_list']['field_data']['delta']; $langcode = $form_state['custom_select_list']['field_data']['langcode']; $arr = array( '3' => 'Two', '1' => 'one', '2' => 'Three', ); $form[$field_name][$langcode][$delta]['bynavn']['#options'] = $arr; return $form[$field_name][$langcode][$delta]['bynavn']; } 

Но он не может заполнить второй список выбора.

Если кто-то даст мне ссылку на соответствующую документацию или даст ответ, объясняющий, как работает метод обратного вызова AJAX, это было бы полезно для меня.

заранее спасибо.

Я сам решил эту проблему. В предыдущей версии –

  1. Я создал начальный список выбора без «#options» в функции «hook_field_widget_form».

  2. Я заполнил список разделов, используя javascript. Затем после выбора подразделения я заполнил список районов и аналогично заполненный список, выбрав район.

Сгенерированная ошибка при отправке формы.

Теперь –

Я объявила первоначальный список отделов, список округов и список Thana внутри функции «custom_select_list_field_widget_form».

 $division_arr = array( '1' => 'Division 1', '2' => 'Division 2', '3' => 'Division 3', '4' => 'Division 4', '5' => 'Division 5', ); $district_arr = array( '1' => 'District 1', '2' => 'District 2', '3' => 'District 3', '4' => 'District 4', '5' => 'District 5', ); $thana_arr = array( '1' => 'Thana 1', '2' => 'Thana 2', '3' => 'Thana 3', '4' => 'Thana 4', '5' => 'Thana 5', );