diff --git a/core/modules/field/field.module b/core/modules/field/field.module index 1c3c4fb..de3f474 100644 --- a/core/modules/field/field.module +++ b/core/modules/field/field.module @@ -365,6 +365,38 @@ function field_system_info_alter(&$info, $file, $type) { } /** + * Implements hook_field_formatter_info_alter(). + */ +function field_field_formatter_info_alter(&$info) { + foreach ($info as $type => $settings) { + // Add display limit and offset setting to every formatter. + $info[$type]['settings']['display_limit'] = 0; + $info[$type]['settings']['display_offset'] = 0; + } +} + +/** + * Implements hook_field_attach_view_alter(). + */ +function field_field_attach_view_alter(&$build, $context) { + foreach (element_children($build) as $field_name) { + + $info = field_info_instance($build[$field_name]['#entity_type'], $field_name, $build[$field_name]['#bundle']); + $settings = $info['display']['default']['settings']; + + if (isset($info['display'][$context['view_mode']]['settings'])) { + $settings = $info['display'][$context['view_mode']]['settings'] + $settings; + } + + if (!empty($settings['display_limit']) || !empty($settings['display_offset'])) { + $limit = $settings['display_limit'] == '' ? 0 : $settings['display_limit']; + $offset = $settings['display_offset'] === '' ? 0 : $settings['display_offset']; + $build[$field_name]['#items'] = array_slice($build[$field_name]['#items'], $offset, $limit, TRUE); + } + } +} + +/** * Implements hook_data_type_info() to register data types for all field types. */ function field_data_type_info() { diff --git a/core/modules/field_ui/field_ui.module b/core/modules/field_ui/field_ui.module index e984b87..5654c20 100644 --- a/core/modules/field_ui/field_ui.module +++ b/core/modules/field_ui/field_ui.module @@ -358,6 +358,52 @@ function field_ui_inactive_instances($entity_type, $bundle_name = NULL) { } /** + * Implements hook_field_formatter_settings_summary_alter(). + */ +function field_ui_field_formatter_settings_summary_alter(&$summary, $context) { + if ($context['field']['cardinality'] != 1) { + $display = $context['instance']['display'][$context['view_mode']]; + if ($display['settings']['display_limit'] == 0) { + $summary .= '
' . t('Show all values'); + } + else { + $summary .= '
' . format_plural($display['settings']['display_limit'], 'Show 1 value.', 'Show @count values.'); + } + if ($display['settings']['display_offset'] != 0) { + $summary .= ' ' . format_plural($display['settings']['display_offset'], 'Skip the first value.', 'Skip the first @count values.'); + } + } +} + +/** + * Implements hook_field_formatter_settings_form_alter(). + */ +function field_ui_field_formatter_settings_form_alter(&$element, &$form_state, $context) { + if ($context['field']['cardinality'] != 1) { + $display = $context['instance']['display'][$context['view_mode']]; + $element['display_limit'] = array( + '#type' => 'number', + '#title' => 'Number of values to display', + '#default_value' => !empty($display['settings']['display_limit']) ? $display['settings']['display_limit'] : '' , + '#description' => t('Leave empty to display all values.'), + '#min' => 0, + ); + if ($context['field']['cardinality'] != FIELD_CARDINALITY_UNLIMITED) { + $element['display_limit']['#max'] = $context['field']['cardinality']; + } + $element['display_offset'] = array( + '#type' => 'number', + '#title' => 'Skip number of values', + '#default_value' => !empty($display['settings']['display_offset']) ? $display['settings']['display_offset'] : '' , + '#min' => 0, + ); + if ($context['field']['cardinality'] != FIELD_CARDINALITY_UNLIMITED) { + $element['display_limit']['#max'] = $context['field']['cardinality']; + } + } +} + +/** * Implements hook_form_FORM_ID_alter(). * * Adds a button 'Save and add fields' to the 'Create content type' form.