From 619c35992e6356f0886854d1edaba2d5c97c20dc Mon Sep 17 00:00:00 2001
From: Dries Buytaert <dries@buytaert.net>
Date: Mon, 9 Aug 2010 19:55:57 +0000
Subject: [PATCH] - Patch #812688 by andypost, Damien Tournoud: organize image
 formatters around settings.

---
 modules/image/image.field.inc      | 97 ++++++++++++++++++++----------
 modules/image/image.module         |  9 +--
 modules/image/image.test           | 11 ++--
 profiles/standard/standard.install |  6 +-
 4 files changed, 80 insertions(+), 43 deletions(-)

diff --git a/modules/image/image.field.inc b/modules/image/image.field.inc
index 9e276af761dc..59e042f4b938 100644
--- a/modules/image/image.field.inc
+++ b/modules/image/image.field.inc
@@ -428,33 +428,74 @@ function image_field_formatter_info() {
     'image' => array(
       'label' => t('Image'),
       'field types' => array('image'),
-    ),
-    'image_link_content' => array(
-      'label' => t('Image linked to content'),
-      'field types' => array('image'),
-    ),
-    'image_link_file' => array(
-      'label' => t('Image linked to file'),
-      'field types' => array('image'),
+      'settings' => array('image_style' => '', 'image_link' => ''),
     ),
   );
 
-  foreach (image_styles() as $style) {
-    $formatters['image__' . $style['name']] = array(
-      'label' => t('Image "@style"', array('@style' => $style['name'])),
-      'field types' => array('image'),
-    );
-    $formatters['image_link_content__' . $style['name']] = array(
-      'label' => t('Image "@style" linked to content', array('@style' => $style['name'])),
-      'field types' => array('image'),
-    );
-    $formatters['image_link_file__' . $style['name']] = array(
-      'label' => t('Image "@style" linked to file', array('@style' => $style['name'])),
-      'field types' => array('image'),
-    );
+  return $formatters;
+}
+
+/**
+ * Implements hook_field_formatter_settings_form().
+ */
+function image_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+
+  $image_styles = array('' => t('None (original image)')) + image_style_options(FALSE);
+  $form['image_style'] = array(
+    '#title' => t('Image style'),
+    '#type' => 'select',
+    '#default_value' => $settings['image_style'],
+    '#options' => $image_styles,
+  );
+
+  $link_types = array(
+    '' => t('<none>'),
+    'content' => t('Content'),
+    'file' => t('File'),
+  );
+  $form['image_link'] = array(
+    '#title' => t('Link image to'),
+    '#type' => 'select',
+    '#default_value' => $settings['image_link'],
+    '#options' => $link_types,
+  );
+
+  return $form;
+}
+
+/**
+ * Implements hook_field_formatter_settings_summary().
+ */
+function image_field_formatter_settings_summary($field, $instance, $view_mode) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+
+  $summary = array();
+
+  $image_styles = image_style_options(FALSE);
+  // Unset possible 'No defined styles' option.
+  unset($image_styles['']);
+  // Styles could be lost because of enabled/disabled modules that defines
+  // their styles in code.
+  if (isset($image_styles[$settings['image_style']])) {
+    $summary[] = t('Image style: @style', array('@style' => $image_styles[$settings['image_style']]));
+  }
+  else {
+    $summary[] = t('Original image');
   }
 
-  return $formatters;
+  $link_types = array(
+    'content' => t('Linked to content'),
+    'file' => t('Linked to file'),
+  );
+  // Display this setting only if image is linked.
+  if (isset($link_types[$settings['image_link']])) {
+    $summary[] = $link_types[$settings['image_link']];
+  }
+
+  return implode('<br />', $summary);
 }
 
 /**
@@ -463,17 +504,11 @@ function image_field_formatter_info() {
 function image_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
   $element = array();
 
-  // Check if the formatter involves a particular image style.
-  $matches = array();
-  if (preg_match('/__([a-z0-9_-]+)/', $display['type'], $matches)) {
-    $image_style = $matches[1];
-  }
-
   // Check if the formatter involves a link.
-  if (strpos($display['type'], 'image_link_content') === 0) {
+  if ($display['settings']['image_link'] == 'content') {
     $uri = entity_uri($entity_type, $entity);
   }
-  elseif (strpos($display['type'], 'image_link_file') === 0) {
+  elseif ($display['settings']['image_link'] == 'file') {
     $link_file = TRUE;
   }
 
@@ -487,7 +522,7 @@ function image_field_formatter_view($entity_type, $entity, $field, $instance, $l
     $element[$delta] = array(
       '#theme' => 'image_formatter',
       '#item' => $item,
-      '#image_style' => isset($image_style) ? $image_style : '',
+      '#image_style' => $display['settings']['image_style'],
       '#path' => isset($uri) ? $uri : '',
     );
   }
diff --git a/modules/image/image.module b/modules/image/image.module
index 05e19bde9295..8c40fbaa9fb3 100644
--- a/modules/image/image.module
+++ b/modules/image/image.module
@@ -365,14 +365,11 @@ function image_image_style_save($style) {
         $instance_changed = FALSE;
         foreach ($instance['display'] as $view_mode => $display) {
           // Check if the formatter involves an image style.
-          $matches = array();
-          if (preg_match('/__([a-z0-9_]+)/', $display['type'], $matches)) {
+          if ($display['type'] == 'image' && $display['settings']['image_style'] == $style['old_name']) {
             // Update display information for any instance using the image
             // style that was just deleted.
-            if ($style['old_name'] == $matches[1]) {
-              $instance['display'][$view_mode]['type'] = str_replace($style['old_name'], $style['name'], $display['type']);
-              $instance_changed = TRUE;
-            }
+            $instance['display'][$view_mode]['settings']['image_style'] = $style['name'];
+            $instance_changed = TRUE;
           }
         }
         if ($instance['widget']['settings']['preview_image_style'] == $style['old_name']) {
diff --git a/modules/image/image.test b/modules/image/image.test
index 9f0604d1d669..ec00a720915d 100644
--- a/modules/image/image.test
+++ b/modules/image/image.test
@@ -592,7 +592,8 @@ class ImageAdminStylesUnitTest extends ImageFieldTestCase {
     // Create an image field that uses the new style.
     $field_name = strtolower($this->randomName(10));
     $instance = $this->createImageField($field_name, 'article');
-    $instance['display']['default']['type'] = 'image__' . $style_name;
+    $instance['display']['default']['type'] = 'image';
+    $instance['display']['default']['settings']['image_style'] = $style_name;
     field_update_instance($instance);
 
     // Create a new node with an image attached.
@@ -662,21 +663,23 @@ class ImageFieldDisplayTestCase extends ImageFieldTestCase {
 
     // Test the image linked to file formatter.
     $instance = field_info_instance('node', $field_name, 'article');
-    $instance['display']['default']['type'] = 'image_link_file';
+    $instance['display']['default']['type'] = 'image';
+    $instance['display']['default']['settings']['image_link'] = 'file';
     field_update_instance($instance);
     $default_output = l(theme('image', $image_info), file_create_url($image_uri), array('html' => TRUE));
     $this->drupalGet('node/' . $nid);
     $this->assertRaw($default_output, t('Image linked to file formatter displaying correctly on full node view.'));
 
     // Test the image linked to content formatter.
-    $instance['display']['default']['type'] = 'image_link_content';
+    $instance['display']['default']['settings']['image_link'] = 'content';
     field_update_instance($instance);
     $default_output = l(theme('image', $image_info), 'node/' . $nid, array('html' => TRUE, 'attributes' => array('class' => 'active')));
     $this->drupalGet('node/' . $nid);
     $this->assertRaw($default_output, t('Image linked to content formatter displaying correctly on full node view.'));
 
     // Test the image style 'thumbnail' formatter.
-    $instance['display']['default']['type'] = 'image__thumbnail';
+    $instance['display']['default']['settings']['image_link'] = '';
+    $instance['display']['default']['settings']['image_style'] = 'thumbnail';
     field_update_instance($instance);
     // Ensure the derrivative image is generated so we do not have to deal with
     // image style callback paths.
diff --git a/profiles/standard/standard.install b/profiles/standard/standard.install
index 8e1a985d2dcb..2881602b0687 100644
--- a/profiles/standard/standard.install
+++ b/profiles/standard/standard.install
@@ -384,12 +384,14 @@ function standard_install() {
     'display' => array(
       'default' => array(
         'label' => 'hidden',
-        'type' => 'image__large',
+        'type' => 'image',
+        'settings' => array('image_style' => 'large', 'image_link' => ''),
         'weight' => -1,
       ),
       'teaser' => array(
         'label' => 'hidden',
-        'type' => 'image_link_content__medium',
+        'type' => 'image',
+        'settings' => array('image_style' => 'medium', 'image_link' => 'content'),
         'weight' => -1,
       ),
     ),
-- 
GitLab