$tree) { $options[0] = '---'; // todo this might break with huge vocs $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'), ); } } } /** * Implements hook_field_info_alter(). */ function content_taxonomy_field_info_alter(&$info) { // Use own options callback for handling additional configuration options. $info['taxonomy_term_reference']['settings']['options_list_callback'] = 'content_taxonomy_allowed_values'; // Add depth option. foreach ($info['taxonomy_term_reference']['settings']['allowed_values'] as $key => $values) { $info['taxonomy_term_reference']['settings']['allowed_values'][$key]['depth'] = 0; } } /** * Returns the set of valid terms for a taxonomy field. * Extends taxonomy_allowed_values() with the tree depth option. * * @param $field * The field definition. * @return * The array of valid terms for this field, keyed by term id. */ 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; if ($terms = taxonomy_get_tree($vocabulary->vid, $tree['parent'], $max_depth)) { foreach ($terms as $term) { $options[$term->tid] = str_repeat('-', $term->depth) . $term->name; } } } } return $options; }