diff --git a/core/modules/taxonomy/taxonomy.module b/core/modules/taxonomy/taxonomy.module index 23a0a6b..f6e25bd 100644 --- a/core/modules/taxonomy/taxonomy.module +++ b/core/modules/taxonomy/taxonomy.module @@ -29,6 +29,20 @@ const TAXONOMY_HIERARCHY_MULTIPLE = 2; */ /** + * Gets all view modes for taxonomy_terms. + * + * @return array + * View mode labels, indexed by view mode machine name. + */ +function _taxonomy_get_view_modes() { + $info = entity_get_info('taxonomy_term'); + foreach ($info['view modes'] as $mode => $mode_info) { + $modes[$mode] = $mode_info['label']; + } + return $modes; +} + +/** * Implements hook_help(). */ function taxonomy_help($path, $arg) { @@ -121,11 +135,14 @@ function taxonomy_entity_info() { ), 'bundles' => array(), 'view modes' => array( - // @todo View mode for display as a field (when attached to nodes etc). 'full' => array( 'label' => t('Taxonomy term page'), 'custom settings' => FALSE, ), + 'term_reference_field' => array( + 'label' => t('Term reference field'), + 'custom settings' => TRUE, + ), ), ), ); @@ -1513,10 +1530,58 @@ function taxonomy_field_formatter_info() { 'label' => t('RSS category'), 'field types' => array('taxonomy_term_reference'), ), + 'taxonomy_term_reference_term' => array( + 'label' => t('Rendered term'), + 'field types' => array('taxonomy_term_reference'), + 'settings' => array( + 'term view mode' => 'term_reference_field', + ), + ), ); } /** + * Implements hook_field_formatter_settings_form(). + * + * Expose the choice of view mode on the referenced terms. + */ +function taxonomy_field_formatter_settings_form($field, $instance, $view_mode, $form, $form_state) { + $display = $instance['display'][$view_mode]; + $settings = $display['settings']; + $element = array(); + + if ($display['type'] == 'taxonomy_term_reference_term') { + $element['term view mode'] = array( + '#description' => t('View mode for rendered term'), + '#type' => 'select', + '#options' => _taxonomy_get_view_modes('taxonomy_term'), + '#default_value' => $settings['term view mode'], + '#required' => TRUE, + ); + } + + return $element; +} + + +/** + * Implements hook_field_formatter_settings_summary(). + */ +function taxonomy_field_formatter_settings_summary($field, $instance, $view_mode) { + $display = $instance['display'][$view_mode]; + if ($display['type'] == 'taxonomy_term_reference_term') { + $settings = $display['settings']; + $modes = _taxonomy_get_view_modes('taxonomy_term'); + $mode = $settings['term view mode']; + $summary = t('View mode: %mode', array('%mode' => $modes[$mode])); + } + else { + $summary = ''; + } + return $summary; +} + +/** * Implements hook_field_formatter_view(). */ function taxonomy_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) { @@ -1567,6 +1632,16 @@ function taxonomy_field_formatter_view($entity_type, $entity, $field, $instance, ); } break; + + case 'taxonomy_term_reference_term': + $view_mode = $display['settings']['term view mode']; + foreach ($items as $delta => $item) { + // Handle previews of new tags + $element[$delta] = ($item['tid'] == 'autocreate') + ? array('#markup' => check_plain($item['name'])) + : taxonomy_term_view($item['taxonomy_term'], $view_mode, $langcode); + } + break; } return $element;