【发布时间】:2017-01-17 06:30:25
【问题描述】:
问题
我为自定义字段编写了一个 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 填充选择列表,因此每个 $element 中都没有“#options”。
我已经搜索了很多关于如何在钩子方法中填充级联选择列表的信息。
到目前为止,我已经有了 AJAX 回调方法来填充选择列表。 但是我看不懂这个方法。
假设我有 2 个名为“post”和“bynavn”的选择列表。对于这 2 个选择列表,我必须在钩子方法中编写以下内容:
$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 回调方法如何工作的答案,那将对我有所帮助。
提前致谢。
【问题讨论】:
标签: php drupal module drupal-7 drupal-modules