View source
<?php
function content_taxonomy_form_field_ui_field_edit_form_alter(&$form, &$form_state, $form_id) {
$field = $form['#field'];
$instance = $form['#instance'];
if ($field['type'] == 'taxonomy_term_reference' && $instance['widget']['type'] != 'taxonomy_autocomplete' && $instance['widget']['type'] != 'autocomplete_deluxe_taxonomy' && $instance['widget']['type'] != 'entityreference_autocomplete' && $instance['widget']['type'] != 'entityreference_autocomplete_tags') {
foreach ($field['settings']['allowed_values'] as $delta => $tree) {
$options[0] = '---';
$voc = taxonomy_vocabulary_machine_name_load($tree['vocabulary']);
foreach (taxonomy_get_tree($voc->vid) as $term) {
$options[$term->tid] = str_repeat('- ', $term->depth) . $term->name;
}
$form['field']['settings']['allowed_values'][$delta]['parent'] = array(
'#type' => 'select',
'#title' => t('Parent'),
'#options' => $options,
'#default_value' => isset($tree['parent']) ? $tree['parent'] : 0,
);
$form['field']['settings']['allowed_values'][$delta]['depth'] = array(
'#type' => 'textfield',
'#title' => t('Tree depth'),
'#default_value' => isset($tree['depth']) ? $tree['depth'] : '',
'#description' => t('Set the depth of the tree. Leave empty to load all terms.'),
'#element_validate' => array(
'_element_validate_integer_positive',
),
);
}
}
if ($field['type'] == 'taxonomy_term_reference' && $instance['widget']['type'] == 'options_select') {
$form['instance']['widget']['settings']['content_taxonomy_opt_groups'] = array(
'#type' => 'checkbox',
'#title' => t('Render parent terms as opt-groups'),
'#default_value' => isset($instance['widget']['settings']['content_taxonomy_opt_groups']) ? $instance['widget']['settings']['content_taxonomy_opt_groups'] : FALSE,
'#description' => t('This option only works if you have a 2-level hierarchy in your vocabulary. Then the parents in the first level get opt-groups and the child terms will be selectable.'),
);
}
}
function content_taxonomy_field_info_alter(&$info) {
$info['taxonomy_term_reference']['settings']['options_list_callback'] = 'content_taxonomy_allowed_values';
foreach ($info['taxonomy_term_reference']['settings']['allowed_values'] as $key => $values) {
$info['taxonomy_term_reference']['settings']['allowed_values'][$key]['depth'] = 0;
}
}
function content_taxonomy_allowed_values($field) {
$options = array();
foreach ($field['settings']['allowed_values'] as $tree) {
if ($vocabulary = taxonomy_vocabulary_machine_name_load($tree['vocabulary'])) {
$max_depth = isset($tree['depth']) && !empty($tree['depth']) ? $tree['depth'] : NULL;
$terms = content_taxonomy_get_terms($field, $vocabulary, $tree['parent'], $max_depth);
if (!empty($terms) && is_array($terms)) {
foreach ($terms as $term) {
$options[$term->tid] = str_repeat('- ', $term->depth) . $term->name;
}
}
}
}
return $options;
}
function content_taxonomy_get_terms($field, $vocabulary, $parent, $max_depth) {
$terms = array();
$tree_callback = 'taxonomy_get_tree';
drupal_alter('content_taxonomy_tree_callback', $tree_callback, $field, $vocabulary);
if (function_exists($tree_callback)) {
$terms = $tree_callback($vocabulary->vid, $parent, $max_depth, FALSE);
}
return $terms;
}
function content_taxonomy_field_widget_info_alter(&$info) {
if (isset($info['options_select']['settings'])) {
$info['options_select']['settings'] += array(
'content_taxonomy_opt_groups' => FALSE,
);
}
}
function content_taxonomy_field_widget_form_alter(&$element, &$form_state, $context) {
$field = $context['field'];
$instance = $context['instance'];
if (!empty($instance['widget']['settings']['content_taxonomy_opt_groups'])) {
$options = content_taxonomy_allowed_values_opt_groups($field);
if (isset($element['#options']['_none'])) {
$options = array(
'_none' => $element['#options']['_none'],
) + $options;
}
$element['#options'] = $options;
}
}
function content_taxonomy_allowed_values_opt_groups($field) {
$options = array();
foreach ($field['settings']['allowed_values'] as $tree) {
if ($vocabulary = taxonomy_vocabulary_machine_name_load($tree['vocabulary'])) {
$terms = content_taxonomy_get_terms($field, $vocabulary, 0, 2);
if (!empty($terms) && is_array($terms)) {
$current_group_term = NULL;
foreach ($terms as $term) {
if ($term->depth == 0) {
$current_group_term = $term;
}
elseif ($term->depth == 1 && !is_null($current_group_term)) {
$options[$current_group_term->name][$term->tid] = $term->name;
}
}
}
}
}
return $options;
}