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..1fe25e4 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('display_offset 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.